kakakakakku blog

Weekly Tech Blog: Keep on Learning!

AWS Lambda 関数で Amazon ECR のイメージタグを上書きしたら AWS Lambda 関数を更新する

AWS Lambda 関数をコンテナイメージでデプロイしているときに,latest タグを使っていたり,同じタグを上書きして再利用していたりする場合がある.例えば AWS Well-Architected Framework「Container Build Lens」の設計原則 (Design principles) には「避けるべし!」と書いてあったりするけど,それでも現場ではそういう運用になっていることもある👀

The automatically created latest tag shouldn’t be used. A tagging strategy should produce immutable tags. Teams should avoid overwrite tags because this makes it hard to reproduce issues of specific application versions.

docs.aws.amazon.com

そのときに Amazon ECR のイメージタグを上書きしても AWS Lambda 関数に反映されなくて困ることがある.実は仕様はドキュメントに載っていて,AWS Lambda 関数にデプロイされたコンテナイメージはイメージダイジェストで決まっていて,Amazon ECR のイメージタグを上書きしても AWS Lambda 関数は自動的に更新されないようになっている.よって,意図的に AWS Lambda 関数を更新する必要がある👌

コンテナイメージとして定義された関数の場合、Lambda はイメージタグをイメージダイジェストに転換します。Amazon ECR では、イメージタグを新しいイメージに更新しても、Lambda は関数を自動的に更新しません。

docs.aws.amazon.com

検証

version 1

ドキュメントを参考に AWS Lambda 関数として Python コードを実行するコンテナイメージを作る.

docs.aws.amazon.com

今回は Amazon ECR のイメージタグを上書きして確認できれば良くて,lambda_function.py は以下のように単純に version 1 と出力するだけにした🙏

def handler(event, context):
    print('version 1')

さらに Dockerfile は以下のようにした.Python ベースイメージを使えば AWS Lambda RIC (Runtime Interface Clients) をセットアップしなくて OK👌

FROM public.ecr.aws/lambda/python:3.12

COPY lambda_function.py ${LAMBDA_TASK_ROOT}

CMD [ "lambda_function.handler" ]

コンテナイメージをビルドして,検証用の AWS Lambda 関数に latest タグとしてデプロイすると「イメージ URI」sha256:f9b01431b221a63d0360b4742c805997cbea81299264e4658774d2582ad0fc09 になっていた💡

AWS Lambda 関数を実行すると,期待通りに version 1 とログが出力される📝

version 2

次に lambda_function.py を以下のように更新して,コンテナイメージをビルドして latest タグを上書きする.

def handler(event, context):
        print('version 2')

もう一度 AWS Lambda 関数を実行すると,引き続き version 1 とログが出力されてしまう😅 そこで aws lambda update-function-code コマンドを実行して,上書きしたコンテナイメージのイメージダイジェストを指定する必要がある.

$ aws lambda update-function-code \
  --function-name sandbox \
  --image-uri 000000000000.dkr.ecr.ap-northeast-1.amazonaws.com/sandbox@sha256:10ad544f449ef5f2bb5a0228ffd8b71245f509a8fdc0ba92159c65f2f80fc363

さらにもう一度 AWS Lambda 関数を実行すると,期待通りに version 2 とログが出力される📝

まとめ

AWS Lambda 関数をコンテナイメージでデプロイするときは「Amazon ECR のイメージタグを上書きしても AWS Lambda 関数は自動的に更新されないようになっていること」を理解しておく必要がある👌

そして,AWS CodeBuild や GitHub Actions などを使ってコンテナイメージをビルドするときは一緒に aws lambda update-function-code コマンドを実行する必要がある \( 'ω')/