Usare le risorse esistenti

Completato

I file Bicep devono spesso fare riferimento alle risorse create in altre posizioni. Queste risorse potrebbero essere create manualmente, ad esempio da un collega che usa il portale di Azure. Oppure potrebbero essere create in un altro file Bicep. Esistono molti motivi per cui è necessario fare riferimento a queste risorse, ad esempio:

  • Si aggiunge un database SQL in un'istanza del server logico Azure SQL già creata.
  • Si configurano le impostazioni di diagnostica per le risorse definite in un altro modulo Bicep.
  • È necessario accedere in modo sicuro alle chiavi per un account di archiviazione distribuito manualmente nella sottoscrizione.

Bicep fornisce la parola chiave existing da usare in queste situazioni.

Nota

I comandi riportati in questa unità vengono illustrati per spiegare i concetti. Non eseguire ancora i comandi. Presto sarà possibile provare quanto appreso.

Fare riferimento alle risorse esistenti

All'interno di un file Bicep è possibile definire una risorsa già esistente. La dichiarazione è simile alla definizione di una normale risorsa, con alcune differenze principali. Nell'esempio seguente di una definizione di risorsa esistente, la definizione fa riferimento a un account di archiviazione denominato toydesigndocs. L'account di archiviazione si trova nello stesso gruppo di risorse in cui il modello Bicep distribuisce le risorse.

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

Osservare nel dettaglio gli elementi di questa definizione:

  • Come per una normale risorsa, si includono la parola chiave resource, un nome simbolico e il tipo di risorsa e la versione dell'API.

    Nota

    Tenere presente che il nome simbolico viene usato solo all'interno di questo file Bicep. Se si crea questa risorsa usando un file Bicep e vi si fa riferimento usando la risorsa existing in un file Bicep diverso, i nomi simbolici non devono corrispondere.

  • La parola chiave existing indica a Bicep che questa definizione di risorsa è un riferimento a una risorsa già creata e che Bicep non deve tentare di distribuirla.

  • La proprietà name è il nome di risorsa di Azure dell'account di archiviazione distribuito in precedenza.

  • Non è necessario specificare location, sku o properties, poiché il modello non distribuisce la risorsa. Fa semplicemente riferimento a una risorsa esistente. Può essere considerata una risorsa segnaposto.

Fare riferimento alle risorse figlio

È anche possibile fare riferimento a una risorsa figlio esistente. Usare lo stesso tipo di sintassi usato quando è stata distribuita una risorsa figlio. L'esempio seguente illustra come fare riferimento a una subnet esistente, ovvero una risorsa figlio di una rete virtuale. L'esempio usa una risorsa figlio annidata, come illustrato di seguito:

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

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

Si noti che sia la risorsa padre che la risorsa figlio hanno la parola chiave existing applicata.

È quindi possibile fare riferimento alla subnet usando lo stesso operatore :: usato per altre risorse figlio annidate:

output managementSubnetResourceId string = vnet::managementSubnet.id

Fare riferimento alle risorse all'esterno del gruppo di risorse

Spesso è necessario fare riferimento alle risorse in un gruppo di risorse diverso. Ad esempio, se si ha una rete virtuale in un gruppo di risorse centralizzato, è possibile distribuire una macchina virtuale nella rete virtuale nel relativo gruppo di risorse. È possibile usare la parola chiave scope per fare riferimento alle risorse esistenti in un gruppo di risorse diverso. L'esempio seguente illustra come fare riferimento a una rete virtuale denominata toy-design-vnet all'interno del gruppo di risorse networking-rg:

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

Si noti che scope usa la parola chiave resourceGroup() per fare riferimento al gruppo di risorse che contiene la rete virtuale.

È inoltre possibile fare riferimento alle risorse all'interno di una sottoscrizione di Azure diversa, purché la sottoscrizione sia all'interno del tenant di Microsoft Entra. Se il team di rete ha effettuato il provisioning della rete virtuale in un'altra sottoscrizione, il modello potrebbe farvi riferimento, come in questo esempio:

