コールドスタート

Lambda の初回呼び出し時に実行環境の初期化が発生し、レイテンシが増加する現象

AWSサーバーレス

コールドスタートとは

コールドスタートは、Lambda の初回呼び出し時に実行環境の初期化 (コンテナ起動、ランタイム初期化、コードロード) が発生し、レイテンシが増加する現象である。2 回目以降はウォームスタートで高速。

コールドスタート vs ウォームスタート

コールドスタートと ウォームスタート の違いを図で示す。

コールドスタート (初回):
  コンテナ起動 → ランタイム初期化 → コードロード → ハンドラ実行
  |←── 100ms〜数秒 ──→|←── 実行時間 ──→|

ウォームスタート (2回目以降):
  ハンドラ実行
  |←── 実行時間 ──→|

ランタイム別のコールドスタート時間

ランタイム別のコールドスタート時間を以下にまとめる。

ランタイムコールドスタート備考
Node.js100〜300 ms軽量で高速
Python100〜300 ms軽量で高速
Go50〜100 msコンパイル済みバイナリ
Rust50〜100 msコンパイル済みバイナリ
Java500 ms〜数秒JVM の起動が遅い
.NET300〜800 msCLR の起動

コールドスタートの削減策

コールドスタートの削減策を以下にまとめる。

対策効果
メモリを増やすCPU も比例して増加、初期化が高速化
パッケージサイズを削減esbuild でバンドル、不要な依存を除去
SDK v3 を使用v2 より軽量
Provisioned Concurrency事前にウォーム状態を維持
SnapStart (Java)JVM のスナップショットを保存

Provisioned Concurrency

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

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

この記事は役に立ちましたか?

関連用語

関連する記事