Arbeta med befintliga resurser

Slutförd

Bicep-filer behöver ofta referera till resurser som har skapats någon annanstans. Dessa resurser kan skapas manuellt, kanske av en kollega som använder Azure-portalen. Eller så kan de skapas i en annan Bicep-fil. Det finns många orsaker till att du behöver referera till dessa resurser, till exempel:

  • Du lägger till en SQL-databas i en logisk Azure SQL-serverinstans som någon redan har skapat.
  • Du konfigurerar diagnostikinställningar för resurser som definieras i en annan Bicep-modul.
  • Du måste komma åt nycklarna på ett säkert sätt för ett lagringskonto som distribuerades manuellt till din prenumeration.

Bicep tillhandahåller nyckelordet existing som du kan använda i dessa situationer.

Kommentar

Kommandona i den här enheten visas för att illustrera begrepp. Kör inte kommandona än. Du kommer att öva på det du lär dig här snart.

Se befintliga resurser

I en Bicep-fil kan du definiera en resurs som redan finns. Deklarationen liknar en normal resursdefinition, men det finns några viktiga skillnader. I följande exempel på en befintlig resursdefinition refererar definitionen till ett lagringskonto med namnet toydesigndocs. Lagringskontot finns i samma resursgrupp som din Bicep-mall distribuerar resurser till.

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

Nu ska vi titta närmare på vad som utgör den här definitionen:

  • Som med en vanlig resurs inkluderar du nyckelordet resource , ett symboliskt namn och resurstypen och API-versionen.

    Kommentar

    Kom ihåg att det symboliska namnet endast används i den här Bicep-filen. Om du skapar den här resursen med hjälp av en Bicep-fil och refererar till den med hjälp av resursen existing i en annan Bicep-fil behöver de symboliska namnen inte matcha.

  • Nyckelordet existing anger för Bicep att den här resursdefinitionen är en referens till en resurs som redan har skapats och att Bicep inte ska försöka distribuera den.

  • Egenskapen name är Azure-resursnamnet för lagringskontot som tidigare distribuerades.

  • Du behöver inte ange location, skueller properties, eftersom mallen inte distribuerar resursen. Den refererar bara till en befintlig resurs. Se det som en platshållarresurs.

Se underordnade resurser

Du kan också referera till en befintlig underordnad resurs. Använd samma typ av syntax som du använde när du distribuerade en underordnad resurs. I följande exempel visas hur du kan referera till ett befintligt undernät, som är en underordnad resurs i ett virtuellt nätverk. I exemplet används en kapslad underordnad resurs, som du ser här:

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

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

Observera att både den överordnade och underordnade resursen har nyckelordet existing tillämpat.

Du kan sedan referera till undernätet med samma :: operator som du använder för andra kapslade underordnade resurser:

output managementSubnetResourceId string = vnet::managementSubnet.id

Se resurser utanför resursgruppen

Ofta behöver du referera till resurser i en annan resursgrupp. Om du till exempel har ett virtuellt nätverk i en centraliserad resursgrupp kanske du vill distribuera en virtuell dator till det virtuella nätverket i en egen resursgrupp. Du kan använda nyckelordet scope för att referera till befintliga resurser i en annan resursgrupp. I följande exempel visas hur du kan referera till ett virtuellt nätverk med namnet toy-design-vnet i networking-rg resursgruppen:

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

Observera att nyckelordet scoperesourceGroup() använder för att referera till resursgruppen som innehåller det virtuella nätverket.

Du kan även referera till resurser i en annan Azure-prenumeration, så länge prenumerationen finns i din Microsoft Entra-klientorganisation. Om nätverksteamet etablerar det virtuella nätverket i en annan prenumeration kan mallen referera till det, som i det här exemplet:

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

Observera att nyckelordet scoperesourceGroup() använder för att referera till Azure-prenumerations-ID :t (A123b4567c-1234-1a2b-2b1a-1234abc12345) och resursgruppens namn som innehåller det virtuella nätverket.

Nu när du förstår hur du refererar till befintliga resurser ska vi titta på hur du kan använda den här funktionen i dina mallar.

Lägga till underordnade resurser och tilläggsresurser till en befintlig resurs

Du kan lägga till en underordnad resurs till en redan skapad överordnad resurs med hjälp av en kombination av nyckelordet existing och nyckelordet parent . I följande exempelmall skapas en Azure SQL-databas på en server som redan finns:

