AWS Lambdaは、サーバーレスアーキテクチャの利用を容易にする強力なサービスです。しかし、最大限のパフォーマンスを引き出し、予期しない問題を避けるためには、いくつかの重要な注意点を理解しておく必要があります。
目次
1. タイムアウト設定の最適化
Lambda関数のデフォルト実行時間はわずか3秒ですが、必要に応じて最大15分まで延長できます。長時間実行する関数を持つ場合は、タイムアウト値を適切に設定することが重要です。15分を超える場合は、EC2やECSなどのサービスを検討する必要があります。
2. メモリ割り当ての調整
Lambda関数のメモリのデフォルトは128 MBですが、必要に応じて最大10,240 MB(10 GB)まで増やすことができます。過剰なメモリ割り当てはコスト増加につながるため、適切なメモリサイズを選択することが必要です。
3. コールドスタートの対策
新しいインスタンスでの初回実行時にはコールドスタートが発生し、レスポンス時間が長くなる可能性があります。
また、コールドスタートとホットスタートで以下の点に注意が必要です。
// Lambda関数外にグローバル変数を定義
let globalCounter = 0;
// Lambda関数のハンドラ
export const handler = async (event: any = {}): Promise<any> => {
// グローバル変数をインクリメント
globalCounter += 1;
// コールドスタート時には、このログには 'Global counter: 1' と表示されます。
// ホットスタート時(同一コンテナ内での再利用時)には、この値は1から始まり、
// 関数が呼び出されるたびに増加します(例: 'Global counter: 2', 'Global counter: 3', ...)。
console.log(`Global counter: ${globalCounter}`);
// レスポンスを返す
return {
statusCode: 200,
body: JSON.stringify({
message: `Global counter is now ${globalCounter}`,
}),
};
};
- コールドスタート時:
globalCounter
はLambda関数がデプロイされるか、長時間アイドル状態の後に初めて実行されたときに、0からスタートし、関数内で1に増加します。この時、コンテナとグローバル変数が初期化されます。 - ホットスタート時:関数が続けて実行される場合(既存のコンテナが再利用される場合)、
globalCounter
の値はリセットされず、前の実行からの値が保持されます。その結果、カウンターは呼び出しごとに1ずつ増えていきます。
4. 同時実行制限への対応
AWSはアカウントごとにLambda関数の同時実行数に制限を設けています。高いトラフィックが予想される場合は、事前に制限緩和をリクエストしておきましょう。
5. API Gateway, AppSyncとの統合時の注意
API GatewayやAppSyncとLambdaを統合する際は、API Gateway、AppSyncのタイムアウト時間とLambdaのタイムアウト設定を調整し、統合時の問題を防ぎましょう。