Werken met bestaande resources
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
,sku
ofproperties
niet 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:
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()
:
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.