当代码被 ECR 图像引用时,AWS CDK 更新 lambda 函数代码

AWS CDK update lambda function code when code is referenced by ECR image

我有一个 Lambda 堆栈,它位于与 Lambda 代码本身分开的存储库中。 Lambda 代码作为 docker 映像打包并部署到 ECR,然后单独的 Lambda 堆栈使用 aws_lambda.DockerImageCode.from_ecr() 方法将代码作为 DockerImageFunction 引用。这似乎已经正确地部署了初始函数,但是在将 Lambda 代码的新图像发布到 ECR 然后 运行 cdk deploy 从带有 Lambda 堆栈的回购中,它只是说没有发现差异.我如何以一种方式引用我的 Lambda 代码,以便在部署构造时看到代码已更改并更新 Lambda 函数代码(就像 aws lambda update-function-code cli 调用一样)?在使用引用 Lambda 堆栈本地代码的代码资产(如在同一存储库中)之前,我已经完成了它,但是当代码未被引用为本地资产?

我意识到关于是在单一存储库中组织堆栈还是在单独的存储库中组织堆栈以及他们负责部署的任何应用程序代码存在一些争论,但为了讨论,我更感兴趣的是如何完成当堆栈与代码分离时更新 Lambda 函数。

可能您遇到了臭名昭著的 Docker“最新”标签问题。

参见:

意味着如果您没有为您的 Docker 图像明确指定“标签”,默认情况下,您所有的基础设施都将假定您正在尝试部署使用 your-image-name:latest 图像名称。鉴于此引用(作为字符串)永远不会改变,无论您将新图像推送到 ECR,您的 Lambda 部署永远不会理解“最新”标签内的某些内容发生了变化。

我的建议是,不要在“最新”标签之上推送,每当您更改代码库时,始终将其推送到全新且不可变的标签(例如当前时间戳)。然后,将标签作为对可预测命名的 Parameter Store 条目的引用(例如 /myproduct/lambdaNameHere/tagName)。稍后您可以在您的 Lambda 基础架构中“读取”该标签,它现在会看到有变化(以前的 Lambda 版本指的是一个图像+标签组合,但现在指的是不同的图像+标签组合)。