TL;DR
我使用一个在Docker Compose上运行的开源服务器应用程序。它有一些服务,包括PostgreSQL数据库和Redis。
如何使用Terraform在完整的IaC中将此应用程序最好地部署到AWS
迄今为止的解决方案
1.AWSecs-cli
ecs-cli
现在支持在亚马逊ECS中发送docker compose
配置。
然而,我不认为它可以与Terraform工作流集成(这可能不是一件大事(。我可以肯定的是,ecs-cli
在CloudFormation中不受支持,根据这个问题,目前仍然打开。所以我认为它也不能很容易地添加到Terraform中。
2.心电图的硬方法
- 把你的
docker-compose.yml
文件翻译成kubectl
YAML - (准备在每次升级软件包时执行此操作(
- 使用Terraform的+EKS API进行部署(最小示例(
但这还不完全是IaC。每次docker在源存储库中撰写更改时,您都必须重新翻译您的配置。听起来工作量很大。
3.使用Helm图
- 为应用程序编写Helm图
- 运行Terraform启动集群
- 仍然使用
helm
提供程序运行Terraform,以便在集群上安装带有Helm的应用程序
4.[不确定]k8s组合
我读到Kompose可以自动将Docker Compose配置转换为k8s配置,但它们似乎没有在AWS上移植,更不用说Terraform了。
5.[不好]脏的AMI解决方案
- 使用Packer构建自定义EC2 AMI
- 使用Terraform,设置DB、Redis和所有权限/网络等
- 使用自定义AMI启动EC2实例
- AMI包含(自定义的(应用程序代码,尤其是
docker-compose.yml
。还有Docker图像 - AMI启动Docker Compose
systemctl
服务
这会有点伤人:构建时间长,监控困难,无法扩展。
旁注
- 我提到我需要完整的IaC。我的意思是:
master
上的书面配置(仅此配置(告诉您部署了什么- 部署将在我的团队无需运行任何其他命令的情况下完成。它基本上可以在CI/CD或单推'n'go上工作
- 监控和警报可以在IaC中轻松配置
- 我希望用AWS组件替换一些服务(即用RDS替换PostgreSQL服务,用ElastiCache替换Redis服务(
- 应用程序恰好是Apache Superset。然而,我也在想,对于这个Docker Compose问题,什么是最好的通用方法
1。观望
谁知道呢,ecs-cli-v2
可能会更好地与CloudFormation和/或Terraform集成。
2.使用Helm图表
正如问题中提到的。可能是最好的解决方案,尽管需要(少量(努力来参数化Helm。
另请参阅:Helm入门。
3.Docker Swarm+CloudFormation+Terraform
Docker Swarm现在接受来自docker-compose.yml
文件的输入。可以在此处找到并配置模板。一旦配置好,它就可以集成到Terraform基础设施中。
本(3年前(教程介绍了如何在AWS上使用Docker Swarm模式。
要启动容器,如果需要(未完全调查,欢迎反馈(,可以使用Terraform的local-exec
。通过这种方式,您可以将SSH连接到主节点并运行docker stack deploy
和其他类似的命令,同时仍然以IaC风格编写所有命令。