我目前正在使用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
文件的想法而来,但是我不知道不太了解如何解决我的问题,将不胜感激!
答案 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