resource server 'Microsoft.Sql/servers@2020-11-01-preview' existing = {
  name: serverName
}

resource database 'Microsoft.Sql/servers/databases@2020-11-01-preview' = {
  parent: server
  name: databaseName
  location: location
  sku: {
    name: 'Standard'
    tier: 'Standard'
  }
}

Om du behöver distribuera en tilläggsresurs till en befintlig resurs kan du använda nyckelordet scope . Här är en mall som använder nyckelordet existing och nyckelordet scope för att lägga till ett resurslås till ett lagringskonto som redan finns:

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

resource lockResource 'Microsoft.Authorization/locks@2016-09-01' = {
  scope: storageAccount
  name: 'DontDelete'
  properties: {
    level: 'CanNotDelete'
    notes: 'Prevents deletion of the toy design documents storage account.'
  }
}

Se egenskaperna för en befintlig resurs

Resurser behöver ofta referera till egenskaperna för andra resurser. Om du till exempel distribuerar ett program kan det behöva känna till nycklar eller anslutningsinformation för en annan resurs. Genom att använda nyckelordet existing får du åtkomst till egenskaperna för den resurs som du refererar till.

Dricks

Det är en bra idé att söka efter nycklar från andra resurser på det här sättet i stället för att skicka dem genom utdata. Du får alltid de senaste data. Det är också viktigt att utdata inte är utformade för att hantera säkra data, till exempel nycklar.

Hur du kommer åt informationen om en resurs beror på vilken typ av information du får. Om det är en egenskap som inte är säker använder du vanligtvis bara resursen properties . Följande exempelmall distribuerar ett Azure Functions-program och använder åtkomstinformationen (instrumentationsnyckeln) för en Application Insights-instans som redan har skapats:

resource applicationInsights 'Microsoft.Insights/components@2018-05-01-preview' existing = {
  name: applicationInsightsName
}

resource functionApp 'Microsoft.Web/sites@2020-06-01' = {
  name: functionAppName
  location: location
  kind: 'functionapp'
  properties: {
    siteConfig: {
      appSettings: [
        // ...
        {
          name: 'APPINSIGHTS_INSTRUMENTATIONKEY'
          value: applicationInsights.properties.InstrumentationKey
        }
      ]
    }
  }
}

I det här exemplet, eftersom instrumentationsnyckeln inte betraktas som känsliga data, är den tillgänglig i resursens properties . När du behöver komma åt säkra data, till exempel de autentiseringsuppgifter som ska användas för att komma åt en resurs, använder du listKeys() funktionen enligt följande kod:

resource storageAccount 'Microsoft.Storage/storageAccounts@2019-06-01' existing = {
  name: storageAccountName
}

resource functionApp 'Microsoft.Web/sites@2020-06-01' = {
  name: functionAppName
  location: location
  kind: 'functionapp'
  properties: {
    siteConfig: {
      appSettings: [
        // ...
        {
          name: 'StorageAccountKey'
          value: storageAccount.listKeys().keys[0].value
        }
      ]
    }
  }
}

Observera att listKeys funktionen returnerar en keys matris. Bicep-koden hämtar value egenskapen från det första objektet i matrisen keys . Varje resurstyp har olika information som är tillgänglig från listKeys() funktionen. Bicep-tillägget för Visual Studio Code ger tips som hjälper dig att förstå de data som varje resurss listKeys() funktion returnerar. Följande skärmbild visar funktionens listKeys() utdata för ett lagringskonto:

Skärmbild av Bicep-tillägget för Visual Studio Code. IntelliSense visar flera av de uppgifter som returneras av funktionen listKeys för ett lagringskonto.

Vissa resurser stöder även andra funktioner. IntelliSense i Visual Studio Code visar en lista över de funktioner som är tillgängliga för varje resurs. I följande skärmbild kan du se att lagringskonton tillhandahåller funktioner med namnet listAccountSas() och listServiceSas() utöver listKeys():

Skärmbild av Bicep-tillägget för Visual Studio Code. IntelliSense visar flera funktioner som är tillgängliga för lagringskontot.

Viktigt!

Funktionen listKeys() ger åtkomst till känsliga data om resursen. Det innebär att användaren eller tjänstens huvudnamn som kör distributionen måste ha rätt behörighetsnivå för resursen. Det här är vanligtvis den inbyggda rollen Deltagare eller en anpassad roll som tilldelar lämplig behörighet.