LoginSignup
6
3

More than 1 year has passed since last update.

AWS Lambda を ECR のコンテナイメージで動かすとき、:latest を指定して良いのか悪いのか

Posted at

以下の状況のときに、Lambda 関数はいい感じに更新できるのかどうか不安になったので試してみたログ。

  • CodeBuild で Lambda 用コンテナイメージをビルドして ECR に push する
    • このとき ECR のコンテナイメージにはタグを付けず、 latest を更新し続ける
  • 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 すれば最新のコンテナイメージに更新されるらしい

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3