Estou tentando criar um aplicativo do Azure no AD usando o Terraform.
resource "azuread_application" "my_ad_app" {
display_name = "my_app"
#API Permissions
required_resource_access {
resource_app_id = "0000000-000000000000" # Microsoft Graph
resource_access {
id = "df021288-bdef-9214" # User.Read.All
type = "Role"
}
resource_access {
id = "18a4783c662c884" # User.Read.All
type = "Role"
}
resource_access {
id = "9a5d68c3a30" # Application.Read.All
type = "Role"
}
Estarei criando mais alguns aplicativos do Azure AD com as mesmas permissões de API atribuídas. Existem muitas permissões de API que serão atribuídas e são as mesmas para todos os aplicativos do Azure AD que criarei. Como as permissões da API são as mesmas para todos os aplicativos do Azure AD para os quais estarei criando, desejo atribuir tudo required_resource_access
como uma variável.
Algo assim.
#API Permissions
required_resource_access {
resource_app_id = "00000003-0000-0000-c000-000000000000" # Microsoft Graph
resource_access {
assign the entire part as a variable here? Example: var.ms_graph_api_permission
}
Eu tentei adicionar o abaixo como uma variável, mas não parece funcionar.
variable "ms_graph_api_permission" {
type = list(string)
default =
resource_access {
id = "df021288f22de89214"
type = "Role"
}
resource_access {
id = "18a4783e5662c884"
type = "Role"
}
resource_access {
id = "9a5d68ac3a30"
type = "Role"
}
}"
Isso não parece funcionar. Alguma ideia de como automatizar isso?
Eu tentei usar os locais.
locals {
resource_access = [
{
id = "df021288-bdde89214" # User.Read.All
type = "Role"
},
{
id = "18a4783c-85e5662c884" # User.Read.All
type = "Role"
}
]
}
resource "azuread_application" "my_ad_app" {
display_name = "my_app"
#API Permissions
required_resource_access {
for_each = {
for index, az_app_id in local.resource_access:
az_app_id.id => az_app_id
}
resource_app_id = "000000000000" # Microsoft Graph
resource_access = How should I pass values here using locals??
Uma coisa importante a observar para começar aqui é que blocos aninhados como
resource_access
não são dados simples que você pode simplesmente passar em uma variável: eles são construções de configuração estática declaradas pelo provedor em seu esquema. Portanto, você não pode "apenas" passar um conjunto inteiro de blocos por meio de uma variável, mas pode passar alguns dados que seriam usados para preencher esses blocos e solicitar que a linguagem Terraform gereresource_access
blocos dinamicamente para você com base nesses dados. O restante desta resposta é um exemplo de como você pode fazer isso.Primeiro, a declaração da variável:
Isso declara que
var.ms_graph_api_permission
é uma lista de objetos onde cada objeto deve ter dois atributos --id
etype
-- que são ambos strings. Isso parece corresponder à forma dos dados que você deseja fornecer por meio dosresource_access
blocos.Um valor desse tipo seria parecido com o que você tentou com um valor local:
Você pode usar uma expressão como a acima tanto como valor padrão para a variável quanto no
module
bloco que chama o módulo, ao escolher um valor para esta variável.Dentro do próprio bloco de recursos você precisará pedir ao Terraform para gerar um
resource_access
bloco para cada elemento dessa lista, usando umdynamic
bloco :Um
dynamic "resource_access"
bloco especifica uma regra para gerar zero ou maisresource_access
blocos com base em alguma outra coleção, que neste caso évar.ms_graph_api_permission
. Ocontent
bloco descreve como gerar o corpo de cada um dos blocos, onderesource_access
é um símbolo local referente ao elemento atual devar.ms_graph_api_permission
.O Terraform Core expandirá isso dinamicamente para uma série de
resource_access
blocos individuais antes de passar a configuração para o provedor, portanto, da perspectiva do provedor, isso é equivalente a você ter escrito uma série deresource_access
blocos estáticos como no exemplo original.