amazon-web-services - 当 ECR 镜像引用代码时,AWS CDK 更新 lambda 函数代码

标签 amazon-web-services aws-lambda aws-cdk

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

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

最佳答案

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

参见:

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

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

关于amazon-web-services - 当 ECR 镜像引用代码时,AWS CDK 更新 lambda 函数代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65996593/

相关文章:

amazon-web-services - 亚马逊登录后如何获取 "address consent token"?

amazon-web-services - 未找到命令 : systemctl on Amazon Linux 2018. 03

amazon-web-services - AWS S3 服务器端加密有何意义?

amazon-web-services - 使用 SAM cli 和 AWS CDK 进行本地调试时,AWS lambda 模块未找到错误?

java - 我是否应该在 Spring 中手动重置 Autowired Bean 的状态数据(因为它是单例)?

node.js - 使用 lambda 将文件从 URI 直接流式传输到 S3,使用大量内存

amazon-web-services - 为什么 Lambda 函数在使用 1536 MB 时执行速度要快得多?

amazon-web-services - 使用 Api 网关连接到 ElastiCache 集群

aws-cloudformation - 解决错误: Cannot use resource 'x' in a cross-environment fashion,资源的物理名称必须显式设置

typescript - 调试 TypeScript AWS CDK 应用程序