Terraform遍历列表创建资源时引用现有资源ID报错解决方案
Terraform 批量创建PagerDuty事件规则引用失效修复方案
错误原因
当前写法中给service字段赋值的内容被双引号包裹,Terraform会将其识别为普通字面量字符串,不会解析为对应pagerduty_service资源的实际ID,最终传给PagerDuty API的是类似pagerduty_service.site1.id的无效值,因此触发403权限报错、请求超时。
另外Terraform不支持通过字符串插值动态拼接资源引用路径,这种写法本身不符合Terraform语法逻辑。
前置要求
首先要保证对应的pagerduty_service资源和sites列表同key创建,比如服务资源同样使用for_each = toset(local.sites)创建,两个资源的for_each集合key完全一一对应。
正确写法
将资源块修改为如下形式,移除引用外层的双引号,通过for_each的key直接索引对应服务实例的ID属性:
locals { sites = [ "site1", "site2" ] } resource "pagerduty_service_event_rule" "rule" { for_each = toset(local.sites) # 替换为你自己定义的pagerduty_service资源名,示例中资源名为main service = pagerduty_service.main[each.key].id # 其余事件规则配置保持原有逻辑即可 # ... rest of block }
校验方式
修改完成后先执行terraform plan预览变更,按以下标准判断写法是否正确:
- 正常情况:plan结果中
service字段显示为具体ID值,或提示(known after apply),说明引用逻辑生效 - 异常情况:
service字段显示为pagerduty_service.xxx.id类的字面量内容,说明引用未被正确解析,需要检查资源地址、索引写法是否匹配
内容的提问来源于stack exchange,提问作者smoonin
相关产品推荐
相关产品推荐

