Trabalhar com recursos existentes

Concluído

Os arquivos Bicep geralmente precisam se referir a recursos que foram criados em outro lugar. Esses recursos podem ser criados manualmente, talvez por um colega usando o portal do Azure. Ou eles podem ser criados em outro arquivo Bicep. Há muitas razões pelas quais você precisa se referir a esses recursos, como:

  • Você está adicionando um banco de dados SQL a uma instância do servidor lógico SQL do Azure que alguém já criou.
  • Você está definindo configurações de diagnóstico para recursos definidos em outro módulo do Bicep.
  • Você precisa acessar com segurança as chaves de uma conta de armazenamento que foi implantada manualmente em sua assinatura.

Bicep fornece a existing palavra-chave para você usar nessas situações.

Nota

Os comandos nesta unidade são mostrados para ilustrar conceitos. Não execute os comandos ainda. Você vai praticar o que você aprende aqui em breve.

Consulte os recursos existentes

Dentro de um arquivo Bicep, você pode definir um recurso que já existe. A declaração é semelhante a uma definição de recurso normal, mas há algumas diferenças importantes. No exemplo a seguir de uma definição de recurso existente, a definição refere-se a uma conta de armazenamento chamada toydesigndocs. A conta de armazenamento está no mesmo grupo de recursos no qual seu modelo Bicep está implantando recursos.

resource storageAccount 'Microsoft.Storage/storageAccounts@2019-06-01' existing = {
  name: 'toydesigndocs'
}

Vejamos de perto o que compõe essa definição:

  • Como faria com um recurso normal, inclua a palavra-chave, um nome simbólico e o tipo de recurso e a resource versão da API.

    Nota

    Lembre-se, o nome simbólico é usado apenas dentro deste arquivo Bicep. Se você criar esse recurso usando um arquivo Bicep e se referir a ele usando o existing recurso em um arquivo Bicep diferente, os nomes simbólicos não precisarão corresponder.

  • A existing palavra-chave indica ao Bicep que essa definição de recurso é uma referência a um recurso já criado e que o Bicep não deve tentar implantá-lo.

  • A name propriedade é o nome do recurso do Azure da conta de armazenamento que foi implantada anteriormente.

  • Não é necessário especificar o , ou , skuporque o modelo não implanta propertieso locationrecurso. Limita-se a fazer referência a um recurso existente. Pense nisso como um recurso de espaço reservado.

Consulte os recursos filho

Você também pode fazer referência a um recurso filho existente. Use o mesmo tipo de sintaxe que você usou quando implantou um recurso filho. O exemplo a seguir mostra como você pode se referir a uma sub-rede existente, que é um recurso filho de uma rede virtual. O exemplo usa um recurso filho aninhado, conforme mostrado aqui:

resource vnet 'Microsoft.Network/virtualNetworks@2020-11-01' existing = {
  name: 'toy-design-vnet'

  resource managementSubnet 'subnets' existing = {
    name: 'management'
  }
}

Observe que o recurso pai e filho tem a existing palavra-chave aplicada.

Em seguida, você pode fazer referência à sub-rede usando o mesmo :: operador que usa para outros recursos filho aninhados:

output managementSubnetResourceId string = vnet::managementSubnet.id

Consulte recursos fora do grupo de recursos

Muitas vezes, você precisa se referir a recursos em um grupo de recursos diferente. Por exemplo, se você tiver uma rede virtual em um grupo de recursos centralizado, convém implantar uma máquina virtual nessa rede virtual em seu próprio grupo de recursos. Você pode usar a scope palavra-chave para se referir a recursos existentes em um grupo de recursos diferente. O exemplo a seguir mostra como você pode se referir a uma rede virtual nomeada toy-design-vnet dentro do networking-rg grupo de recursos:

resource vnet 'Microsoft.Network/virtualNetworks@2020-11-01' existing = {
  scope: resourceGroup('networking-rg')
  name: 'toy-design-vnet'
}

Observe que o scope usa a palavra-chave para se referir ao grupo de recursos que contém a resourceGroup() rede virtual.

Você pode até mesmo fazer referência a recursos dentro de uma assinatura diferente do Azure, desde que a assinatura esteja dentro do seu locatário do Microsoft Entra. Se sua equipe de rede provisionar a rede virtual em uma assinatura diferente, o modelo poderá se referir a ela, como neste exemplo:

resource vnet 'Microsoft.Network/virtualNetworks@2020-11-01' existing = {
  scope: resourceGroup('f0750bbe-ea75-4ae5-b24d-a92ca601da2c', 'networking-rg')
  name: 'toy-design-vnet'
}

Observe que o scope usa a palavra-chave para se referir à ID de assinatura do Azure (f0750bbe-ea75-4ae5-b24d-a92ca601da2c) e ao nome do grupo de recursos que contém a resourceGroup() rede virtual.

