Elasticbeanstalk(以下EB)で動かしているウェブアプリ。今はたいして負荷があるわけじゃないので、1インスタンスで動かしてます。このウェブアプリが参照するデータを、生成するワーカーの実装が必要になりました。こういう時、真面目にやるならEBでワーカー環境を別に作成し、別インスタンスで起動する方法を取るのでしょう。
しかし、お金もったいないので1インスタンスでやりたい(笑)
そこでウェブアプリにワーカー起動用のHTTPリクエストを受け取るようにした。リクエストを受け取ったらバックグラウンド処理を開始し、HTTPレスポンスは即座に返すようにする。一応、外部からむやみに叩かれるのを防ぐために、URLパラメータにGUIDなど長くて予想不能な固定文字列が指定されていた時のみワーカー実行するものとする。
あとはこのURLを定期的にキックしてくれればいい。そこでLambdaとCloudWatchの出番。
Lambdaの関数作成
- Lambda関数の作成
- Blank Functionを選択
- 名前とかロールは適当につける
コードのサンプル(node.js)
var https = require ('https');
exports.handler = function(event, context) {
https.get("https://example.com/worker/sample?guid=XXXXXXXXXXXXXXXXXXXXX", function(res) {
if (res.statusCode == 200) {
console.log("SUCCESS!");
context.done(null);
} else {
var message = "error: status_code:" + res.statusCode;
context.done(message);
}
}).on('error', function(e) {
context.done('error', e);
});
これで呼び出されるとhttps://example.com/worker/sample をキックするLambda関数はできた。
CloudWatchのスケジュール作成
- イベント > ルールを選択
- ルールの作成でスケジュールを選択
- 何分おきかとかcron形式で設定できるので設定する
- ターゲットの追加で作成したLambda関数を選択する
これで、定期的にワーカー実行のURLをキックしてくれる。