AWS Lambda で環境変数が変更されたときも,コールドスタートになります


AWS Lambda において,ハンドラ外のコードはコールドスタートの時のみ実行されるという話はよくされています1
また,新しくデプロイすると,古い実行環境は廃止され,新しい実行環境が作成されることもよく知られています.

しかし,環境変数のみ変更したとき,コールドスタートになるのか気になったので,先行記事がないか調査してみましたが,見つからなかったため,自分で試してみました!

実行環境

実際に使用したコード,インフラ構成は こちら

Lambda 関数は以下の実装になっています.
ハンドラ外で,現在時刻,環境変数を取得し,ハンドラ内でも現在時刻を取得しています.
そして,それらをレスポンスとして返しています.

main.py
import json
import os
from datetime import datetime

time_out_of_handler = datetime.now()
env_user = os.environ.get("USER")


def lambda_handler(event, context):
    time_in_handler = datetime.now()
    print(f"Time out of handler: {time_out_of_handler}")
    print(f"Time in handler: {time_in_handler}")
    print(f"env value: {env_user}")
    return {
        "statusCode": 200,
        "body": json.dumps(
            {
                "time_out_of_handler": str(time_out_of_handler),
                "time_in_handler": str(time_in_handler),
                "env_user": env_user,
            }
        ),
    }

実験

  1. 前節で示したコードをデプロイし
  2. デプロイした関数の関数 URL に対し,500ms ごとにリクエストを送信をし続ける
  3. 環境変数を手動で変更
    1. ハンドラ外で定義した値に変化がみられるか確認

結果

なんと,環境変数を変更した直後に,ハンドラ外で定義した変数,読み込んだ環境変数の値が変わっていました!
環境変数を変更した直後は,コールドスタートになるため,init が入り,少しレスポンスが遅くなっていることを確認できます.

また,X-Ray でトレースを取得したところ,コールドスタートが発生していることも確認できました.

以下,500ms ごとにリクエストを送信したときのログです.

{'time_out_of_handler': '2024-04-06 16:24:03.285905', 'time_in_handler': '2024-04-06 16:24:27.309945', 'env_user': 'user'}
{'time_out_of_handler': '2024-04-06 16:24:03.285905', 'time_in_handler': '2024-04-06 16:24:27.848920', 'env_user': 'user'}
{'time_out_of_handler': '2024-04-06 16:24:03.285905', 'time_in_handler': '2024-04-06 16:24:28.397632', 'env_user': 'user'}
{'time_out_of_handler': '2024-04-06 16:24:03.285905', 'time_in_handler': '2024-04-06 16:24:28.945975', 'env_user': 'user'}
{'time_out_of_handler': '2024-04-06 16:24:03.285905', 'time_in_handler': '2024-04-06 16:24:29.491589', 'env_user': 'user'}
{'time_out_of_handler': '2024-04-06 16:24:03.285905', 'time_in_handler': '2024-04-06 16:24:30.034864', 'env_user': 'user'}
{'time_out_of_handler': '2024-04-06 16:24:30.759348', 'time_in_handler': '2024-04-06 16:24:30.762272', 'env_user': 'user2'}
{'time_out_of_handler': '2024-04-06 16:24:30.759348', 'time_in_handler': '2024-04-06 16:24:31.306591', 'env_user': 'user2'}
{'time_out_of_handler': '2024-04-06 16:24:30.759348', 'time_in_handler': '2024-04-06 16:24:31.843653', 'env_user': 'user2'}
{'time_out_of_handler': '2024-04-06 16:24:30.759348', 'time_in_handler': '2024-04-06 16:24:32.390752', 'env_user': 'user2'}

Footnotes

  1. Developers.ioの記事