Agora que você entende como se referir aos recursos existentes, vamos ver como você pode usar esse recurso em seus modelos.

Adicionar recursos filho e de extensão a um recurso existente

Você pode adicionar um recurso filho a um recurso pai já criado usando uma combinação da palavra-chave e da existingparent palavra-chave. O modelo de exemplo a seguir cria um banco de dados SQL do Azure em um servidor que já existe:

resource server 'Microsoft.Sql/servers@2020-11-01-preview' existing = {
  name: serverName
}

resource database 'Microsoft.Sql/servers/databases@2020-11-01-preview' = {
  parent: server
  name: databaseName
  location: location
  sku: {
    name: 'Standard'
    tier: 'Standard'
  }
}

Se você precisar implantar um recurso de extensão em um recurso existente, poderá usar a scope palavra-chave. Aqui está um modelo que usa a palavra-chave e a palavra-chave para adicionar um bloqueio de recurso a existingscope uma conta de armazenamento que já existe:

resource storageAccount 'Microsoft.Storage/storageAccounts@2019-06-01' existing = {
  name: 'toydesigndocs'
}

resource lockResource 'Microsoft.Authorization/locks@2016-09-01' = {
  scope: storageAccount
  name: 'DontDelete'
  properties: {
    level: 'CanNotDelete'
    notes: 'Prevents deletion of the toy design documents storage account.'
  }
}

Consulte as propriedades de um recurso existente

Os recursos geralmente precisam se referir às propriedades de outros recursos. Por exemplo, se você implantar um aplicativo, talvez seja necessário saber as chaves ou informações de conexão de outro recurso. Usando a existing palavra-chave, você obtém acesso às propriedades do recurso ao qual está se referindo.

Gorjeta

É uma prática recomendada procurar chaves de outros recursos dessa maneira em vez de passá-las pelas saídas. Obterá sempre os dados mais atualizados. Além disso, é importante ressaltar que as saídas não são projetadas para lidar com dados seguros, como chaves.

A maneira como você acessa as informações sobre um recurso depende do tipo de informação que você está recebendo. Se for uma propriedade que não é segura, normalmente você usa apenas o properties do recurso. O modelo de exemplo a seguir implanta um aplicativo do Azure Functions e usa os detalhes de acesso (chave de instrumentação) para uma instância do Application Insights que já foi criada:

resource applicationInsights 'Microsoft.Insights/components@2018-05-01-preview' existing = {
  name: applicationInsightsName
}

resource functionApp 'Microsoft.Web/sites@2020-06-01' = {
  name: functionAppName
  location: location
  kind: 'functionapp'
  properties: {
    siteConfig: {
      appSettings: [
        // ...
        {
          name: 'APPINSIGHTS_INSTRUMENTATIONKEY'
          value: applicationInsights.properties.InstrumentationKey
        }
      ]
    }
  }
}

Neste exemplo, como a chave de instrumentação não é considerada dados confidenciais, ela está disponível no properties recurso do recurso. Quando precisar acessar dados seguros, como as credenciais a serem usadas para acessar um recurso, use a função, conforme mostrado no código a listKeys() seguir:

resource storageAccount 'Microsoft.Storage/storageAccounts@2019-06-01' existing = {
  name: storageAccountName
}

resource functionApp 'Microsoft.Web/sites@2020-06-01' = {
  name: functionAppName
  location: location
  kind: 'functionapp'
  properties: {
    siteConfig: {
      appSettings: [
        // ...
        {
          name: 'StorageAccountKey'
          value: storageAccount.listKeys().keys[0].value
        }
      ]
    }
  }
}

Observe que a listKeys função retorna uma keys matriz. O código Bicep recupera a value propriedade do primeiro item da keys matriz. Cada tipo de recurso tem informações diferentes disponíveis da listKeys() função. A extensão Bicep para Visual Studio Code fornece dicas para ajudá-lo a entender os dados que a função de listKeys() cada recurso retorna. A captura de tela a seguir mostra a listKeys() saída da função para uma conta de armazenamento:

Screenshot of the Bicep extension for Visual Studio Code. IntelliSense displays several the information returned by the listKeys function for a storage account.

Alguns recursos também suportam outras funções. O IntelliSense do Visual Studio Code lista as funções disponíveis para cada recurso. Na captura de tela a seguir, você pode ver que as contas de armazenamento fornecem funções nomeadas listAccountSas() e listServiceSas() além de listKeys():

Screenshot of the Bicep extension for Visual Studio Code. IntelliSense displays several functions available for the storage account.

Importante

A listKeys() função fornece acesso a dados confidenciais sobre o recurso. Isso significa que o usuário ou entidade de serviço que executa a implantação precisa ter o nível apropriado de permissão no recurso. Normalmente, essa é a função interna de Colaborador ou uma função personalizada que atribui a permissão apropriada.