Node.jsを利用してAWS Lambda関数を作成したのでメモします。
今回Slack通知にhttpsモジュールを利用しましたが、サンプルが少なかったので今後の参考のために。
今回作成するAWS Lambda関数は以下の2つです。
まずは、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をそのまま通知メッセージとしていますが、一度文字列変換する必要があるのも注意が必要です。