如何在Terraform中用单个资源块为多AWS提供商创建aws_ssm_parameter
Terraform 多区域创建相同 SSM 参数的简化方案
你可以通过两种方式减少重复代码,首先需要明确 Terraform 的 provider 元参数不支持动态插值,无法直接在单个资源块中通过遍历动态指定不同区域的提供商。
方案1:抽离公共配置(改动最小,适合少量多区域资源)
将重复的参数统一收敛到 locals 块中,后续修改配置只需要调整一处:
# 抽离所有公共配置 locals { ssm_writer_endpoint_name = "/aurora/${var.environment}-${var.service_name}-primary-cluster/writer-endpoint" ssm_writer_endpoint_value = aws_rds_cluster.primary.endpoint ssm_base_config = { type = "String" overwrite = true } } # 主区域参数 resource "aws_ssm_parameter" "primary_writer_endpoint" { name = local.ssm_writer_endpoint_name value = local.ssm_writer_endpoint_value type = local.ssm_base_config.type overwrite = local.ssm_base_config.overwrite } # 副本区域参数 resource "aws_ssm_parameter" "primary_writer_endpoint_replica_region" { provider = aws.replica name = local.ssm_writer_endpoint_name value = local.ssm_writer_endpoint_value type = local.ssm_base_config.type overwrite = local.ssm_base_config.overwrite }
方案2:本地模块封装(完全消除重复,适合多区域资源多、后续会扩容的场景)
将SSM参数的创建逻辑封装为本地子模块,不同区域调用同一个模块即可:
- 新建本地模块目录
./modules/aurora_ssm_writer,在目录下创建main.tf:
variable "environment" { type = string } variable "service_name" { type = string } variable "writer_endpoint" { type = string } resource "aws_ssm_parameter" "writer_endpoint" { name = "/aurora/${var.environment}-${var.service_name}-primary-cluster/writer-endpoint" type = "String" value = var.writer_endpoint overwrite = true }
- 根目录配置文件中调用两次模块,分别传入不同区域的提供商:
# 主区域SSM参数 module "primary_ssm_writer" { source = "./modules/aurora_ssm_writer" environment = var.environment service_name = var.service_name writer_endpoint = aws_rds_cluster.primary.endpoint } # 副本区域SSM参数 module "replica_ssm_writer" { source = "./modules/aurora_ssm_writer" providers = { aws = aws.replica } environment = var.environment service_name = var.service_name writer_endpoint = aws_rds_cluster.primary.endpoint }
后续新增区域时,只需要新增对应的provider声明,再追加一次模块调用即可,不需要重复写资源定义。
内容的提问来源于stack exchange,提问作者Bruno Schaatsbergen
相关产品推荐
相关产品推荐

