Werken met bestaande resources

Voltooid

Bicep-bestanden moeten vaak verwijzen naar resources die elders zijn gemaakt. Deze resources kunnen handmatig worden gemaakt, misschien door een collega met behulp van Azure Portal. Of ze kunnen worden gemaakt in een ander Bicep-bestand. Er zijn veel redenen waarom u naar deze resources moet verwijzen, zoals:

  • U voegt een SQL-database toe aan een exemplaar van een logische Azure SQL-server dat al door iemand is gemaakt.
  • U configureert diagnostische instellingen voor resources die zijn gedefinieerd in een andere Bicep-module.
  • U moet veilig toegang krijgen tot de sleutels voor een opslagaccount dat handmatig in uw abonnement is geïmplementeerd.

Bicep biedt het existing trefwoord dat u in deze situaties kunt gebruiken.

Notitie

De opdrachten in deze les worden weergegeven om concepten te illustreren. Voer de opdrachten nog niet uit. U oefent wat u hier binnenkort leert.

Verwijzen naar bestaande resources

In een Bicep-bestand kunt u een resource definiëren die al bestaat. De declaratie lijkt op een normale resourcedefinitie, maar er zijn enkele belangrijke verschillen. In het volgende voorbeeld van een bestaande resourcedefinitie verwijst de definitie naar een opslagaccount met de naam toydesigndocs. Het opslagaccount bevindt zich in dezelfde resourcegroep waarin uw Bicep-sjabloon resources implementeert.

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

Laten we eens kijken wat deze definitie vormt:

  • Zoals u zou doen met een normale resource, neemt u het resource trefwoord, een symbolische naam en het resourcetype en de API-versie op.

    Notitie

    Vergeet niet dat de symbolische naam alleen in dit Bicep-bestand wordt gebruikt. Als u deze resource maakt met behulp van één Bicep-bestand en ernaar verwijst met behulp van de existing resource in een ander Bicep-bestand, hoeven de symbolische namen niet overeen te komen.

  • Het existing trefwoord geeft aan Bicep aan dat deze resourcedefinitie een verwijzing is naar een al gemaakte resource en dat Bicep deze niet mag implementeren.

  • De name eigenschap is de Azure-resourcenaam van het opslagaccount dat eerder is geïmplementeerd.

  • U hoeft de locationresource niet op te geven, skuof propertiesomdat de sjabloon de resource niet implementeert. Er wordt alleen naar een bestaande resource verwezen. U kunt deze beschouwen als een tijdelijke aanduiding voor resources.

Verwijzen naar onderliggende resources

U kunt ook verwijzen naar een bestaande onderliggende resource. Gebruik dezelfde soort syntaxis die u hebt gebruikt bij het implementeren van een onderliggende resource. In het volgende voorbeeld ziet u hoe u naar een bestaand subnet kunt verwijzen. Dit is een onderliggende resource van een virtueel netwerk. In het voorbeeld wordt een geneste onderliggende resource gebruikt, zoals hier wordt weergegeven:

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

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

U ziet dat zowel de bovenliggende als de onderliggende resource het existing trefwoord hebben toegepast.

U kunt vervolgens naar het subnet verwijzen met behulp van dezelfde :: operator die u gebruikt voor andere geneste onderliggende resources:

output managementSubnetResourceId string = vnet::managementSubnet.id

Raadpleeg resources buiten de resourcegroep

Vaak moet u verwijzen naar resources in een andere resourcegroep. Als u bijvoorbeeld een virtueel netwerk in een gecentraliseerde resourcegroep hebt, kunt u een virtuele machine in dat virtuele netwerk in een eigen resourcegroep implementeren. U kunt het scope trefwoord gebruiken om te verwijzen naar bestaande resources in een andere resourcegroep. In het volgende voorbeeld ziet u hoe u kunt verwijzen naar een virtueel netwerk met de naam toy-design-vnet binnen de networking-rg resourcegroep:

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

U ziet dat het scope resourceGroup() trefwoord wordt gebruikt om te verwijzen naar de resourcegroep die het virtuele netwerk bevat.

U kunt zelfs verwijzen naar resources binnen een ander Azure-abonnement, zolang het abonnement zich in uw Microsoft Entra-tenant bevindt. Als uw netwerkteam het virtuele netwerk in een ander abonnement inwerkt, kan de sjabloon ernaar verwijzen, zoals in dit voorbeeld:

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

