Amazon cloudformation 云信息-云服务器服务。如何在没有堆栈冲突的情况下管理管道部署的映像更新

Amazon cloudformation 云信息-云服务器服务。如何在没有堆栈冲突的情况下管理管道部署的映像更新,amazon-cloudformation,amazon-ecs,amazon-ecr,Amazon Cloudformation,Amazon Ecs,Amazon Ecr,我正在尝试编写一个CloudFormation模板来完全定义ECS服务所需的所有资源,包括 nodejs代码的CodeCommit存储库 用于管理构建的代码管道 ECR存储库 ECS任务定义 ECS服务 ALB目标群体 ALB侦听器规则 我已经设法让这一切都运作起来了。堆栈构建良好。但是,我不确定如何正确处理更新 模板中任务定义中的容器需要定义图像。但是,实际的应用程序映像在管道首次构建代码之前是不存在的 我有一个想法,我可能能够解决这个问题,例如通过定义某种占位符图像“amazon/ama

我正在尝试编写一个CloudFormation模板来完全定义ECS服务所需的所有资源,包括

  • nodejs代码的CodeCommit存储库
  • 用于管理构建的代码管道
  • ECR存储库
  • ECS任务定义
  • ECS服务
  • ALB目标群体
  • ALB侦听器规则
我已经设法让这一切都运作起来了。堆栈构建良好。但是,我不确定如何正确处理更新

模板中任务定义中的容器需要定义图像。但是,实际的应用程序映像在管道首次构建代码之前是不存在的

我有一个想法,我可能能够解决这个问题,例如通过定义某种占位符图像“amazon/amazonecssample”,来构建堆栈。当管道第一次运行时,此映像将被代码构建替换

这部分也很好

当我尝试在CloudFormation模板中更新任务定义(例如添加环境变量)时,就会出现问题。当我重新运行堆栈时,它会用模板中的原始占位符图像替换容器定义中的应用程序图像

这是合乎逻辑的,因为CloudFormation显然假定模板中的图像是要使用的正确图像

我只是想找出处理这件事的最好办法

本质上,我想找到一些方法,告诉CloudFormation在创建新修订版时只使用任务定义的最新修订版中定义的任何图像,而不是将其替换为原始模板属性

我试图用纯CloudFormation实现的是可能的,还是需要使用自定义资源或类似的东西

理想情况下,我希望将额外的堆栈依赖关系保持在最低限度

我曾经想到的一种可能性是为容器定义映像使用固定标记,它在cloudformation堆栈第一次构建时实际上不存在,但在第一次代码管道构建后将存在

比如说

image: [my_ecr_base_uri]/[my_app_name]:latest
然后,我可以让我的管道使用此标签推送一个新版本。然而,我更喜欢用特定的verion标记定义任务定义修订,就像这样

image: [my_ecr_base_uri]/[my_app_name]:v1.0.1-[git-sha]

。。。因为这样可以很容易地查看应用程序当前运行的版本,并在需要时轻松恢复修订。

您的问题是,您在这个CloudFormation模板中放入了太多内容。您的模板可以包括CodeCommit存储库和CodePipeline。但是,其他的东西应该是来自管道的输出。记住:您的管道将有一个构建和部署阶段。构建阶段可以“构建”在部署阶段执行的另一个cloudformation模板。在此部署阶段,您的管道将构建ECS服务、任务、ALB等