プロさんのおうち   ~プログラムのサンプル置き場~


AWS Lambda関数を作成する


Node.jsを利用してAWS Lambda関数を作成したのでメモします。

今回Slack通知にhttpsモジュールを利用しましたが、サンプルが少なかったので今後の参考のために。

今回作成するAWS Lambda関数

今回作成するAWS Lambda関数は以下の2つです。

  • S3にPUTしたファイルの中身をDynamoDBにPUTする
  • DynamoDBで更新されたデータをSlackに通知する

AWS Lambda関数のソースコード

まずは、S3にPUTされたファイルの中身をDynamoDBにPUTする関数のソースコードです。


var aws = require('aws-sdk');
var s3 = new aws.S3({ apiVersion: '2006-03-01' });
var dynamoDB = new aws.DynamoDB({ region: 'DynamoDBのテーブルが存在するリージョン' });

console.log('Loading');

exports.handler = function (event, context) {

    if (event != null) {
        console.log('event = ' + JSON.stringify(event));
    }

    // S3からアップロードされたJSONファイルを取得する。
    var bucket = event.Records[0].s3.bucket.name;
    var objectName = event.Records[0].s3.object.key;

    var s3Params = {
        Bucket: bucket,
        Key: objectName
    };

    console.log(s3Params);
    console.log('S3 getObject Start.');

    s3.getObject(s3Params, function (err, data) {
        if (err) {
            console.log(err, err.stack);
        } else {
            console.log('DynamoDB batchWriteItem Start.');

            var dynamoParams = { RequestItems: JSON.parse(data.Body.toString()) };
            // DynamoDBへの書き込みを実行する。
            dynamoDB.batchWriteItem(dynamoParams, function (err, data) {
                if (err) {
                    console.log(err, err.stack);
                } else {
                    console.log(data);
                }

                // 終了メッセージ表示
                context.done(null, 'All Process End.');
            });
        }
    });
};
				

このソースについては、S3にPUTしたファイルをAWS CLIの時ように渡せなかったので(やり方が悪い?)、一度s3.getObjectを利用してS3からファイルを取得した後、中身のJSONを読み込んで処理しています。

また、今回JSONファイルの中身はDynamoDBに登録できる形式を前提にして実装しています(BatchWriteItemで一度に複数件のPUTを行っています)。


次に、DynamoDBで更新されたデータをSlackに通知する関数のソースコードです。


var url = require('url');
var https = require('https');

console.log('Loading');

exports.handler = function (event, context) {

    if (event != null) {
        console.log('event = ' + JSON.stringify(event));
    }

    // 書き込みデータ
    var postData = {
        channel: "メッセージ送信対象チャンネル",
        username: "ユーザー名",
        text: JSON.stringify(event.Records[0].dynamodb)
    };
    // 送信するJSONを文字列に変換
    var postDataString = JSON.stringify(postData);

    // SlackのWebhook URL
    var webhookUrl = url.parse("Incoming WebhookのURL");
    // 接続オプション
    var options = {
        hostname: webhookUrl.hostname,
        path: webhookUrl.path,
        port: 443,
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'Content-Length': postDataString.length
        }
    }

    // Slackにメッセージを送信
    console.log('Start Slack Notification.');
    var req = https.request(options, (res) => {
        res.setEncoding('utf-8');

        res.on('data', (chunk) => {
            console.log(`BODY: ${chunk}`);
        });
        res.on('end', () => {
            console.log('No more data in response.');

            // 終了メッセージ表示
            context.done(null, 'All Process End.');
        });
    });

    // 実際のデータ送信
    req.write(postDataString)
    req.end();
};
				

こちらのソースは、検索したらよくでてくるrequestモジュールを使わずに、標準のhttpsモジュールを利用しています。

注意点として、Node.jsにはhttpモジュールというものもありますが、左記のモジュールではうまく通信できない(IncomingWebhookのURLがhttps)ので、httpsモジュールを利用するようにしてください。

また、今回はイベント通知として受け取ったJSONをそのまま通知メッセージとしていますが、一度文字列変換する必要があるのも注意が必要です。

参考URL



メニューに戻る


CopyRight 2019 株式会社PUreatio