Arbeiten mit vorhandenen Ressourcen

Abgeschlossen

Bicep-Dateien müssen häufig auf Ressourcen verweisen, die an anderer Stelle erstellt wurden. Diese Ressourcen werden möglicherweise manuell erstellt, möglicherweise von einem Kollegen, der das Azure-Portal verwendet. Sie können auch in einer anderen Bicep-Datei erstellt werden. Es gibt viele Gründe, warum Sie auf diese Ressourcen verweisen müssen, z. B.:

  • Sie fügen in einer logischen Azure SQL-Serverinstanz, die bereits von jemandem erstellt wurde, eine SQL-Datenbank hinzu.
  • Sie konfigurieren Diagnoseeinstellungen für Ressourcen, die in einem anderen Bicep-Modul definiert sind.
  • Sie müssen sicher auf die Schlüssel für ein Speicherkonto zugreifen, das manuell in Ihrem Abonnement bereitgestellt wurde.

Bicep bietet das Schlüsselwort existing, das Sie in diesen Situationen verwenden können.

Hinweis

Die Befehle in dieser Lerneinheit dienen der Veranschaulichung der Konzepte. Führen Sie die Befehle jetzt noch nicht aus. Sie können das Erlernte in Kürze üben.

Verweisen auf vorhandene Ressourcen

Innerhalb einer Bicep-Datei können Sie eine Ressource definieren, die bereits vorhanden ist. Die Deklaration ähnelt einer normalen Ressourcendefinition, aber es gibt einige wichtige Unterschiede. Im folgenden Beispiel einer vorhandenen Ressourcendefinition bezieht sich die Definition auf ein Speicherkonto mit dem Namen toydesigndocs. Das Speicherkonto befindet sich in derselben Ressourcengruppe, für die Ihre Bicep-Vorlage Ressourcen bereitstellt.

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

Sehen wir uns nun genau an, woraus diese Definition besteht:

  • Wie bei einer normalen Ressource schließen Sie das Schlüsselwort resource ein, einen symbolischen Namen sowie den Ressourcentyp und die API-Version.

    Hinweis

    Denken Sie daran, dass der symbolische Name nur in dieser Bicep-Datei verwendet wird. Wenn Sie diese Ressource mit einer Bicep-Datei erstellen und mithilfe der Ressource existing in einer anderen Bicep-Datei darauf verweisen, müssen die symbolischen Namen nicht übereinstimmen.

  • Das Schlüsselwort existing zeigt Bicep an, dass diese Ressourcendefinition ein Verweis auf eine bereits erstellte Ressource ist und dass Bicep nicht versuchen sollte, sie bereitzustellen.

  • Die name-Eigenschaft ist der Azure-Ressourcenname des Speicherkontos, das zuvor bereitgestellt wurde.

  • Sie müssen weder location noch sku oder properties angeben, weil die Vorlage die Ressource nicht bereitstellt. Sie verweist lediglich auf eine vorhandene Ressource. Stellen Sie sich diese als Platzhalterressource vor.

Verweisen auf untergeordnete Ressourcen

Sie können auch auf eine vorhandene untergeordnete Ressource verweisen. Verwenden Sie dieselbe Syntax, die Sie beim Bereitstellen einer untergeordneten Ressource verwendet haben. Das folgende Beispiel zeigt, wie Sie auf ein vorhandenes Subnetz verweisen können, das eine untergeordnete Ressource eines virtuellen Netzwerks ist. In dem Beispiel wird eine geschachtelte untergeordnete Ressource verwendet, wie hier gezeigt:

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

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

Beachten Sie, dass sowohl auf die übergeordnete als auch auf die untergeordnete Ressource das Schlüsselwort existing angewendet wurde.

Sie können dann auf das Subnetz verweisen, indem Sie denselben ::-Operator verwenden, den Sie auch für andere geschachtelte untergeordnete Ressourcen verwenden:

output managementSubnetResourceId string = vnet::managementSubnet.id

Verweisen auf Ressourcen außerhalb der Ressourcengruppe

Häufig müssen Sie auf Ressourcen in einer anderen Ressourcengruppe verweisen. Wenn Sie beispielsweise über ein virtuelles Netzwerk in einer zentralisierten Ressourcengruppe verfügen, möchten Sie vielleicht einen virtuellen Computer in diesem virtuellen Netzwerk in einer eigenen Ressourcengruppe bereitstellen. Sie können das Schlüsselwort scope verwenden, um auf vorhandene Ressourcen in einer anderen Ressourcengruppe zu verweisen. Das folgende Beispiel zeigt, wie Sie auf ein virtuelles Netzwerk namens toy-design-vnet innerhalb der Ressourcengruppe networking-rg verweisen können:

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

Beachten Sie, dass scope das Schlüsselwort resourceGroup() verwendet, um auf die Ressourcengruppe zu verweisen, die das virtuelle Netzwerk enthält.

