コールドスタート
Lambda の初回呼び出し時に実行環境の初期化が発生し、レイテンシが増加する現象
AWSサーバーレス
コールドスタートとは
コールドスタートは、Lambda の初回呼び出し時に実行環境の初期化 (コンテナ起動、ランタイム初期化、コードロード) が発生し、レイテンシが増加する現象である。2 回目以降はウォームスタートで高速。
コールドスタート vs ウォームスタート
コールドスタート (初回):
コンテナ起動 → ランタイム初期化 → コードロード → ハンドラ実行
|←── 100ms〜数秒 ──→|←── 実行時間 ──→|
ウォームスタート (2回目以降):
ハンドラ実行
|←── 実行時間 ──→|
ランタイム別のコールドスタート時間
| ランタイム | コールドスタート | 備考 |
|---|---|---|
| Node.js | 100〜300 ms | 軽量で高速 |
| Python | 100〜300 ms | 軽量で高速 |
| Go | 50〜100 ms | コンパイル済みバイナリ |
| Rust | 50〜100 ms | コンパイル済みバイナリ |
| Java | 500 ms〜数秒 | JVM の起動が遅い |
| .NET | 300〜800 ms | CLR の起動 |
コールドスタートの削減策
| 対策 | 効果 |
|---|---|
| メモリを増やす | CPU も比例して増加、初期化が高速化 |
| パッケージサイズを削減 | esbuild でバンドル、不要な依存を除去 |
| SDK v3 を使用 | v2 より軽量 |
| Provisioned Concurrency | 事前にウォーム状態を維持 |
| SnapStart (Java) | JVM のスナップショットを保存 |
Provisioned Concurrency
MyFunction:
Type: AWS::Serverless::Function
Properties:
AutoPublishAlias: live
ProvisionedConcurrencyConfig:
ProvisionedConcurrentExecutions: 5
常に 5 つの実行環境をウォーム状態に維持する。コールドスタートが発生しないが、常時課金される。
初期化コードの最適化
// ハンドラ外: コールドスタート時に 1 回だけ実行
const db = new DynamoDBClient({});
export const handler = async (event: any) => {
// ハンドラ内: 毎回実行
const result = await db.send(new GetItemCommand({ ... }));
return { statusCode: 200, body: JSON.stringify(result) };
};
// db の初期化はコールドスタート時のみ、ウォームスタートでは再利用
コールドスタートの監視
// CloudWatch Logs Insights
// コールドスタートの割合を確認
filter @type = "REPORT"
| stats count() as total,
sum(strcontains(@message, "Init Duration")) as coldStarts
| display coldStarts / total * 100 as coldStartPercent
全体像を把握するには関連書籍も有用。