如何在Terragrunt中实现字段可变的多模块实例化,匹配原生Terraform效果
Terragrunt多SNS主题实例实现方案
以下是两种可直接落地的实现方式,适配不同的使用场景:
方式一:按实例拆分目录(符合Terragrunt原生设计,适合实例需要单独管控权限/生命周期的场景)
Terragrunt的默认设计逻辑为「一个目录对应一个Terraform模块实例」,要实现每个实例配置不同,直接为每个SNS主题创建独立目录即可:
- 首先搭建目录结构,示例如下:
sns-topics/ ├── my-topic/ │ └── terragrunt.hcl ├── my-topic-two/ │ └── terragrunt.hcl └── my-topic-three/ └── terragrunt.hcl
- 每个子目录下的
terragrunt.hcl分别指定对应实例的配置,所有SNS模块支持的参数都可以直接放到inputs字段中,不需要提前统一定义结构,比如my-topic-two/terragrunt.hcl内容为:
terraform { source = "tfr:///terraform-aws-modules/sns/aws?version=~> 3.0" } inputs = { name = "my-topic-two" content_based_deduplication = true }
- 部署时可以单独进入某个目录执行
terragrunt apply部署单个主题,也可以在sns-topics根目录执行terragrunt run-all apply批量部署所有主题。
方式二:单目录封装循环(适合实例数量多、统一生命周期管理的场景)
如果有上百个主题不想创建大量目录,可以自己封装一层薄的Terraform包装模块,用for_each循环批量实例化SNS模块,再通过Terragrunt的inputs传入所有主题的配置集合即可:
- 首先编写本地包装模块
modules/sns-topics/main.tf:
variable "topics" { type = map(any) description = "所有SNS主题的配置集合,key为主题唯一标识,value为SNS模块支持的参数集合" } module "sns_topics" { for_each = var.topics source = "terraform-aws-modules/sns/aws" version = "~> 3.0" # 直接展开每个主题的所有自定义配置 each.value... }
- 部署目录下的
terragrunt.hcl内容为:
terraform { source = "./modules/sns-topics" # 指向你本地的包装模块路径 } inputs = { topics = { my-topic = { name = "my-topic" } my-topic-two = { name = "my-topic-two" content_based_deduplication = true } my-topic-three = { name = "my-topic-three" http_success_feedback_role_arn = "x" http_success_feedback_sample_rate = "y" http_failure_feedback_role_arn = "z" } # 后续新增主题直接在topics映射中添加对应配置即可 } }
内容的提问来源于stack exchange,提问作者Howard_Roark
相关产品推荐
相关产品推荐

