У меня есть Lambda, развернутая на AWS. Моя Lambda развернута, использует контейнер для запуска моего кода. Всякий раз, когда мы развертываем новый образ, нам приходится вручную копировать и вставлять URL-адрес в конфигурацию Lambda. Даже если последний образ в ECR имеет URI, который уже настроен в Lambda, Lambda использует образ, когда в последний раз вручную выполнялась настройка. Мне было интересно, есть ли способ, чтобы лямбда автоматически использовала последний образ, развернутый в ECR?
Что я пробовал:
Примечание. Bitbucket отправляет изображение в ECR.
Есть несколько решений для этого странного случая.
Удалить образ докера <-- Это трюк, а затем получить новый образ докера с помощью вытягивания докера.
Используйте SHA256 для сравнения хеш-строки образа докера. Если хеш-строки отличаются, это разные версии/теги образа докера.
Например, вы можете использовать хеш-строку sha256.
docker pull ubuntu@sha256:26c68657ccce2cb0a31b330cb0be2b5e108d467f641c62e13ab40cbec258c68d
Это ожидаемо, так как Lambda не знает, что было отправлено новое изображение.
Для функции, определенной как образ контейнера, Lambda разрешает образ тег к дайджесту изображения. В Amazon ECR, если вы обновите тег изображения до новое изображение, Lambda не обновляет функцию автоматически.
После нажатия изображения:
docker tag my-image:latest 123456789.dkr.ecr.eu-west-1.amazonaws.com/my-image:latest
docker push 123456789.dkr.ecr.eu-west-1.amazonaws.com/my-image:latest
Также обновите свою Lambda новым образом:
aws lambda update-function-code \
--function-name my-lambda \
--image-uri 123456789.dkr.ecr.eu-west-1.amazonaws.com/my-image:latest
Ответ, который дал Стефан, помог мне добиться того же с помощью Bitbucket Pipelines (моя проблема должна была быть решена на Bitbucket). Вот пример кода:
- pipe: atlassian/aws-lambda-deploy:1.7.0
variables:
AWS_DEFAULT_REGION: 'YOPUR_LAMBDA_REGION'
AWS_OIDC_ROLE_ARN: "ARN_FOR_YOUR_IAM_ROLE"
FUNCTION_NAME: 'YOUR_FUNCTION'
COMMAND: 'update'
IMAGE_URI: 'YOUR_IMAGE_URI'
Чтобы это работало, ваша Lambda должна быть уже настроена, поскольку этот код просто обновляет вашу Lambda.
См. примечание в разделе Создание образов из базовых образов AWS. Чтобы использовать обновленный базовый образ, необходимо перестроить образ контейнера и обновить код функции.