ただ枯れゆく大樹が如く

技術の話やら愚痴やら節操もなく徒然と

AWS lambdaでglobal変数を使用した際の失敗談

調べているとstaging用のS3バケットにproductionモードで実行したデータが存在したので調査したところ、 コードの中で使用されているglobal変数に問題があった。 該当コードを簡略化したテストコードとその結果を以下に記載。

bucket_path='production_path'

def lambda_handler(event, context):
    global bucket_path
    if "test_mode" in event:
        bucket_path='staging_path'
    print(bucket_path)

実行時のパラメータにtest_modeが含まれている場合にglobal変数を書き換えるだけのもの。

  • 実行時パラメータが以下のようにtest_modeが含まれない状況で実行
{
  "_test_mode": ""
}
START RequestId: 78045b16-ae03-4be0-9c89-e8841c7026f3 Version: $LATEST
production_path
END RequestId: 78045b16-ae03-4be0-9c89-e8841c7026f3
REPORT RequestId: 78045b16-ae03-4be0-9c89-e8841c7026f3  Duration: 10.97 ms  Billed Duration: 100 ms     Memory Size: 128 MB Max Memory Used: 22 MB  

同然出力されるのはproduction_path

  • 次に実行時パラメータが以下のようにtest_modeが含まれる状況で実行後、すぐに再度含まれない状況で実行
{
  "test_mode": ""
}
START RequestId: 119bcfb9-75a4-4bc2-ad34-cedb4f8518c5 Version: $LATEST
staging_path
END RequestId: 119bcfb9-75a4-4bc2-ad34-cedb4f8518c5
REPORT RequestId: 119bcfb9-75a4-4bc2-ad34-cedb4f8518c5  Duration: 1.72 ms   Billed Duration: 100 ms     Memory Size: 128 MB Max Memory Used: 22 MB  
{
  "_test_mode": ""
}
START RequestId: edf3a5ee-9d84-46a3-8973-216b2b863e2c Version: $LATEST
staging_path
END RequestId: edf3a5ee-9d84-46a3-8973-216b2b863e2c
REPORT RequestId: edf3a5ee-9d84-46a3-8973-216b2b863e2c  Duration: 0.25 ms   Billed Duration: 100 ms     Memory Size: 128 MB Max Memory Used: 22 MB

テストモードで実行した後に連続的に通常モードで実行すると、 テストモードで実行した際にglobal変数へ代入した値が残ったままになっており、 これが原因で通常モードの際にテストモードのbucket_pathが表示されてしまった。

コールドスタートしてないので代入値が残りっぱなしになってたというだけだけど、意外と見つからなかった。