課題
Makefileを用いてECRにイメージをdocker pushした。
Lambdaはlatestタグのイメージを使用しており、新しいイメージがlatestタグを取得したにも関わらず、新しいイメージが使われなかった。
code
PROFILE ?= default
ECR_URI := 123456789.dkr.ecr.ap-northeast-1.amazonaws.com
IMAGE_NAME=image-name
LAMBDA_FUNCTION_NAME=my-function
.PHONY: deploy
deploy: ecr_login
docker build -t $(IMAGE_NAME):latest -f ./xxx/runtime/xxx/Dockerfile ./xxx/runtime --no-cache
docker tag $(IMAGE_NAME):latest $(ECR_URI)/$(IMAGE_NAME):latest
docker push $(ECR_URI)/$(IMAGE_NAME):latest
.PHONY: ecr_login
ecr_login:
aws ecr get-login-password --profile $(PROFILE) --region ap-northeast-1 | docker login --username AWS --password-stdin $(ECR_URI)
問題点
ECRにイメージをpushしただけではLambdaが使用するイメージは更新されない。
明示的にLambdaの使用イメージを更新しなければならない。
Lambda は、イメージタグを特定のイメージダイジェストに解決します。これは、関数のデプロイに使用されたイメージタグを Amazon ECR 内の新しいイメージを指すように変更しても、Lambda は新しいイメージを使用するように自動的に関数を更新しないことを意味します。新しいイメージを同じ Lambda 関数にデプロイするには、Amazon ECR のイメージタグが同じままであっても、update-function-code コマンドを使用する必要があります。
from: コンテナイメージで Python Lambda 関数をデプロイする - AWS Lambda
解決法
Lambdaが新しいイメージを使用するようにLambda関数の更新が必要だった。次のコマンドをMakefileに追加する。
aws lambda update-function-code --profile $(PROFILE) --function-name $(LAMBDA_FUNCTION_NAME) --image-uri $(ECR_URI)/$(IMAGE_NAME):latest
Makefileは次のようになる。
PROFILE ?= default
ECR_URI := 123456789.dkr.ecr.ap-northeast-1.amazonaws.com
IMAGE_NAME=image-name
LAMBDA_FUNCTION_NAME=my-function
.PHONY: deploy
deploy: ecr_login
docker build -t $(IMAGE_NAME):latest -f ./xxx/runtime/xxx/Dockerfile ./xxx/runtime --no-cache
docker tag $(IMAGE_NAME):latest $(ECR_URI)/$(IMAGE_NAME):latest
docker push $(ECR_URI)/$(IMAGE_NAME):latest
aws lambda update-function-code --profile $(PROFILE) --function-name $(LAMBDA_FUNCTION_NAME) --image-uri $(ECR_URI)/$(IMAGE_NAME):latest
.PHONY: ecr_login
ecr_login:
aws ecr get-login-password --profile $(PROFILE) --region ap-northeast-1 | docker login --username AWS --password-stdin $(ECR_URI)