LambdaのProvisioned Concurrencyを使って、コールドスタート対策をしてみた #reinvent

2019.12.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

CX事業本部の佐藤です。この記事はAWS LambdaとServerless #1 Advent Calendar 2019の12日目 です

re:Invent 2019のLambdaで Provisioned Concurrency というアップデートがありました。弊社の岩田が速報ブログとして書いています。Provisioned Concurrencyのアップデートによって、Lambdaの同時実行数を事前にプロビジョニングすることが可能になりました。この機能によって、設定した数のコンテナは常にウォームスタート状態になるため、コールドスタートをある程度防ぐことが可能になりました。ただし、設定したコンテナ数以上のリクエストが来ると、Lambdaは通常通りスケールアウトしてコンテナを起動します。その際はコールドスタートとなるため、この設定値の調整が必要になりそうです。

やってみること

Provisioned Concurrencyを使って、コールドスタートが起きなくなるのかを検証してみました。

やってみた

Lambda関数を作成します。最初は、Provisioned Concurrencyを設定しない状態でリクエストを投げてみます。コールドスタートが起きたかを確認するために、ハンドラ外のコードに処理を加えます。

console.log('cold start') // コールドスタートが起きた時に呼ばれて、CloudWatch Logsに書き込まれる

exports.handler = async (event) => {
    // TODO implement
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

まずは、Provisioned Concurrencyを設定せずにLambdaをテスト実行してみます。このLambdaをAPI Gatewayに紐付けます。今回は heyという負荷テストツールを使います。200リクエスト10並列でAPI Gatewayにリクエストを投げてみます。

hey -n 200 -c 10 https://XXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/test

以下のような結果になりました。赤枠でかこったところが通常のリクエストよりも4倍 ~ 8倍の処理時間であることがわかります。この17リクエストの際にコールドスタートが起きていると推測できます。

CloudWatch Logsでも確認してみます。 cold start という文字列で検索したところ、17件ヒットしました。上記の推測したリクエスト数とほぼ一致しています。

次に、Provisioned Concurrencyの設定を行ってからリクエストを投げてみます。一度起動したコンテナを破棄するために、適当にコードを変更して保存します。その後、Lambdaのバージョンの発行とエイリアスの紐付けを行います。Provisioned Concurrencyは、エイリアスかバージョンに対して設定する必要があります。今回は、100コンテナ分を事前にプロビジョニングしてみたいと思います。Provisioned Concurrencyを 100 に設定します。

54/100で進行中です

完了しました。これで準備完了です。

API GatewayのLambdaを$LATESTではなくエイリアスの方を実行するように変更してから、先ほどと同じように、 hey を使って、API Gatewayに対して200リクエスト10並列でリクエストを投げてみます。

hey -n 200 -c 10 https://XXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/test

今回は、以下のような結果になりました。ちょっとわかりづらいですが、先ほどと比べると、レスポンスタイムのばらつきが少なく、安定しているように見えます。

CloudWatch Logsでも確認してみました。Cold Start で検索しても1件もヒットしなかったため、コールドスタートは起きていないと考えられます。

まとめ

Provisioned Concurrencyについて調べてみました。従来のようにLambdaを暖機することなく、コールドスタート対策ができるようになり、ますます使いやすくなったと思います。ただし、追加の料金が発生するため注意が必要です。弊社の岩田から、Provisioned Concurrencyのコストの考察ブログも公開されているので、要チェックです。