使用Terraform创建AWS API Gateway嵌套资源时parent ID关联错误如何解决
问题根因分析
- 资源引用名称错误:你定义的父资源名称是
aws_api_gateway_resource.parent,但子资源的parent_id字段中写的是aws_api_gateway_resource.managed,资源名不匹配,本身就无法读取到正确的父资源对象。 - 子资源遍历逻辑错误:
var.restapi.resource是父资源的map集合,每个父资源单独持有自己的childs属性,你直接全局取var.restapi.resource.childs是将所有子资源扁平遍历,无法和对应父资源做关联,自然会出现path_part和预期不符的问题。 - 取值逻辑错误:
element()是按列表下标取值,而Terraform中map的遍历顺序不固定,和你使用的字符串类型each.key完全不匹配,最终导致随机取到其他父资源的ID。
修复方案
首先统一变量var.restapi.resource的结构规范,保证每个父资源下单独挂载自己的子资源:
variable "restapi" { type = object({ resource = map(object({ path = string childs = map(object({ path = string })) })) }) }
先修正父资源逻辑,将按索引取值改为直接按key匹配,保证稳定性:
resource "aws_api_gateway_resource" "parent" { for_each = var.restapi.resource path_part = each.value.path parent_id = aws_api_gateway_rest_api.managed[each.key].root_resource_id rest_api_id = aws_api_gateway_rest_api.managed[each.key].id }
子资源改用flatten展开所有父资源下的子资源,同时绑定父资源的key,保证关联关系准确:
resource "aws_api_gateway_resource" "childs" { for_each = { # 生成 父资源key/子资源key 格式的唯一标识,避免key冲突 for idx, child in flatten([ for parent_key, parent_val in var.restapi.resource : [ for child_key, child_val in parent_val.childs : { parent_key = parent_key child_key = child_key path = child_val.path } ] ]) : "${child.parent_key}/${child.child_key}" => child } path_part = each.value.path parent_id = aws_api_gateway_resource.parent[each.value.parent_key].id rest_api_id = aws_api_gateway_rest_api.managed[each.value.parent_key].id }
修复后效果
- 子资源通过绑定的
parent_key直接关联对应父资源ID,不会再出现乱取ID的问题 - 子资源的
path_part会和每个父资源下定义的子资源路径完全匹配,不会出现路径错乱 - 移除了冗余的
depends_on配置,因子资源直接引用父资源属性,Terraform会自动生成依赖关系
内容的提问来源于stack exchange,提问作者Unity
相关产品推荐
相关产品推荐

