Usare le risorse esistenti
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
oproperties
, 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-05-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-05-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-05-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@2024-05-01-preview' existing = {
name: serverName
}
resource database 'Microsoft.Sql/servers/databases@2024-05-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@2024-04-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@2024-04-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:
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()
:
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.