67
40

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-04-09

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

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

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

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

##解決方法

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

image

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

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

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
67
40

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?