グローバル変数というより handler 外で実行されるコードについて。
Lambda は Warm start している間は handler 以外の内容をキャッシュ(という言い方が正しいかは知らない)しているので、以下のようなことが起こる。
> cat handler.py
import json
import random
secret = random.random()
def gen_rand(event, context):
body = {"value": secret}
return {
"statusCode": 200,
"body": json.dumps(body)
}
> curl $ENDPOINT
{"value": 0.8271942175442388}
> curl $ENDPOINT
{"value": 0.8271942175442388}
> curl $ENDPOINT
{"value": 0.8271942175442388}
> curl $ENDPOINT
{"value": 0.8271942175442388}
> curl $ENDPOINT
{"value": 0.8271942175442388}
見てのとおり secret
はキャッシュされているので、Warm start 中は同じ値が返ってしまう。
この仕組みしらないとハマってしまったり、意図しないバグを作り込んでしまうなぁ。