ガチャつくブログ

IT系のお勉強のために、やってみたことをアウトプットしていきます。

MENU

Microsoft Teams でガチャつく - AWSの利用料金を通知 -

f:id:tmt-tty:20191204001840p:plain

はじめに

ども、ガチャつく野郎2.0(@_tamitom)です。

早速ですが、TeamsにAWSの利用料金を毎日に自動通知する仕組みを紹介したいと思います。

Slackへの通知は、ググると結構あるんですが、Teamsはほぼ無いので参考になると幸いです。

 

ガチャつき方

TeamsのIncoming Webhookを使用するので、有効化は下記を参考にしておいてください。

www.gachatsuku.com

 

今回参考にさせて頂いたのは下記の記事です。

qiita.com

 

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);
                }
            });
        }
    });
};

 

通知はこのようになります。

f:id:tmt-tty:20191204001423p:plain

 

短いですが、終わりです。