如何在CloudFormation中解决ECS任务与CodePipeline的创建顺序循环依赖问题
带CI/CD流水线与ECR的完整ECS栈CloudFormation部署循环依赖问题
问题描述
我希望在CloudFormation中定义包含CI/CD流水线与ECR仓库的完整ECS栈,实际操作中遇到了三层嵌套的循环依赖难题:
- 创建ECS任务定义(
AWS::ECS::TaskDefinition)时,必须先存在已推送镜像的ECR仓库(AWS::ECR::Repository),才能指定Image属性。 - 要填充该ECR仓库,需要先创建CodePipeline(
AWS::CodePipeline::Pipeline),因为该流水线创建后会自动运行并推送镜像到仓库。 - 而创建CodePipeline时,又需要先准备好ECS任务定义与集群,因为流水线需要向该目标部署应用,这又回到了第一步的前提要求。
目前已梳理出的可行解决方案
- 不在CloudFormation中创建ECR仓库,改为将其作为参数传入各个栈。
- 先在任务定义中配置一个占位dummy镜像完成首次部署,之后再创建流水线,由流水线创建真实的ECR仓库并推送、部署真实镜像。
- 将CodeBuild项目与ECR仓库放在独立的栈中创建,通过Lambda函数触发CodeBuild项目(CodeBuild不会像CodePipeline那样创建后自动运行),待完成镜像推送后再创建ECS集群,最后创建流水线,但该方案的复杂度高于预期。
核心疑问
有没有更优的方式解决这个循环依赖问题?
内容的提问来源于stack exchange,提问作者jd96
相关产品推荐
相关产品推荐

