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

时间:2019-02-24 12:14:35

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

我目前正在使用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"
  ...
}

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

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

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

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

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

解决此问题的正确方法是什么?
在这种情况下,最佳做法是什么?

在撰写此文章时,我已经看过类似问题部分中的所有问题,所有这些问题都围绕使用多个.tfstate文件的想法而来,但是我不知道不太了解如何解决我的问题,将不胜感激!

1 个答案:

答案 0 :(得分:1)

我用terragrunt做过类似的项目,看看吧。
它诞生是为了回答您的要求。

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

  

Terragrunt是Terraform的薄包装,它提供了用于处理多个Terraform模块的额外工具。 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