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 eenheid worden weergegeven om concepten te illustreren. Voer de opdrachten nog niet uit. U oefent wat u hier binnenkort leert.

Verwijzen naar bestaande bronnen

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:

  • Net als bij 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 trefwoord existing geeft aan Bicep aan dat deze resourcedefinitie een verwijzing is naar een reeds gemaakte resource en dat Bicep deze niet mag implementeren.

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

  • U hoeft de location, skuof propertiesniet op te geven, omdat de sjabloon de resource niet implementeert. Er wordt alleen naar een bestaande resource verwezen. Beschouw het als een tijdelijke hulpbron.

Verwijzen naar kinderbronnen

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-05-01' existing = {
  name: 'toy-design-vnet'

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

Merk op dat zowel de ouder- als de kinderresource het existing trefwoord hebben toegepast.

U kunt naar het subnet verwijzen door dezelfde :: operator te gebruiken die u voor andere geneste ondergeschikte bronnen gebruikt.

output managementSubnetResourceId string = vnet::managementSubnet.id

Raadpleeg middelen buiten de hulpmiddelengroep

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 trefwoord scope 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-05-01' existing = {
  scope: resourceGroup('networking-rg')
  name: 'toy-design-vnet'
}

U ziet dat de scope het trefwoord resourceGroup() 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-05-01' existing = {
  scope: resourceGroup('A123b4567c-1234-1a2b-2b1a-1234abc12345', 'networking-rg')
  name: 'toy-design-vnet'
}

U ziet dat de scope het trefwoord resourceGroup() 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.

Voeg kind- en uitbreidingsbronnen toe aan een bestaande bron

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

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

Als u een extensieresource wilt implementeren in een bestaande resource, kunt u het trefwoord scope 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 trefwoord existing 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 actuele up-to-gegevens. Bovendien is uitvoer niet ontworpen om beveiligde gegevens, zoals sleutels, te verwerken.

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 van de 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@2024-04-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 van de resource. Wanneer u toegang wilt krijgen tot beveiligde gegevens, zoals de referenties die u wilt gebruiken voor toegang tot een resource, gebruikt u de functie listKeys(), zoals wordt weergegeven in de volgende code:

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

U ziet dat de functie listKeys een keys-matrix retourneert. Met de Bicep-code wordt de eigenschap value opgehaald uit het eerste item in de keys matrix. Elk resourcetype heeft verschillende informatie die beschikbaar is in de functie listKeys(). De Bicep-extensie voor Visual Studio Code geeft u hints om inzicht te krijgen in de gegevens die de listKeys() functie van elke resource retourneert. 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 functie listKeys() 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 Bijdrager of een aangepaste rol die de juiste machtiging toewijst.