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

zyd*_*zyd 2 amazon-web-services aws-lambda aws-cdk

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

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

Dzh*_*eyt 5

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

看:

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

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