Sie können sogar auf Ressourcen in einem anderen Azure-Abonnement verweisen, solange sich das Abonnement in Ihrem Microsoft Entra-Mandanten befindet. Wenn Ihr Netzwerkteam das virtuelle Netzwerk in einem anderen Abonnement bereitgestellt hätte, könnte die Vorlage wie in diesem Beispiel darauf verweisen:

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

Beachten Sie, dass scope das Schlüsselwort resourceGroup() verwendet, um auf die Azure-Abonnement-ID (A123b4567c-1234-1a2b-2b1a-1234abc12345) und den Namen der Ressourcengruppe zu verweisen, die das virtuelle Netzwerk enthalten.

Nachdem Sie nun wissen, wie Sie auf vorhandene Ressourcen verweisen, sehen wir uns an, wie Sie diese Funktion in Ihren Vorlagen verwenden können.

Hinzufügen von untergeordneten und Erweiterungsressourcen zu einer vorhandenen Ressource

Sie können einer bereits erstellten übergeordneten Ressource eine untergeordnete Ressource hinzufügen, indem Sie eine Kombination aus den Schlüsselwörtern existing und parent verwenden. Die folgende Beispielvorlage erstellt eine Azure SQL-Datenbank auf einem Server, der bereits vorhanden ist:

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

Wenn Sie eine Erweiterungsressource für eine vorhandene Ressource bereitstellen müssen, können Sie das Schlüsselwort scope verwenden. Hier sehen Sie eine Vorlage, die die Schlüsselwörter existing und scope verwendet, um einem bereits vorhandenen Speicherkonto eine Ressourcensperre hinzuzufügen:

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

Verweisen auf die Eigenschaften einer vorhandenen Ressource

Ressourcen müssen häufig auf die Eigenschaften anderer Ressourcen verweisen. Wenn Sie beispielsweise eine Anwendung bereitstellen, muss diese möglicherweise die Schlüssel oder Verbindungsinformationen für eine andere Ressource kennen. Mithilfe des Schlüsselworts existing erhalten Sie Zugriff auf die Eigenschaften der Ressource, auf die Sie verweisen.

Tipp

Es ist eine bewährte Methode, Schlüssel aus anderen Ressourcen auf diese Weise nachzuschlagen, anstatt sie per Ausgaben zu übergeben. Sie erhalten so immer die neuesten Daten. Wichtig ist außerdem, dass Ausgaben nicht für die Handhabung sicherer Daten wie Schlüssel konzipiert sind.

Wie Sie auf die Informationen zu einer Ressource zugreifen, hängt von der Art der abgerufenen Informationen ab. Wenn es sich um eine Eigenschaft handelt, die nicht sicher ist, verwenden Sie normalerweise nur die properties der Ressource. Die folgende Beispielvorlage stellt eine Azure Functions-Anwendung bereit und verwendet die Zugriffsdetails (Instrumentierungsschlüssel) für eine Application Insights-Instanz, die bereits erstellt wurde:

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

Da der Instrumentierungsschlüssel in diesem Beispiel nicht als vertrauliche Daten betrachtet wird, ist er in den properties der Ressource verfügbar. Wenn Sie auf sichere Daten zugreifen müssen, z. B. die Anmeldeinformationen für den Zugriff auf eine Ressource, verwenden Sie die listKeys()-Funktion, wie im folgenden Code gezeigt:

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

Beachten Sie, dass die listKeys-Funktion ein keys-Array zurückgibt. Der Bicep-Code ruft die value-Eigenschaft aus dem ersten Element im keys-Array ab. Jedem Ressourcentyp stehen über die Funktion listKeys() unterschiedliche Informationen zur Verfügung. Die Bicep-Erweiterung für Visual Studio Code enthält Hinweise, die Ihnen helfen, die Daten zu verstehen, die die Funktion listKeys() jeder Ressource zurückgibt. Der folgende Screenshot zeigt die Ausgabe der Funktion listKeys() für ein Speicherkonto:

Screenshot der Bicep-Erweiterung für Visual Studio Code. IntelliSense zeigt mehrere Informationen an, die von der Funktion listKeys für ein Speicherkonto zurückgegeben werden.

Einige Ressourcen unterstützen auch andere Funktionen. IntelliSense in Visual Studio Code listet die für jede Ressource verfügbaren Funktionen auf. Im folgenden Screenshot sehen Sie, dass Speicherkonten zusätzlich zu listKeys() auch die Funktionen listAccountSas() und listServiceSas() bieten:

Screenshot der Bicep-Erweiterung für Visual Studio Code. IntelliSense zeigt mehrere Funktionen an, die für das Speicherkonto verfügbar sind.

Wichtig

Die listKeys()-Funktion bietet den Zugriff auf vertrauliche Daten der Ressource. Dies bedeutet, dass der Benutzer oder Dienstprinzipal, der die Bereitstellung ausführt, über die entsprechende Berechtigungsstufe für die Ressource verfügen muss. Dies ist in der Regel die integrierte Rolle Mitwirkender oder eine benutzerdefinierte Rolle, die die entsprechende Berechtigung zuweist.