AWS CDK обновляет код лямбда-функции, когда на код ссылается изображение ECR

#amazon-web-services #aws-lambda #aws-cdk

#amazon-веб-сервисы #aws-лямбда #aws-cdk

Вопрос:

У меня есть лямбда-стек, который находится в репозитории отдельно от самого лямбда-кода. Лямбда-код упаковывается и развертывается в ECR в виде образа docker, затем отдельный лямбда-стек ссылается на код как на DockerImageFunction использование aws_lambda.DockerImageCode.from_ecr() метода. Казалось, что это правильно развернуло начальную функцию, но после публикации нового образа лямбда-кода в ECR, а затем запуска cdk deploy из репозитория со стеком лямбда-кода, он просто говорит, что различий обнаружено не было. Как мне ссылаться на мой лямбда-код таким образом, чтобы при развертывании конструкций он видел, что код изменился, и обновлял код лямбда-функции (как aws lambda update-function-code это сделал бы вызов cli)? Я делал это перед использованием ресурса кода, ссылающегося на локальный код в стеке лямбда (например, в том же репозитории), но как заставить стек распознавать изменения в коде лямбда, когда на код не ссылаются как на локальный ресурс?

Я понимаю, что есть некоторые споры о том, следует ли организовывать стеки в моно-репозиториях или в отдельных репозиториях с любым кодом приложения, за развертывание которого они отвечают, но ради этого обсуждения меня больше интересует, как можно выполнить обновление лямбда-функций, когда стек отделен от кода.

Ответ №1:

Вероятно, вы попали в печально известную проблему с тегом Docker «latest».

Видишь:

Это означает, что если вы явно не укажете «тег» для своего образа Docker, все ваши инфраструктуры по умолчанию будут предполагать, что вы пытаетесь развернуть лямбда-выражение, использующее имя your-image-name:latest образа. Учитывая, что эта ссылка (в виде строки) никогда не меняется, независимо от того, что вы отправляете новое изображение в ECR, ваше развертывание Lambda никогда не поймет, что что-то изменилось внутри тега «latest».

Что я бы предложил, так это вместо того, чтобы нажимать поверх тега «latest», всякий раз, когда вы меняете кодовую базу, всегда нажимайте на совершенно новый и неизменяемый тег (например, текущую временную метку). Затем нажмите тег в качестве ссылки на запись хранилища параметров с предсказуемым именем (например /myproduct/lambdaNameHere/tagName , ). Позже вы сможете «прочитать» этот тег в своей инфраструктуре Lambda, которая теперь увидит, что есть изменения (предыдущая версия Lambda ссылалась на одну комбинацию image tag, но теперь ссылается на другую комбинацию image tag).