AWS Lambda (Python) のコールドスタートを短縮する方法

AWS Lambda を使っていて、「な、なんだこの遅さは…!?」と思ったこと、ありませんか?

それ、コールドスタートのせいかもしれません。 Lambda は長時間使われていないと、一度シャットダウンされ、再びリクエストが来たときに起動し直すため、時間がかかることがあります。

今回紹介する方法を活用すれば、Lambda のコールドスタートを短縮し、スムーズなレスポンスを実現できます。


コールドスタート対策の実装しやすさ

No 対策 実装のしやすさ
1 メモリを増やす ★★★
2 最新の Python ランタイムを使用する ★★★
3 不要な import を減らす ★★☆
4 レイヤーを活用する ★★☆
5 起動時の処理をキャッシュする ★★☆
6 Provisioned Concurrency を利用する ★★☆
7 VPC を最適化する ★☆☆

1. メモリを増やして最適化する

実装のしやすさ: ★★★

Lambda の CPU パワーは メモリサイズに比例 します。 つまり、メモリを増やせば CPU も強くなり、コールドスタートが速くなります。

やること

  • 128MB1024MB に増やしてみる
  • 実際の負荷に合わせて最適なサイズを探る

メモリを増やせばコストも上がるので、試行錯誤しながら調整しましょう。


2. 最新の Python ランタイムを使用する

実装のしやすさ: ★★★

AWS Lambda は Python 3.7 などの古いバージョンもサポートしていますが、 最新のバージョン(2025年3月10日時点: Python 3.13)を使うと起動が速くなる ことがあります。

手順

  1. AWS Lambda の 設定画面Python のバージョンをチェック
  2. 可能なら Python 3.13 に更新
  3. 依存ライブラリの互換性を確認

新しいランタイムの方が最適化されていて、起動が速くなることが多いです。


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 を使わなければならないなら、

  • NAT Gateway の設定を見直す
  • Amazon VPC Lattice や Hyperplane ENI を利用する などの方法を試してみてください。

まとめ

これらの方法を組み合わせれば、コールドスタートを短縮し、Lambda の起動を最適化できます。