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

问题描述 投票:0回答:1

我目前正在使用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文件的想法,但我不太明白这将如何解决我的问题,任何帮助都会非常感谢!

amazon-web-services terraform amazon-ecs consul
1个回答
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之后,它会使部署更简单,更容易。

Quick start

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

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

© www.soinside.com 2019 - 2024. All rights reserved.