AWS Lambdaの初回起動が遅い問題を解決する魔法の設定

たまーにしか実行しないようなプログラムこそ、サーバーレスで実行したいですよね。

ところがサーバーレスの代表格であるAWS Lamdaで、ライブラリを含んたzipをアップロードすると初回実行が非常に遅いのです。
Lambdaは一定時間実行されないと、アンロードされてしまうので、たまーにしか実行しないようなケースでは毎回遅い初回実行になってしまいます。

特にAPI Gatewayを通してLambdaを実行する場合はタイムアウトが上限30秒なので、PhantomJs等、重い処理が入っている場合は、初期化や処理中にタイムアウトしてしまいます。

色々試した結果、以下の方法で解決しました。

解決方法

Lambda関数のトリガにCloudWatchイベントスケジュールで五分毎の実行を入れるだけ!

image

※魔法の設定とか書いてごめんなさい

手順(要らないかもしれないけど念のため)

1.Lamda関数のトリガを開く

image

2.トリガ追加をクリック

image

3.トリガーを追加でClundWatchイベント - スケジュールを選択

image

4.ルール名を適当に入れて、スケジュール式を「rate(5 minute)」を指定して、送信ボタン

image

5.こんな感じになればOK

image

6.関数側はパラメータ無しの場合、空振りするようにしておくと良い

ソースはnode.jsであれば以下のような感じ。

index.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回増なので気にしなくて良さそうです
  • 五分毎でキープしてますが何分まで伸ばしてもアンロードされないかは調べてません