You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 23:00:25