コールドスタート

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

全体像を把握するには関連書籍も有用。

関連用語