Terraform + AWS ECS,持续部署流程?
Posted
技术标签:
【中文标题】Terraform + AWS ECS,持续部署流程?【英文标题】:Terraform + AWS ECS, continuous deployment process? 【发布时间】:2021-12-31 17:52:42 【问题描述】:在过去 6 年多的时间里,我使用 AWS Elastic Beanstalk 和 Ruby 平台来托管和部署我的 Rails 应用程序,目前正在迁移到 AWS ECS。
因此,我不得不使用 docker-compose 对我的应用和其他服务进行 docker 化,现在我正在考虑如何配置基础架构和准备代码部署。
我花了数周时间研究进行此迁移,但现在我对将基础设施和应用程序部署到 AWS 的各种方法(co-pilot、docker-compose、eb w/docker 等)有点不知所措.).
此外,我希望尽可能保持与云平台无关,因为我将来会将我的一些 AWS 基础设施迁移到 Digital Ocean。所以本来希望用 Terraform 的,但是由于上面提到的选项似乎都在内部使用 CloudFormation,所以 Terraform 似乎没有必要。
鉴于这种情况,如果我愿意,我应该使用哪些流程和工具:
使用 Terraform 在 AWS 上配置我的基础设施。
快速简单地将代码更改部署到生产环境,无需停机。理想情况下,我们不会使用基于 AWS 的开发运维工具(CodeCommit、CodeDeploy 等)。
我是 docker 新手,而 elastic beanstalk 使代码部署变得如此简单,以至于我不确定我应该去哪里寻找。我以前从未使用过像 Jenkins 这样的工具,并且不完全确定它是否/如何适合我的流程。
感谢您的指导!
【问题讨论】:
【参考方案1】:持续集成/持续部署
主要职责是 CI/CD 的工具(例如 CodePipeline、Jenkins、CircleCI、GitHub Actions)是将其他一切联系在一起的拼图的一部分。这将允许您清楚地定义部署管道的顺序步骤。
首先定义这些单独的步骤需要回答一些问题(并非详尽无遗!):
您是要为每个环境构建一次 Docker 映像,还是只构建一次? 您是否在稍后将其拉入部署步骤之前构建并发布您的 Docker 映像到工件注册表(例如 Docker Hub 或 AWS ECR)? 您希望每次推送/合并到/进入main/master
都触发您的管道还是手动触发部分/全部?
您需要使用 Docker Compose 还是 Docker 就足够了?您还运行了哪些其他服务?
如何在本地构建和运行应用?
实施
可能的情况是您最终将在某种 Linux 容器外壳中使用 Docker、Terraform 和 AWS CLI 来实际实现您的目标。大多数现代 CI/CD 即服务提供商允许您为管道的每个阶段选择 Docker 映像,因此您应该能够选择已经满足您需求的映像。
分离基础设施配置和应用部署
这可以在同一个 Git 项目中完成,但需要使用单独的管道/作业/阶段(名称取决于您选择的 CI/CD 提供商)。或者,您可以选择单独的回购。就个人而言,我发现将它们放在一起更容易保持同步。
您还应该清楚 Terraform 的职责在哪里结束。虽然可以使用 Terraform 部署容器,但我认为它应该仅限于底层基础设施。
保持与云无关
选择 GitHub Actions 或 CircleCI 之类的东西可以让您在未来选择多云部署(例如)。但是,如果归结为选择像 CodeDeploy 之类的东西而不是编写大量 shell 脚本来获得您想要的部署行为,那么我认为值得为目前节省的时间和精力承担未来的迁移成本。
【讨论】:
【参考方案2】:大约一年前我遇到了同样的话题,在寻找现有工具之后,我最终将其中一些工具结合在一起,我们最近开源了一些东西:
yoke
用于在 Amazon Elastic Container Service (AWS ECS) 上部署服务的简单工具。它的方法尝试支持持续交付,将资源配置与应用程序部署解耦
希望这将帮助您更好地理解该主题,或者您也可以使用该工具!
【讨论】:
以上是关于Terraform + AWS ECS,持续部署流程?的主要内容,如果未能解决你的问题,请参考以下文章
在 AWS ECS 上使用 docker-compose 进行持续部署的最佳实践
Terraform 中的 ECS 服务如何连接到 AWS 自动缩放组
在 Terraform 的 aws_ecs_task_definition 资源中设置 ulimit 堆栈大小