Terraform:为多个客户端部署相同的网络应用程序

Terraform: Deploying the same web-app for multiple clients

我目前正在使用 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 模块的 "glue":

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

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

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

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

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

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

我在写这篇文章时查看了类似问题部分中的所有问题,所有问题都围绕着使用多个 .tfstate 的想法展开文件,但我不太明白这将如何解决我的问题,任何帮助将不胜感激!

我和terragrunt做过类似的项目,看看吧。
应您的要求而生。

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

Terragrunt is a thin wrapper for Terraform that provides extra tools for working with multiple Terraform modules. https://www.gruntwork.io

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

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

例如结构会变成

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

└── 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