こちらのページで使い方を把握した AWS Lambda のトリガーに CloudWatch の定期実行イベントを設定することで、cron のように Lambda 関数を定期実行できます。利用例として、ここでは SQS にメッセージを一つだけ登録する処理を Lambda 関数で定期実行してみます。複数のインスタンスで動作する何らかのアプリケーションがバッチ処理を行う際、SQS からメッセージを取得できたインスタンス以外では処理をスキップするように実装することで、重複実行を回避しつつバッチ処理アプリケーションを冗長化できます。
Create New Queue をクリックします。
Queue Name を設定します。SQS におけるメッセージは、取得された後 Default Visibility Timeout の間だけ他のクライアントから参照できなくなります。その間にメッセージを取得したクライアントは SQS からメッセージを削除する必要があります。
Create Role をクリックします。
Lambda 権限が付与されたロールを作成します。
AmazonSQSFullAccess
を追加します。
ロール名を設定します。
Create a function をクリックします。
Blueprints は利用せずに Author from scratch をクリックします。
Lambda 関数名および先程作成した IAM ロールを設定します。
関数を以下のように編集して Save します。
'use strict';
const AWS = require('aws-sdk');
const sqs = new AWS.SQS();
const QUEUE_URL = 'https://sqs.ap-northeast-1.amazonaws.com/123412341234/my-queue-20171007';
exports.handler = function(event, context, callback) {
var params = {
MessageBody: 'test test',
QueueUrl: QUEUE_URL
};
// SQS にメッセージを送信します。
// http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SQS.html#sendMessage-property
sqs.sendMessage(params, function(err, data) {
if (err) {
console.log(err);
}
else {
console.log(data);
}
});
};
Test を実行すると SQS にメッセージが一つ追加されます。
Create rule をクリックします。
一分毎に Lambda 関数を実行するように設定します。ここで直接 SQS にメッセージを追加することもできますが、Lambda 関数を介することで SQS が空でない場合など処理の分岐が柔軟に行えます。