#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».
Видишь:
- https://vsupalov.com/docker-latest-tag/
- https://medium.com/@mccode/the-misunderstood-docker-tag-latest-af3babfd6375
Это означает, что если вы явно не укажете «тег» для своего образа Docker, все ваши инфраструктуры по умолчанию будут предполагать, что вы пытаетесь развернуть лямбда-выражение, использующее имя your-image-name:latest
образа. Учитывая, что эта ссылка (в виде строки) никогда не меняется, независимо от того, что вы отправляете новое изображение в ECR, ваше развертывание Lambda никогда не поймет, что что-то изменилось внутри тега «latest».
Что я бы предложил, так это вместо того, чтобы нажимать поверх тега «latest», всякий раз, когда вы меняете кодовую базу, всегда нажимайте на совершенно новый и неизменяемый тег (например, текущую временную метку). Затем нажмите тег в качестве ссылки на запись хранилища параметров с предсказуемым именем (например /myproduct/lambdaNameHere/tagName
, ). Позже вы сможете «прочитать» этот тег в своей инфраструктуре Lambda, которая теперь увидит, что есть изменения (предыдущая версия Lambda ссылалась на одну комбинацию image tag, но теперь ссылается на другую комбинацию image tag).