AWS Lambda (Python) のコールドスタートを短縮する方法
AWS Lambda を使っていて、「な、なんだこの遅さは…!?」と思ったこと、ありませんか?
それ、コールドスタートのせいかもしれません。 Lambda は長時間使われていないと、一度シャットダウンされ、再びリクエストが来たときに起動し直すため、時間がかかることがあります。
今回紹介する方法を活用すれば、Lambda のコールドスタートを短縮し、スムーズなレスポンスを実現できます。
コールドスタート対策の実装しやすさ
No | 対策 | 実装のしやすさ |
---|---|---|
1 | メモリを増やす | ★★★ |
2 | 最新の Python ランタイムを使用する | ★★★ |
3 | 不要な import を減らす | ★★☆ |
4 | レイヤーを活用する | ★★☆ |
5 | 起動時の処理をキャッシュする | ★★☆ |
6 | Provisioned Concurrency を利用する | ★★☆ |
7 | VPC を最適化する | ★☆☆ |
1. メモリを増やして最適化する
実装のしやすさ: ★★★
Lambda の CPU パワーは メモリサイズに比例 します。 つまり、メモリを増やせば CPU も強くなり、コールドスタートが速くなります。
やること
- 128MB → 1024MB に増やしてみる
- 実際の負荷に合わせて最適なサイズを探る
メモリを増やせばコストも上がるので、試行錯誤しながら調整しましょう。
2. 最新の Python ランタイムを使用する
実装のしやすさ: ★★★
AWS Lambda は Python 3.7 などの古いバージョンもサポートしていますが、 最新のバージョン(2025年3月10日時点: Python 3.13)を使うと起動が速くなる ことがあります。
手順
新しいランタイムの方が最適化されていて、起動が速くなることが多いです。
3. 不要な import を減らす
実装のしやすさ: ★★☆
Python は import が多いと起動が遅くなります。
たとえば、Lambda のトップレベルで import boto3
などをすると、
その分だけ 起動時に時間がかかる ことがあります。
対策
# 遅延インポート(必要なときだけ読み込む) def handler(event, context): import json # この時点で読み込む return json.dumps({"message": "Hello, world!"})
これで、最初のロード時間を短縮できます。
4. レイヤーを活用してデプロイサイズを削減する
実装のしやすさ: ★★☆
Lambda のデプロイパッケージが大きいと、起動が遅くなります。
特に、 requests
などのライブラリを含むと、サイズが膨れ上がることもあります。
対策
mkdir python pip install -t python requests zip -r layer.zip python
そして、AWS Lambda の [レイヤー] にアップロード。 これで、デプロイサイズをスリム化して、起動時間を短縮できます。
5. 起動時の処理をキャッシュする
実装のしやすさ: ★★☆
Lambda の中で データベース接続や外部 API の呼び出しを毎回していると遅くなる ので、 グローバル変数を使って、使い回しましょう。
対策
import boto3 s3_client = None def handler(event, context): global s3_client if not s3_client: s3_client = boto3.client('s3') # 初回だけ接続 return {"message": "S3 Initialized"}
これで、2回目以降のリクエストで高速化 できます。
6. Provisioned Concurrency を利用する
実装のしやすさ: ★★☆
Provisioned Concurrency を設定すると、Lambda を事前にウォーム状態で待機させておけるため、 コールドスタートを回避できます。ただし、
注意点
- 一定数のリクエストを処理するには有効 だが、コストが発生する
- Provisioned Concurrency を 1 に設定すると、最初の 1 リクエストだけがウォーム状態
- 同時に複数のリクエストが来ると結局コールドスタートが発生
そのため、リクエストが少ない場合やコストを抑えたい場合は、他の最適化方法を優先 するのがよいでしょう。
7. VPC を最適化する
実装のしやすさ: ★☆☆
Lambda を VPC に配置すると、ENI(Elastic Network Interface)の作成に時間がかかる ことがあります。
VPC 内で Lambda を動かす必要がないなら、VPC の外に配置する ことで起動が速くなります。
もし VPC を使わなければならないなら、
まとめ
これらの方法を組み合わせれば、コールドスタートを短縮し、Lambda の起動を最適化できます。