Definir recursos filho
Faz sentido utilizar alguns recursos apenas no contexto dos seus pais. Esses recursos são chamados de recursos filho. Há muitos tipos de recursos filho no Azure. Eis alguns exemplos:
Nome | Tipo de recurso |
---|---|
Sub-redes de rede virtual | Microsoft.Network/virtualNetworks/subnets |
Configuração do Serviço de Aplicativo | Microsoft.Web/sites/config |
Bases de Dados SQL | Microsoft.Sql/servers/databases |
Extensões de máquina virtual | Microsoft.Compute/virtualMachines/extensions |
Contêineres de blob de armazenamento | Microsoft.Storage/storageAccounts/blobServices/containers |
Contêineres do Azure Cosmos DB | Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers |
Por exemplo, vamos considerar um contêiner de blob de armazenamento. Um contêiner de blob deve ser implantado em uma conta de armazenamento e não faz sentido que um contêiner exista fora de uma conta de armazenamento.
Os tipos de recursos filho têm nomes mais longos com várias partes. Um contêiner de blob de armazenamento tem este nome de tipo totalmente qualificado: Microsoft.Storage/storageAccounts/blobServices/containers
. A ID do recurso para um contêiner de blob inclui o nome da conta de armazenamento que contém o contêiner e o nome do contêiner.
Nota
Alguns recursos filho podem ter o mesmo nome que outros tipos de recursos filho de pais diferentes. Por exemplo, containers
é um tipo filho de contas de armazenamento e bancos de dados do Azure Cosmos DB. Os nomes são os mesmos, mas representam recursos diferentes, e seus nomes de tipo totalmente qualificados são diferentes.
Como são definidos os recursos infantis?
Com o Bicep, você pode declarar recursos filho de várias maneiras diferentes. Cada caminho tem suas próprias vantagens, e cada um é adequado para algumas situações e não para outras. Vejamos cada abordagem.
Gorjeta
Todas as abordagens a seguir resultam nas mesmas atividades de implantação no Azure. Você pode escolher a abordagem que melhor se adapta às suas necessidades sem ter que se preocupar em quebrar algo. E você pode atualizar seu modelo e alterar a abordagem que está usando.
Recursos aninhados
Uma abordagem para definir um recurso filho é aninhar o recurso filho dentro do pai. Aqui está um exemplo de um modelo Bicep que implanta uma máquina virtual e uma extensão de máquina virtual. Uma extensão de máquina virtual é um recurso filho que fornece comportamento extra para uma máquina virtual. Nesse caso, a extensão executa um script personalizado na máquina virtual após a implantação.
resource vm 'Microsoft.Compute/virtualMachines@2024-07-01' = {
name: vmName
location: location
properties: {
// ...
}
resource installCustomScriptExtension 'extensions' = {
name: 'InstallCustomScript'
location: location
properties: {
// ...
}
}
}
Observe que o recurso aninhado tem um tipo de recurso mais simples do que o normal. Embora o nome do tipo totalmente qualificado seja Microsoft.Compute/virtualMachines/extensions
, o recurso aninhado herda automaticamente o tipo de recurso pai, portanto, você precisa especificar apenas o tipo de recurso filho, extensions
.
Observe também que não há nenhuma versão da API especificada para o recurso aninhado. O Bicep pressupõe que você deseja usar a mesma versão da API que o recurso pai, embora você possa substituir a versão da API se desejar.
Você pode fazer referência a um recurso aninhado usando o ::
operador . Por exemplo, você pode criar uma saída que retorna a ID de recurso completa da extensão:
output childResourceId string = vm::installCustomScriptExtension.id
Aninhar recursos é uma maneira simples de declarar um recurso filho. Os recursos de aninhamento também tornam a relação pai-filho óbvia para qualquer pessoa que leia o modelo. No entanto, se você tiver muitos recursos aninhados ou várias camadas de aninhamento, os modelos podem se tornar mais difíceis de ler. Você também pode aninhar recursos apenas até cinco camadas de profundidade.
Propriedade pai
Uma segunda abordagem é declarar o recurso filho sem qualquer aninhamento. Em seguida, use a propriedade para informar o parent
Bicep sobre a relação pai-filho:
resource vm 'Microsoft.Compute/virtualMachines@2024-07-01' = {
name: vmName
location: location
properties: {
// ...
}
}
resource installCustomScriptExtension 'Microsoft.Compute/virtualMachines/extensions@2024-07-01' = {
parent: vm
name: 'InstallCustomScript'
location: location
properties: {
// ...
}
}
Observe que o recurso filho usa a parent
propriedade para se referir ao nome simbólico de seu pai.
Essa abordagem para referenciar o pai é outra maneira fácil de declarar um recurso filho. O Bicep entende a relação entre recursos pai e filho, portanto, você não precisa especificar o nome do recurso totalmente qualificado ou configurar uma dependência entre os recursos. A abordagem também evita ter muito aninhamento, que pode se tornar difícil de ler. No entanto, você precisa especificar explicitamente o tipo de recurso completo e a versão da API sempre que definir um recurso filho usando a parent
propriedade.
Para se referir a um recurso filho declarado com a parent
propriedade, use seu nome simbólico como faria com um recurso pai normal:
output childResourceId string = installCustomScriptExtension.id
Construir o nome do recurso
Há algumas circunstâncias em que você não pode usar recursos aninhados ou a parent
palavra-chave. Os exemplos incluem quando você declara recursos filho dentro de um for
loop ou quando precisa usar expressões complexas para selecionar dinamicamente um recurso pai para um filho. Nessas situações, você pode implantar um recurso filho construindo manualmente o nome do recurso filho para que ele inclua seu nome de recurso pai, conforme mostrado aqui:
resource vm 'Microsoft.Compute/virtualMachines@2024-07-01' = {
name: vmName
location: location
properties: {
// ...
}
}
resource installCustomScriptExtension 'Microsoft.Compute/virtualMachines/extensions@2024-07-01' = {
name: '${vm.name}/InstallCustomScript'
location: location
properties: {
// ...
}
}
Observe que este exemplo usa interpolação de cadeia de caracteres para acrescentar a propriedade de recurso name
de máquina virtual ao nome do recurso filho. O Bíceps entende que há uma dependência entre os recursos do seu filho e dos pais. Você pode declarar o nome do recurso filho usando a vmName
variável em vez disso. Se você fizer isso, no entanto, sua implantação poderá falhar porque o Bicep não entenderia que o recurso pai precisa ser implantado antes do recurso filho:
Para resolver essa situação, você pode informar manualmente o Bicep sobre a dependência usando a dependsOn
palavra-chave, conforme mostrado aqui:
resource vm 'Microsoft.Compute/virtualMachines@2024-07-01' = {
name: vmName
location: location
properties: {
// ...
}
}
resource installCustomScriptExtension 'Microsoft.Compute/virtualMachines/extensions@2024-07-01' = {
name: '${vmName}/InstallCustomScript'
dependsOn: [
vm
]
//...
}
Gorjeta
Geralmente, é melhor evitar a construção de nomes de recursos, porque você perde muitos dos benefícios que o Bicep pode fornecer quando entende as relações entre seus recursos. Use essa opção somente quando não puder usar uma das outras abordagens para declarar recursos filho.
IDs de recursos filho
Você começa a criar uma ID de recurso filho incluindo a ID de recurso pai e, em seguida, anexando o tipo de recurso filho e o nome. Por exemplo, vamos considerar uma conta do Azure Cosmos DB chamada toyrnd
. O provedor de recursos do Azure Cosmos DB expõe um tipo chamado databaseAccounts
, que é o recurso pai que você implanta:
/subscriptions/A123b4567c-1234-1a2b-2b1a-1234abc12345/resourceGroups/ToyDevelopment/providers/Microsoft.DocumentDB/databaseAccounts/toyrnd
Aqui está uma representação visual do mesmo ID de recurso:
Se adicionarmos um banco de dados a essa conta, poderemos usar o sqlDatabases
tipo de recurso filho. Vamos adicionar um banco de dados nomeado FlightTests
à nossa conta do Azure Cosmos DB e dar uma olhada na ID do recurso filho:
/subscriptions/A123b4567c-1234-1a2b-2b1a-1234abc12345/resourceGroups/ToyDevelopment/providers/Microsoft.DocumentDB/databaseAccounts/toyrnd/sqlDatabases/FlightTests
Aqui está uma representação visual:
Você pode ter vários níveis de recursos filho. Aqui está um exemplo de ID de recurso que mostra uma conta de armazenamento com dois níveis de filhos:
/subscriptions/A123b4567c-1234-1a2b-2b1a-1234abc12345/resourceGroups/ToyDevelopment/providers/Microsoft.Storage/storageAccounts/secrettoys/blobServices/default/containers/glitterspecs
Aqui está uma representação visual do mesmo ID de recurso:
Este ID de recurso tem vários componentes:
Tudo até
secrettoys
é o ID do recurso pai.blobServices
Indica que o recurso está dentro de um tipo de recurso filho chamadoblobServices
.Nota
Você não precisa criar
blobServices
recursos sozinho. OMicrosoft.Storage
provedor de recursos cria automaticamente esse recurso para você quando você cria uma conta de armazenamento. Esse tipo de recurso às vezes é chamado de recurso implícito . Eles são bastante incomuns, mas você os encontrará em todo o Azure.default
é o nome doblobServices
recurso filho.Nota
Às vezes, apenas uma única instância de um recurso filho é permitida. Esse tipo de instância é chamado de singleton, e geralmente recebe o nome
default
.containers
Indica que o recurso está dentro de um tipo de recurso filho chamadocontainers
.glitterspecs
é o nome do contêiner de blob.
Quando você trabalha com recursos filho, as IDs de recursos podem ficar longas e parecer complicadas. No entanto, se você dividir um ID de recurso em suas partes componentes, será mais fácil entender como o recurso é estruturado. Um ID de recurso também pode fornecer pistas importantes sobre como o recurso se comporta.