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