おはようございます、YASUです。
DynamoDBのスロットリングの記事で、「上限を超えると断られる」という話を書きましたが、Lambdaにも同じように、同時に処理できる数の上限があります。DVAの勉強で、「予約済み同時実行」と「プロビジョニング済み同時実行」を取り違えたので、シンプルに整理しました。
結論
予約済み同時実行は、関数に専用の枠を確保する仕組みで、追加料金はかかりません。プロビジョニング済み同時実行は、実行環境を事前に準備しておく仕組みで、コールドスタートを減らせますが、追加料金がかかります。
同時実行とは
同時実行は、Lambda関数が、同時に処理している未完了のリクエストの数です。同時に来たリクエストごとに、実行環境が1つずつ用意されます。アカウントのデフォルトの上限は、1つのリージョン内のすべての関数を合わせて、1,000です。ある関数にリクエストが集中すると、この枠を使い切って、他の関数がスロットリングされることがあります。
予約済み同時実行:その関数専用の枠
- 関数に割り当てる、同時実行の最大数
- 確保した分は、他の関数が使えない
- 追加料金はかからない
- 予約していない関数は、残りの枠を、みんなで共有する
自分なりのイメージでは、お店の「専用席」です。重要な関数に、専用席を確保しておけば、他の関数が混んでいても、席がなくなることがありません。同時に、その関数が使える席の上限にもなります。
プロビジョニング済み同時実行:先に準備しておく
- 事前に初期化しておいた、実行環境の数
- リクエストが来た時に、すぐに対応できるので、コールドスタートを減らせる
- 追加料金がかかる
- エイリアスやバージョンに対して設定する
コールドスタートは、実行環境の初期化が必要で、最初のリクエストの処理が遅くなることです。自分なりのイメージでは、お客さんが来る前に、先に厨房の準備を済ませておく状態です。公式のドキュメントでは、ウェブアプリケーションやモバイルアプリケーションのような、ユーザーが待っているワークロードに向いていて、データ処理のような非同期の処理には、通常は必要ない、と説明されています。
設定する対象は、エイリアスやバージョンです。前に整理した、バージョンとエイリアスの記事とつながる部分です。
試験での見分け方
- 「他の関数にスロットリングされないように、枠を確保したい」「追加料金なし」→ 予約済み同時実行
- 「コールドスタートを減らしたい」「応答を速くしたい」→ プロビジョニング済み同時実行
- 「コストを抑えたい」→ 予約済み(追加料金なし)
まとめ
- 同時実行は、同時に処理しているリクエストの数。デフォルトは、リージョン全体で1,000
- 予約済み同時実行は、関数専用の枠で、追加料金なし
- プロビジョニング済み同時実行は、事前に準備した実行環境で、コールドスタートを減らせるが、追加料金がかかる
- プロビジョニング済み同時実行は、エイリアスやバージョンに設定する
「枠を確保するのか、準備を済ませておくのか」という違いで、すっきり整理できました。それでは、また明日!

コメント