Terraform资源间for_each链式调用报错问题排查
Terraform AzureAD 资源链式调用错误排查与修复
错误根源分析
第一个错误:Missing resource instance key
当资源通过for_each创建多实例时,不能直接通过资源名访问全局属性(如azuread_application.my-test-app.application_id),必须指定具体的实例键(如azuread_application.my-test-app[each.key]),否则Terraform无法确定要引用哪个实例的属性。
第二个错误:Unsupported attribute
你调整后出现这个错误,是因为错误地将azuread_service_principal的for_each设置为var.custom_ids(字符串集合),此时each.value是字符串类型,自然没有application_id属性。正确的做法是让service_principal的for_each关联到azuread_application的实例集合,这样each.value才是AzureAD应用实例对象,包含application_id等属性。
另外还有一个隐藏问题:azuread_service_principal的owners字段中,你写的each.value是应用实例对象,而该字段需要的是用户/组的Object ID字符串,这里应该对应到var.custom_ids中的原始值。
修正后的完整代码
variables.tf
variable "custom_ids" { type = set(string) default = ["b4d2d", "c928f140e8"] }
main.tf
data "azuread_client_config" "current" {} resource "azuread_application" "my-test-app" { for_each = var.custom_ids display_name = "testing-application" owners = [data.azuread_client_config.current.object_id, each.value] } resource "azuread_service_principal" "testing-sp" { # 关联到azuread_application的实例集合,每个应用对应一个服务主体 for_each = azuread_application.my-test-app # 直接引用当前实例的application_id application_id = each.value.application_id app_role_assignment_required = false # owners使用var.custom_ids中的原始值(each.key对应集合中的元素) owners = [data.azuread_client_config.current.object_id, each.key] }
关键修正点说明
azuread_service_principal的for_each设置为azuread_application.my-test-app,实现应用与服务主体的一一对应链式创建。application_id使用each.value.application_id,each.value此时是azuread_application的实例对象,可直接访问其属性。owners字段替换为each.key,因为each.key对应var.custom_ids中的字符串(即你要设置的Owner ID),而each.value是应用实例,不能直接作为Owner ID使用。
内容的提问来源于stack exchange,提问作者Container-Man
相关产品推荐
相关产品推荐

