Непредсказуемая часть - это значения атрибута id
из azurerm_resource_group.setup
. Поскольку вы используете их в качестве некоторых ключей на своей карте, в результате получается карта, набор ключей которой не полностью известен, и, следовательно, Terraform не может определить, сколько элементов в конечном итоге будет на этой карте и какие будут все их ключи. be.
Чтобы это работало, я бы предложил вместо этого использовать в качестве ключей строки из local.components
, поскольку вы отметили, что они являются константами в вашей конфигурации и, таким образом, гарантированно будут известны при планировании:
for_each = merge(
{ for component in local.components : component => azurerm_resource_group.setup[component].id },
{ "from_remote_state" = module.component_remote_state.rg_id },
)
Выше предполагается, что local.components
никогда не будет содержать строку from_remote_state
, и, таким образом, безопасно использовать в качестве имени специального компонента для работы с этим дополнительным значением, которое не работает так же, как другие , Поскольку вы понимаете требования для этого лучше, чем я, вы могли бы найти другое имя более подходящим там, но общая идея здесь состоит в том, чтобы создать карту, ключи которой всем известны, даже если некоторые значения не являются:
{
"web": (known after apply),
"data": (known after apply),
"from_remote_state": "<your known rg id from the remote state>",
}
Исходя из этого, Terraform может видеть, сколько экземпляров ресурсов вы собираетесь создать и какими должны быть их адреса:
azurerm_role_assignment.pod_sp["web"]
azurerm_role_assignment.pod_sp["data"]
azurerm_role_assignment.pod_sp["from_remote_state"]