Terraform:在 EKS/ECS 上部署 Docker Compose 应用程序

2024-01-29

TL;DR

我使用开源服务器应用程序在 Docker Compose 上运行。它有一些服务,包括 PostgreSQL DB 和 Redis。

如何使用 Terraform 以完整的 IaC 方式最好地将此应用程序部署到 AWS?


到目前为止的解决方案

1. AWS ecs-cli

ecs-cli https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_CLI.html now supports https://aws.amazon.com/about-aws/whats-new/2018/06/amazon-ecs-cli-supports-docker-compose-version-3/发送docker composeAmazon ECS 中的配置。

然而,我不认为它可以与 Terraform 工作流程集成(这可能不是什么大惊小怪的事情)。我确定的是ecs-cli is CloudFormation 不支持, 按照这个问题 https://github.com/aws-samples/ecs-refarch-cloudformation/issues/17,此时仍然开放。所以我认为它也不能轻易添加到 Terraform 中。

2. 硬 EKS 方式

  • 带上你的docker-compose.yml文件,将其翻译为kubectl YAML.
  • (准备好每次软件包升级时都这样做)。
  • 使用 Terraform 的 + EKS API 进行部署(最少example https://github.com/foxutech/nodejs-k8s-aws).

但这还不是完全的 IaC。每次 docker-compose 在源存储库中发生更改时,您都必须重新翻译您的配置。听起来工作量很大。

3. 使用 Helm 图表

  • 为应用程序编写 Helm 图表。
  • 运行 Terraform 以启动集群。
  • 仍然运行 Terraformhelm provider https://www.terraform.io/docs/providers/helm/index.html使用 Helm 在集群上安装应用程序。

4. [不行] k8s Kompose

I read Kompose https://kompose.io/可以自动将 Docker Compose 配置转换为 k8s 配置,但它们似乎没有移植到 AWS 上,更不用说 Terraform 了。

5. [不好] 肮脏的 AMI 解决方案

  • 使用 Packer 构建自定义 EC2 AMI。
  • 使用 Terraform,设置 DB、Redis 和所有权限/网络/等。
  • 使用自定义 AMI 启动 EC2 实例。
  • AMI 包含(定制的)应用程序代码,尤其是docker-compose.yml。还有 Docker 镜像。
  • AMI 启动 Docker Composesystemctl服务。

这会有点伤害:构建时间长、监控困难、无法扩展。

旁注

  • I mentioned I need full IaC. What I mean by it is:
    1. 书面配置(仅此)master告诉您部署了什么。
    2. 部署将完成,我的团队无需运行任何其他命令。它基本上可以在 CI/CD 或单推即用上工作。
    3. 监控和警报可在 IaC 中轻松配置。
  • 我希望用AWS组件替换一些服务(即用RDS替换PostgreSQL服务,用ElastiCache替换Redis服务)。
  • 应用程序happens to be 阿帕奇超级集 https://github.com/apache/superset。然而,我也想知道解决这个 Docker Compose 问题的最佳通用方法是什么。

1. 观望

谁知道,ecs-cli-v2 https://github.com/aws/amazon-ecs-cli-v2可能会更好地与 CloudFormation 和/或 Terraform 集成。

2. 使用 Helm 图表

正如问题中提到的。可能是最好的解决方案,尽管需要(一点)努力来参数化 Helm。

也可以看看:头盔入门 https://helm.sh/docs/chart_template_guide/getting_started/.

3.Docker Swarm + CloudFormation + Terraform

现在 Docker Swarmaccepts https://docs.docker.com/engine/swarm/stack-deploy/输入来自docker-compose.yml文件。可以找到并配置模板here https://hub.docker.com/editions/community/docker-ce-aws?tab=resources。配置完成后,它可以集成到 Terraform 基础设施中。

这个(3岁)tutorial https://stelligent.com/2017/02/21/docker-swarm-mode-on-aws/解释如何在 AWS 上使用 Docker Swarm 模式。

要启动容器,如有必要(未充分调查,欢迎反馈),您可以使用 Terraformlocal-exec https://www.terraform.io/docs/provisioners/local-exec.html。这样你就可以通过 SSH 连接到主节点并运行docker stack deploy和其他类似的命令,同时仍然以 IaC 风格编写。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Terraform:在 EKS/ECS 上部署 Docker Compose 应用程序 的相关文章

  • 基于 Spring Boot 的测试中的上下文层次结构

    我的 Spring Boot 应用程序是这样启动的 new SpringApplicationBuilder sources ParentCtxConfig class child ChildFirstCtxConfig class sib
  • 如何关闭整个数据库的区分大小写

    我创建了一个包含许多脚本和许多存储过程的数据库 在这个数据库中 我们没有注意担心区分大小写 因为它对于我的本地开发计算机来说是关闭的 综上所述 我试图弄清楚如何使以下两条语句返回相同的结果 SELECT FROM companies SEL
  • 使用 alpha 通道叠加两个 ggplot2 stat_密度2d 图

    我想叠加两个ggplot2使用 alpha 通道进行绘图 结果图像显示两个数据集 这是我的测试数据 data read table text P1 1 0 4 nP2 0 0 2 nP3 2 1 8 nP4 2 2 6 nP5 0 5 2
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内
  • 如何在 C# 中获取 CMD/控制台编码

    我需要指定正确的代码页来使用 zip 库打包文件 正如我所见 我需要指定控制台编码 在我的例子中为 866 C Users User gt mode Status for device CON Lines 300 Columns 130 K
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调
  • 将 r 中的一列从出生日期更改为年龄

    我是第一次使用 data table 我的表中有大约 400 000 个年龄的列 我需要将它们从出生日期转换为年龄 做这个的最好方式是什么 我一直在思考这个问题 到目前为止对这两个答案都不满意 我喜欢用lubridate 就像 KFB 所做
  • mysql 查询选择当月的所有行?

    我有一个名为 startdate 的日期时间类型的列 我必须获取当前月份的开始日期和结束日期之间的所有行 即从 1 11 2014 到 30 11 2014 select from your table where year curdate
  • Rails 未定义“2013-03-06”的方法“strftime”:字符串

    我收到错误 2013 03 06 的未定义方法 strftime 字符串 当尝试使用 strftime 从字符串 2013 03 06 正常显示日期 2013 年 6 月星期日 3 日或类似的日期 时 在我的 index html erb
  • 如何(安全)将 Python 对象发送到我的 Flask API?

    我目前正在尝试构建一个 Flask Web API 它能够在 POST 请求中接收 python 对象 我使用 Python 3 7 1 创建请求 使用 Python 2 7 运行 API 该 API 设置为在我的本地计算机上运行 我试图发
  • 如何从地址簿中获取一个人的电话号码?

    我想做的就是让用户从地址簿中选择一个号码 我在这个问题中找到了代码 如何从地址簿联系人获取电话号码 iphone sdk https stackoverflow com questions 286207 how to get a phone
  • 即使调整大小,如何获得屏幕的精确中间位置

    好的 这个问题有两部分 当我做一个JFrame 并在其上画一些东西 即使我将宽度设置为 400 并使其在一个项目击中它时 当然 允许项目宽度 它会反弹回来 但由于某种原因 它总是偏离屏幕约 10 个像素 有没有办法解决这个问题 或者我只需要
  • LifeCycleAware Fragment 中的片段生命周期事件

    我有一个生命周期感知片段和一个LifecycleObserver class public class MyFragment extends Fragment Override public void onCreate Nullable B
  • 定义在文本小部件中双击时选择哪些字符

    在 Windows 上 双击文本小部件中的单词也将选择连接的标点符号 有什么方法可以定义您想要选择的角色吗 tcl wordchars该变量的值是一个正则表达式 可以设置它来控制什么被视为 单词 字符 例如 通过双击 Tk 中的文本来选择单
  • 混合本机/托管可执行文件中的最终托管异常处理程序?

    我有一个使用 clr 编译的 MFC 应用程序 并且我正在尝试为未捕获的托管异常实现最终处理程序 对于本机异常 重写CWinApp ProcessWndProcException works 杰夫的书中提到的两个事件代码项目文章 http
  • 如何在 ASP.NET Core 中注入泛型的依赖关系

    我有以下存储库类 public class TestRepository Repository
  • 构建 iOS 应用程序后退出代码 1 错误

    我正在尝试使用 RestKit 构建我的项目 当我构建它时 我收到以下错误 我尝试使用 Apple LLVM 3 0 和 LLVM GCC 4 2 进行编译 两者都产生相同的结果 任何人有任何想法是什么导致了这个问题 Ld Users Ji
  • Android GetPTLAFormat 上的 Phonegap 错误

    我们正在开发一个使用 jQuery 移动和电话间隙的应用程序 一切似乎都工作正常 但是当在连接的 Android 手机上运行应用程序时 我们在 Eclipse logcat 中看到大量类似这样的错误 0 GetPTLAFormat inva
  • Swift:UICollectionViewCell didSelectItemAtIndexPath 更改背景颜色

    我可以轻松更改单元格的背景颜色CellForItemAtIndexPath method func collectionView collectionView UICollectionView cellForItemAtIndexPath
  • 如何统计订单总价?

    我有这些表 Orders id status user id address id 1 await 1 1 products id name price quantity 1 test1 100 5 2 test2 50 5 order p

随机推荐