【问题标题】:Terraform: Deploying the same web-app for multiple clientsTerraform:为多个客户端部署相同的 Web 应用程序
【发布时间】:2019-07-18 00:08:16
【问题描述】:

我目前正在使用 Terraform 将 PHP 应用程序部署到 AWS。
此 PHP 应用程序使用 AWS ECS 部署为服务。

我有多个使用这个应用程序的客户,每个客户都会收到他们自己的系统副本,并使用他们自己的配置作为他们自己的服务 - 如果您愿意,可以使用白标。

现在,在对 Terraform 进行了一些研究后,我将代码模块化并创建了以下文件结构:

+---my-application
    |   shared.tf
    |   iam_policies.tf
    |   iam_roles.tf
    |   variables.tf
    |   web-apps.tf
    |   
    +---modules
    |   \---role
    |   |       main.tf
    |   |       outputs.tf
    |   |       variables.tf
    |   |       
    |   \---webapp
    |           main.tf
    |           variables.tf
    |           
    +---templates
            web_definition.tpl.json

我的问题在于web-apps.tf 文件,我将它用作所有webapp 模块的“粘合剂”:

module "client_bob" {
  source = "modules/webapp"
  ...
}

module "client_alice" {
  source = "modules/webapp"
  ...
}

... Over 30 more client module blocks ...

不用说,这不是一个好的设置。
它不可扩展,并且还会创建 巨大 .tfstate 文件。

有一次尝试使用 Consul 作为后端时,我收到一条错误消息,提示我已达到 Consul KV 值允许的大小限制。

处理这种情况的正确方法是什么?

当我写这篇文章时,我已经查看了类似问题部分中的所有问题,所有这些问题都围绕着使用多个.tfstate 文件的想法,但我没有非常了解这将如何解决我的问题,任何帮助将不胜感激!

【问题讨论】:

  • 最初的想法是modules 应该是my-application 配置的对等目录。不确定这是否能解决您的“巨大的.tfstate”问题,但它确实有助于组织。
  • 很好的建议@MattSchuchard 谢谢,我稍后会做这个结构改变,现在我真的很难理解为我的所有客户实施这个基础设施的正确方法是什么...... .

标签: amazon-web-services terraform amazon-ecs consul


【解决方案1】:

我和terragrunt做过类似的项目,看看吧。
它为回答您的要求而生。

oss 网站是https://github.com/gruntwork-io/terragrunt

Terragrunt 是 Terraform 的瘦包装器,它提供了用于处理多个 Terraform 模块的额外工具。 https://www.gruntwork.io

在您的情况下,您可以轻松地为每个客户端使用不同的 tfstate 文件进行管理。

我还建议为每个客户端管理 iam 角色、策略或任何其他资源,不要混合使用。

比如结构会变成to

(我猜你会为每个客户端管理不同的环境,对吧?)

└── bob
    ├── prod
    │   ├── app
    │   │   └── terraform.tfvars
    ├── nonprod
        ├── app
            └── terraform.tfvars
└── alice
    ├── prod
    │   ├── app
    │   │   └── terraform.tfvars
    ├── nonprod
        ├── app
            └── terraform.tfvars

...

以后你掌握了terraform apply-all这个命令后,部署就更简单了。

快速入门

https://github.com/gruntwork-io/terragrunt-infrastructure-modules-example

https://github.com/gruntwork-io/terragrunt-infrastructure-live-example

【讨论】:

  • 正如我从您发布的资源中看到的,有很多方法可以解决此问题,许多专门的开发人员都在尝试这样做,例如 thisthis。感谢您发布的资源,我开始研究更多并学到了很多信息,因此我会接受这个答案,谢谢。
  • 我还需要了解一件事:您是应该从根目录管理这些目录(子项目),还是我应该 cd 进入每个目录并运行 @987654332 @?如果我做后者,那么每个客户的每个嵌套子项目都有自己的.terraform 文件夹,这是正确的做法吗?
  • 使用terragrunt,您根本不需要运行terraform init。其次,如果你知道如何使用plan-allapply-all,你不需要cd到每个子项目/子客户端目录。
猜你喜欢
  • 1970-01-01
  • 2015-10-17
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
  • 2014-05-28
  • 1970-01-01
  • 2012-03-17
  • 1970-01-01
相关资源
最近更新 更多