我使用 CloudFormation 创建了两个堆栈。 第一个堆栈使用所需资源创建一个集群:
- 负载均衡器
- 自动扩缩组
- 目标群体
- 听众
- EC2 实例
- 任务定义和服务
- 等等...
第二个堆栈用于创建 CodePipeline 堆栈,以配置持续交付管道。
流程应如下所示:
- 用户将代码推送到 Github
- CodePipeline 被触发,执行以下阶段:
- Source Stage:从 Github 提取代码
- 构建阶段:构建镜像并将其推送到 ECR
- 部署阶段:在上述第一个 CloudFormation 堆栈上触发 STACK_UPDATE。
- ECS 集群服务通过 CloudFormation 堆栈更新进行更新
一切正常,但我遇到了问题。我正在更新代码,应用程序似乎正在使用旧代码运行,我的意思是,管道以绿色运行,但每当我访问负载均衡器 URL 时,代码都不会更新。我想这是因为 CloudFormation 脚本没有改变,但我的代码确实改变了!
有什么办法可以强制 CloudFormation 堆栈更新吗?或者我应该在部署阶段部署到 ECS Cluster 而不是 CloudFormation ?
最佳答案
据我所知,您缺少部署应用程序阶段。您似乎只更新基础设施,而没有在部署阶段部署应用程序代码?
我习惯如何设置:
- codepipeline 和基础设施模板与代码一起使用
- 代码推送触发代码管道
- 第一阶段:从 codecommit(或者在您的情况下为 github)查看代码
- (可选)codepipeline 更新自身以处理 codepipeline 模板的更改
- 构建阶段:构建镜像并推送至 ECR
- 部署基础设施阶段:触发基础设施堆栈的 cloudformation 堆栈更新
- 部署应用阶段:将应用程序代码部署到基础架构(您似乎缺少的内容)
在 cloudformation 模板中部署 ECS 应用程序阶段将如下所示:
...
Stages:
- Name: deploy-app
Actions:
- Name: Deploy
ActionTypeId:
Category: Deploy
Owner: AWS
Provider: ECS
Version: 1
InputArtifacts:
- Name: build-output-artifact
Configuration:
ClusterName: 'my-cluster'
ServiceName: 'my-service'
FileName: 'imagedefinitions.json' (optional)
在构建阶段,将镜像推送到 ECR 后,将 ECR url 写入 ECS imagedefinitions.json。 imagedefinitions.json 必须是构建阶段的输出工件和部署应用阶段的输入工件。
更多信息:
- https://docs.aws.amazon.com/codepipeline/latest/userguide/reference-pipeline-structure.html
- https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-cd-pipeline.html
- https://aws.amazon.com/blogs/compute/set-up-a-continuous-delivery-pipeline-for-containers-using-aws-codepipeline-and-amazon-ecs/
关于continuous-integration - AWS Codepipeline 不更新我的 ECS 集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52099682/