Terraform + AWS ECS,持续部署流程?

Terraform + AWS ECS, continuous deployment process?

在过去 6 年多的时间里,我使用 AWS Elastic Beanstalk 和 Ruby 平台来托管和部署我的 Rails 应用程序后,目前正在迁移到 AWS ECS。

因此,我不得不 docker 使用 docker-compose 来调整我的应用程序和其他服务,现在正在考虑如何配置基础架构和准备代码部署。

我花了数周时间研究如何进行此迁移,但现在我对将基础设施和应用程序部署到 AWS 的各种方法感到有点不知所措(co-pilot,docker-compose, eb 带 docker,等等)。

此外,我希望尽可能保持与云平台无关,因为我将来会将我的一些 AWS 基础设施迁移到 Digital Ocean。所以我希望使用 Terraform,但由于上面提到的选项似乎都在内部使用 CloudFormation,所以 Terraform 似乎没有必要。

鉴于这种情况,如果我想,我应该使用什么流程和工具:

  1. 使用 Terraform 在 AWS 上配置我的基础设施。

  2. 快速简单地将代码更改部署到生产中,无需停机。理想情况下,我们不会使用基于 AWS 的 Dev-ops 工具(CodeCommit、CodeDeploy 等)。

我是 docker 的新手,弹性 beantalk 使代码部署变得如此简单,以至于我不确定我还应该去哪里寻找。我以前从未使用过像 Jenkins 这样的工具,并且不完全确定 if/how 适合我的流程。

谢谢指导!

持续integration/continuous部署

主要负责 CI/CD 的工具(例如 CodePipeline、Jenkins、CircleCI、GitHub Actions)是将其他一切联系在一起的拼图。这将使您能够清楚地定义部署管道的顺序步骤。

定义这些单独的步骤首先需要回答一些问题(非详尽无遗!):

  • 您打算为每个环境构建一次 Docker 映像还是总共只构建一次?
  • 您是否正在构建 Docker 映像并将其发布到工件注册表(例如 Docker Hub 或 AWS ECR),然后再将其拉入部署步骤?
  • 您希望每个 push/merge to/into main/master 触发您的管道还是手动触发其中的 some/all?
  • 您需要使用 Docker Compose 还是 Docker 就足够了?您 运行 宁还有哪些其他服务?
  • 您如何在本地构建和 运行 您的应用程序?

实施

可能的情况是,您最终会在某种 Linux 容器 shell 中使用 Docker、Terraform 和 AWS CLI 来实际实现您的目标。大多数现代 CI/CD-as-a-service 提供商允许您为管道的每个阶段选择一个 Docker 图像,因此您应该能够 select 一个图像已经满足您的需求。

分离基础架构配置和应用程序部署

这可以在同一个 Git 项目中完成,但要使用单独的 pipelines/jobs/stages(名称取决于您选择的 CI/CD 提供商)。或者,您可以选择单独的回购协议。就个人而言,我发现将它们放在一起可以更容易地保持同步。

你也应该清楚 Terraform 的责任在哪里结束。虽然可以使用 Terraform 来部署容器,但我认为它应该仅限于底层基础设施。

保持与云无关

选择像 GitHub Actions 或 CircleCI 这样的东西会让你在未来选择多云部署(例如)。但是,如果归结为选择像 CodeDeploy 这样的东西而不是编写大量 shells 脚本来获得你想要的部署行为,那么我认为为了节省时间和精力而承担未来的迁移成本是值得的在现在。

差不多一年前我遇到过同样的话题,在四处寻找现有工具后,我最终将其中的几个粘在一起,在我们最近开源的东西上:

yoke

Simple tool for deploying services on Amazon Elastic Container Service (AWS ECS). Its approach tries supporting Continuous Delivery, decoupling resources provisioning from application deployment

希望这能帮助您更好地理解主题,或者您也可以使用该工具!