如何在Terraform中为DynamoDB表名添加环境前缀?
问题描述
我有如下Terragrunt配置,希望为其添加指定环境前缀:
envs: - dev - stg tables: dynamo-db-table: hash_key: "key" attributes: - name: "key" type: "S"
配合以下Terraform模块:
module "dynamodb_table" { source = "terraform-aws-modules/dynamodb-table/aws" version = "3.3.0" for_each = var.tables name = each.key hash_key = each.value.hash_key attributes = each.value.attributes } variable "tables" { description = "Dynamodb tables" type = map(object({ hash_key = string attributes = list(map(string)) })) }
执行配置后,我希望最终创建两个DynamoDB表:dev-dynamo-db-table和stg-dynamo-db-table。我猜测可通过locals将envs值拼接至map键,但不确定具体方法,也想了解是否有更简便的实现方式?
解决方案
方法一:Terraform层用locals生成带前缀的表配置
在你的Terraform代码中添加locals块,遍历环境列表和原始表配置,生成包含环境前缀的新表map,供模块调用:
# 新增envs变量定义 variable "envs" { description = "目标环境列表" type = list(string) } locals { # 合并环境与表配置,生成带前缀的键值对 tables_with_envs = merge([ for env in var.envs : { for table_name, table_config in var.tables : "${env}-${table_name}" => { hash_key = table_config.hash_key attributes = table_config.attributes } } ]...) } module "dynamodb_table" { source = "terraform-aws-modules/dynamodb-table/aws" version = "3.3.0" for_each = local.tables_with_envs # 使用处理后的map name = each.key # 直接用带前缀的键作为表名 hash_key = each.value.hash_key attributes = each.value.attributes }
同时在Terragrunt配置中传递envs变量:
envs: - dev - stg tables: dynamo-db-table: hash_key: "key" attributes: - name: "key" type: "S" inputs: envs: ${self.envs} tables: ${self.tables}
方法二:Terragrunt层直接处理配置(更简便)
如果不想修改Terraform模块代码,可以直接在Terragrunt里生成带前缀的表配置,再传递给Terraform:
envs: - dev - stg tables: dynamo-db-table: hash_key: "key" attributes: - name: "key" type: "S" locals: # 在Terragrunt中生成带环境前缀的表配置map tables_with_envs: > ${merge( for env in self.envs: { for table_name, table_config in self.tables: "${env}-${table_name}" => table_config }... )} inputs: tables: ${local.tables_with_envs}
这种方式下,Terraform模块无需任何修改,直接使用var.tables(已包含前缀)创建表即可。
两种方法对比
- 方法一逻辑在Terraform层,通用性更强,适合需要在多个环境复用模块的场景;
- 方法二更轻量化,无需改动Terraform代码,适合快速实现需求的场景。
内容的提问来源于stack exchange,提问作者davo777
相关产品推荐
相关产品推荐

