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 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
location
resource niet op te geven,sku
ofproperties
omdat 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:
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 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.