はじめに
ども、ガチャつく野郎2.0(@_tamitom)です。
早速ですが、TeamsにAWSの利用料金を毎日に自動通知する仕組みを紹介したいと思います。
Slackへの通知は、ググると結構あるんですが、Teamsはほぼ無いので参考になると幸いです。
ガチャつき方
TeamsのIncoming Webhookを使用するので、有効化は下記を参考にしておいてください。
今回参考にさせて頂いたのは下記の記事です。
LambdaのコードのみTeamsに通知できる様に変更しました。
var aws = require('aws-sdk'); var url = require('url'); var https = require('https'); var hookUrl, slackChannel; var cloudwatch = new aws.CloudWatch({region: 'us-east-1', endpoint: 'http://monitoring.us-east-1.amazonaws.com'}); hookUrl = '<Teams Incoming Webhook URL>'; var postMessage = function(message, callback) { var body = JSON.stringify(message); var options = url.parse(hookUrl); options.method = 'POST'; options.headers = { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(body), }; var postReq = https.request(options, function(res) { var chunks = []; res.setEncoding('utf8'); res.on('data', function(chunk) { return chunks.push(chunk); }); res.on('end', function() { var body = chunks.join(''); if (callback) { callback({ body: body, statusCode: res.statusCode, statusMessage: res.statusMessage }); } }); return res; }); postReq.write(body); postReq.end(); }; exports.handler = function(event, context) { console.log('Start checking cloudwatch billing info.'); var startDate = new Date(); startDate.setDate(startDate.getDate() - 1); // get yesterday. var params = { MetricName: 'EstimatedCharges', Namespace: 'AWS/Billing', Period: 86400, /* 1 day */ StartTime: startDate, EndTime: new Date(), Statistics: ['Maximum'], Dimensions: [ { Name: 'Currency', Value: 'USD' } ] }; cloudwatch.getMetricStatistics(params, function(err, data) { if (err) { console.error(err, err.stack); context.fail("Failed to get billing metrics."); } else { console.log(data); var datapoints = data['Datapoints']; if (datapoints.length < 1) { console.error("There is no billing info."); context.fail("There is no billing info."); } var latestData = datapoints[datapoints.length - 1]; console.log(latestData); var dateString = [startDate.getFullYear(), startDate.getMonth() + 1, startDate.getDate()].join("/"); var slackMessage = { title: "AWS利用料金のお知らせ", text:dateString + "'s billing is " + latestData['Maximum'] + "$" }; postMessage(slackMessage, function(response) { if (response.statusCode < 400) { console.info('Message posted successfully'); context.succeed(); } else if (response.statusCode < 500) { console.error("Error posting message to Slack API: " + response.statusCode + " - " + response.statusMessage); context.succeed(); } else { // Let Lambda retry context.fail("Server error when processing message: " + response.statusCode + " - " + response.statusMessage); } }); } }); };
通知はこのようになります。
短いですが、終わりです。
〆