U ziet dat het scope resourceGroup() trefwoord wordt gebruikt om te verwijzen naar de azure-abonnements-id (A123b4567c-1234-1a2b-2b1a-1234abc12345) en de naam van de resourcegroep die het virtuele netwerk bevat.

Nu u begrijpt hoe u naar bestaande resources verwijst, gaan we kijken hoe u deze mogelijkheid in uw sjablonen kunt gebruiken.

Onderliggende en extensieresources toevoegen aan een bestaande resource

U kunt een onderliggende resource toevoegen aan een al gemaakte bovenliggende resource met behulp van een combinatie van het existing trefwoord en het parent trefwoord. Met de volgende voorbeeldsjabloon wordt een Azure SQL-database gemaakt binnen een server die al bestaat:

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'
  }
}

Als u een extensieresource wilt implementeren in een bestaande resource, kunt u het scope trefwoord gebruiken. Hier volgt een sjabloon die gebruikmaakt van het existing trefwoord en het scope trefwoord om een resourcevergrendeling toe te voegen aan een opslagaccount dat al bestaat:

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.'
  }
}

Raadpleeg de eigenschappen van een bestaande resource

Resources moeten vaak verwijzen naar de eigenschappen van andere resources. Als u bijvoorbeeld een toepassing implementeert, moet deze mogelijk de sleutels of verbindingsgegevens voor een andere resource kennen. Met behulp van het existing trefwoord krijgt u toegang tot de eigenschappen van de resource waarnaar u verwijst.

Tip

Het is een best practice om sleutels van andere resources op deze manier op te zoeken in plaats van ze door te geven via uitvoer. U krijgt altijd de meest recente gegevens. Bovendien zijn uitvoerwaarden niet ontworpen voor het verwerken van beveiligde gegevens, zoals sleutels.

De manier waarop u toegang krijgt tot de informatie over een resource, is afhankelijk van het type informatie dat u krijgt. Als het een eigenschap is die niet veilig is, gebruikt u gewoonlijk alleen de properties resource. Met de volgende voorbeeldsjabloon wordt een Azure Functions-toepassing geïmplementeerd en worden de toegangsgegevens (instrumentatiesleutel) gebruikt voor een Application Insights-exemplaar dat al is gemaakt:

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
        }
      ]
    }
  }
}

Omdat de instrumentatiesleutel in dit voorbeeld niet als gevoelige gegevens wordt beschouwd, is deze beschikbaar in de properties resource. Wanneer u toegang wilt krijgen tot beveiligde gegevens, zoals de referenties die moeten worden gebruikt voor toegang tot een resource, gebruikt u de listKeys() functie, zoals wordt weergegeven in de volgende code:

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
        }
      ]
    }
  }
}

U ziet dat de listKeys functie een keys matrix retourneert. Met de Bicep-code wordt de value eigenschap opgehaald uit het eerste item in de keys matrix. Elk resourcetype bevat verschillende informatie die beschikbaar is in de listKeys() functie. Met de Bicep-extensie voor Visual Studio Code krijgt u hints om inzicht te krijgen in de gegevens die door de functie van listKeys() elke resource worden geretourneerd. In de volgende schermopname ziet u de uitvoer van de listKeys() functie voor een opslagaccount:

Schermopname van de Bicep-extensie voor Visual Studio Code. IntelliSense geeft verschillende gegevens weer die worden geretourneerd door de functie listKeys voor een opslagaccount.

Sommige resources ondersteunen ook andere functies. IntelliSense van Visual Studio Code bevat de functies die beschikbaar zijn voor elke resource. In de volgende schermopname ziet u dat opslagaccounts functies bieden met de naam listAccountSas() en listServiceSas() naast listKeys():

Schermopname van de Bicep-extensie voor Visual Studio Code. IntelliSense geeft verschillende functies weer die beschikbaar zijn voor het opslagaccount.

Belangrijk

De listKeys() functie biedt toegang tot gevoelige gegevens over de resource. Dit betekent dat de gebruiker of service-principal die de implementatie uitvoert, het juiste machtigingsniveau voor de resource moet hebben. Dit is meestal de ingebouwde rol Inzender of een aangepaste rol die de juiste machtiging toewijst.