たまーにしか実行しないようなプログラムこそ、サーバーレスで実行したいですよね。
ところがサーバーレスの代表格であるAWS Lambdaで、ライブラリを含んたzipをアップロードすると初回実行が非常に遅いのです。
Lambdaは一定時間実行されないと、アンロードされてしまうので、たまーにしか実行しないようなケースでは毎回遅い初回実行になってしまいます。
特にAPI Gatewayを通してLambdaを実行する場合はタイムアウトが上限30秒なので、PhantomJs等、重い処理が入っている場合は、初期化や処理中にタイムアウトしてしまいます。
色々試した結果、以下の方法で解決しました。
##解決方法
Lambda関数のトリガにCloudWatchイベントスケジュールで五分毎の実行を入れるだけ!
※魔法の設定とか書いてごめんなさい
##手順(要らないかもしれないけど念のため)
1.Lambda関数のトリガを開く
2.トリガ追加をクリック
3.トリガーを追加でClundWatchイベント - スケジュールを選択
4.ルール名を適当に入れて、スケジュール式を「rate(5 minute)」を指定して、送信ボタン
5.こんな感じになればOK
6.関数側はパラメータ無しの場合、空振りするようにしておくと良い
ソースはnode.jsであれば以下のような感じ。
exports.handler = (event, context, callback) => {
// パラメータがない場合、空振りさせる(判定方法は適宜変更)
if (event.sampleParam === undefined) {
console.log(`exec by timer.`);
callback(null, {"result":`NOP`});
return;
}
console.log(`exec by api.`);
// ☆☆☆ APIの処理 ☆☆☆
// ☆☆☆ APIの処理 ☆☆☆
// ☆☆☆ APIの処理 ☆☆☆
callback(null, {"result":`OK`});
};
補足
- 同時実行が必要な場合は複数のスケジュールを入れてキープおくと良いです
- コストについては、五分毎の場合、一日288回増なので気にしなくて良さそうです
- 五分毎でキープしてますが何分まで伸ばしてもアンロードされないかは調べてません