以下の状況のときに、Lambda 関数はいい感じに更新できるのかどうか不安になったので試してみたログ。
- CodeBuild で Lambda 用コンテナイメージをビルドして ECR に push する
- このとき ECR のコンテナイメージにはタグを付けず、
latest
を更新し続ける
- このとき ECR のコンテナイメージにはタグを付けず、
- ECR のコンテナイメージを Lambda で動かす
動かすサンプルアプリ
Dockerfile
FROM public.ecr.aws/lambda/python:3.9
COPY main.py ${LAMBDA_TASK_ROOT}
CMD ["main.handler"]
main.py
def handler(event, context):
return "foo"
実行したら foo
と返ってくるだけの Lambda 関数
事前準備
-
lambda-test
という名前の Lambda 関数を作っておく -
lambda-test
という名前の ECR リポジトリを作っておく
とりあえず動かす
ECR にログイン
$ aws ecr get-login-password --region ${AWS_DEFAULT_REGION} | docker login --username AWS --password-stdin ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com
ビルドして ECR に push
$ docker build -t ${AWS_ACCOUNT_ID}.dkr.ecr.${$AWS_DEFAULT_REGION}.amazonaws.com/lambda-test .
$ docker push ${AWS_ACCOUNT_ID}.dkr.ecr.${$AWS_DEFAULT_REGION}.amazonaws.com/lambda-test
実行
$ aws lambda invoke --function-name lambda-test /dev/stdout
foo
動いた
書き換えてみて動作検証
試しに main.handler の返り値を変更
main.py
def handler(event, context):
return "bar" # 書き換えた
再度 build & push してから再実行
$ aws lambda invoke --function-name lambda-test /dev/stdout
foo
変わらない
→ もし Lambda ランタイムの内部で毎回 docker pull しているならもしかしたら変わるかもと思っていたが、そんなことはなさそう
update-function-code してから再実行
$ aws lambda update-function-code --function-name lambda-test --image ${AWS_ACCOUNT_ID}.dkr.ecr.${$AWS_DEFAULT_REGION}.amazonaws.com/lambda-test:latest
$ aws lambda invoke --function-name lambda-test /dev/stdout
bar
変わった
→ 同じタグ (latest
) であっても update-function-code すれば最新のコンテナイメージに更新されるらしい