resource vnet 'Microsoft.Network/virtualNetworks@2024-01-01' existing = {
  scope: resourceGroup('A123b4567c-1234-1a2b-2b1a-1234abc12345', 'networking-rg')
  name: 'toy-design-vnet'
}

Si noti che scope usa la parola chiave resourceGroup() per fare riferimento all'ID sottoscrizione di Azure (A123b4567c-1234-1a2b-2b1a-1234abc12345) e al nome del gruppo di risorse che contiene la rete virtuale.

Dopo aver appreso come fare riferimento alle risorse esistenti, si esamini come è possibile usare questa funzionalità nei modelli.

Aggiungere risorse figlio e di estensione in una risorsa esistente

È possibile aggiungere una risorsa figlio a una risorsa padre già creata usando una combinazione della parola chiave existing e della parola chiave parent. Il modello di esempio seguente crea un database SQL di Azure all'interno di un server già esistente:

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

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

Se è necessario distribuire una risorsa di estensione in una risorsa esistente, è possibile usare la parola chiave scope. Di seguito è riportato un modello che usa la parola chiave existing e la parola chiave scope per aggiungere un blocco di risorsa a un account di archiviazione già esistente:

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

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

Fare riferimento alle proprietà di una risorsa esistente

Le risorse devono spesso fare riferimento alle proprietà di altre risorse. Ad esempio, se si distribuisce un'applicazione, potrebbe essere necessario conoscere le chiavi o le informazioni di connessione per un'altra risorsa. Usando la parola chiave existing, si ottiene l'accesso alle proprietà della risorsa a cui viene fatto riferimento.

Suggerimento

È consigliabile cercare le chiavi da altre risorse in questo modo anziché passarle attraverso gli output. Si otterranno sempre i dati più aggiornati. Inoltre, aspetto importante, gli output non sono progettati per gestire dati sicuri, ad esempio le chiavi.

Il modo in cui si accede alle informazioni su una risorsa dipende dal tipo di informazioni che si stanno ottenendo. Se si tratta di una proprietà non sicura, in genere si usa solo properties della risorsa. Il modello di esempio seguente distribuisce un'applicazione Funzioni di Azure e usa i dettagli di accesso (chiave di strumentazione) per un'istanza di Application Insights già creata:

resource applicationInsights 'Microsoft.Insights/components@2020-02-02' existing = {
  name: applicationInsightsName
}

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

In questo esempio poiché la chiave di strumentazione non è considerata dati sensibili, è disponibile in properties della risorsa. Quando è necessario accedere a dati sicuri, ad esempio alle credenziali da usare per accedere a una risorsa, usare la funzione listKeys(), come illustrato nel codice seguente:

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

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

Si noti che la funzione listKeys restituisce una matrice keys. Il codice Bicep recupera la proprietà value dal primo elemento nella matrice keys. Per ogni tipo di risorsa sono disponibili informazioni diverse dalla funzione listKeys(). L'estensione Bicep per Visual Studio Code offre suggerimenti utili per comprendere i dati restituiti dalla funzione listKeys() di ogni risorsa. Lo screenshot seguente mostra l'output della funzione listKeys() per un account di archiviazione:

Screenshot dell'estensione Bicep per Visual Studio Code. IntelliSense visualizza diverse informazioni restituite dalla funzione listKeys per un account di archiviazione.

Alcune risorse supportano anche altre funzioni. IntelliSense di Visual Studio Code elenca le funzioni disponibili per ogni risorsa. Nello screenshot seguente è possibile notare che gli account di archiviazione forniscono funzioni denominate listAccountSas() e listServiceSas() oltre a listKeys():

Screenshot dell'estensione Bicep per Visual Studio Code. IntelliSense visualizza diverse funzioni disponibili per l'account di archiviazione.

Importante

La funzione listKeys() fornisce l'accesso ai dati sensibili sulla risorsa. Ciò significa che l'utente o l'entità servizio che esegue la distribuzione deve avere il livello di autorizzazione appropriato per la risorsa. Si tratta in genere del ruolo predefinito Collaboratore o di un ruolo personalizzato che assegna l'autorizzazione appropriata.