Freigeben über


Erstellen von Verbindungen mit IaC-Tools

Mithilfe des Dienstconnectors können Benutzer ihre Computedienste mit wenigen Klicks oder Befehlen mit Unterstützungsdiensten verbinden. Beim Übergang von den ersten Schritten in der Anfangsphase zur Produktionsphase müssen Benutzer auch die Umstellung von der Verwendung manueller Konfigurationen auf die Verwendung von Infrastructure-as-Code (IaC)-Vorlagen in ihren CI/CD-Pipelines vornehmen.

In dieser Anleitung erfahren Sie, wie Sie Ihre verbundenen Azure-Dienste in IaC-Vorlagen übersetzen.

Voraussetzungen

Lösungsübersicht

Die Übersetzung der Infrastruktur in IaC-Vorlagen umfasst in der Regel zwei Hauptkomponenten: die Logik zum Bereitstellen von Quell- und Zieldiensten und die Logik zum Erstellen von Verbindungen. Zum Implementieren der Logik zum Bereitstellen von Quell- und Zieldiensten gibt es zwei Optionen:

  • Erstellen einer vollkommen neuen Vorlage
  • Exportieren der Vorlage aus Azure und Optimieren der Vorlage

Zum Implementieren der Logik zum Erstellen von Verbindungen gibt es drei Optionen:

  • Verwenden des Dienstconnectors und Speichern der Konfiguration in App Configuration
  • Verwenden des Dienstconnectors in der Vorlage
  • Verwenden der Vorlagenlogik zum direkten Konfigurieren von Quell- und Zieldiensten

Die Kombination dieser verschiedenen Optionen kann zu unterschiedlichen Lösungen führen. Aufgrund der IaC-Einschränkungen im Dienstconnector empfehlen wir, die folgenden Lösungen in der unten dargestellten Reihenfolge zu implementieren. Um diese Lösungen anwenden zu können, müssen Sie die IaC-Tools und die Grammatik der Vorlagenerstellung verstehen.

Lösung Bereitstellen von Quelle und Ziel Erstellen der Verbindung Anwendbares Szenario Vorteile Nachteile
1 Erstellen einer neuen Vorlage Verwenden des Dienstconnectors und Speichern der Konfiguration in App Configuration Liveness-Überprüfung der Cloudressourcen, bevor Livedatenverkehr zugelassen wird - Die Vorlage ist einfach und lesbar.
- Der Dienstconnector bietet zusätzlichen Nutzen.
- Der Dienstconnector verursacht kein IaC-Problem.
- Das Lesen der Konfiguration aus App Configuration erfordert eine zusätzliche Abhängigkeit.
- Für die Liveness-Überprüfung der Cloudressourcen fallen Kosten an.
2 Erstellen einer neuen Vorlage Verwenden des Dienstconnectors Liveness-Überprüfung der Cloudressourcen, bevor Livedatenverkehr zugelassen wird - Die Vorlage ist einfach und lesbar.
- Der Dienstconnector bietet zusätzlichen Nutzen.
- Für die Liveness-Überprüfung der Cloudressourcen fallen Kosten an.
3 Erstellen einer neuen Vorlage Konfigurieren von Quell- und Zieldiensten direkt in der Vorlage Keine Liveness-Überprüfung für die Cloudressourcen - Die Vorlage ist einfach und lesbar. - Features des Dienstconnectors sind nicht verfügbar.
4 Exportieren und Optimieren Verwenden des Dienstconnectors und Speichern der Konfiguration in App Configuration Liveness-Überprüfung der Cloudressourcen, bevor Livedatenverkehr zugelassen wird - Ressourcen sind mit den Ressourcen in der Cloud identisch.
- Der Dienstconnector bietet zusätzlichen Nutzen.
- Der Dienstconnector verursacht kein IaC-Problem.
- Das Lesen der Konfiguration aus App Configuration erfordert eine zusätzliche Abhängigkeit.
- Für die Liveness-Überprüfung der Cloudressourcen fallen Kosten an.
- Unterstützt nur Azure Resource Manager (ARM)-Vorlagen.
- Das Verständnis und Optimieren der Vorlage erfordert entsprechende Kenntnisse.
5 Exportieren und Optimieren Verwenden des Dienstconnectors Liveness-Überprüfung der Cloudressourcen, bevor Livedatenverkehr zugelassen wird - Ressourcen sind mit den Ressourcen in der Cloud identisch.
- Der Dienstconnector bietet zusätzlichen Nutzen.
- Für die Liveness-Überprüfung der Cloudressourcen fallen Kosten an.
- Unterstützt nur Azure Resource Manager (ARM)-Vorlagen.
- Das Verständnis und Optimieren der Vorlage erfordert entsprechende Kenntnisse.
6 Exportieren und Optimieren Konfigurieren von Quell- und Zieldiensten direkt in der Vorlage Keine Liveness-Überprüfung für die Cloudressourcen - Ressourcen sind mit den Ressourcen in der Cloud identisch. - Es werden nur ARM-Vorlagen unterstützt.
- Das Verständnis und Optimieren der Vorlage erfordert entsprechende Kenntnisse.
- Features des Dienstconnectors sind nicht verfügbar.

Erstellen von Azure Resource Manager-Vorlagen

In den folgenden Abschnitten wird gezeigt, wie Sie eine Web-App und ein Speicherkonto erstellen und mithilfe von Bicep mit einer systemseitig zugewiesenen Identität verbinden. In den folgenden Anleitungen werden dazu sowohl der Dienstconnector als auch die Vorlagenlogik verwendet.

Bereitstellen von Quell- und Zieldiensten

Erstellen einer neuen Vorlage

Das Erstellen der Vorlage von Grund auf ist die bevorzugte und empfohlene Methode zum Bereitstellen von Quell- und Zieldiensten, da sie die ersten Schritte vereinfacht und die erstellte Vorlage einfach und lesbar ist. Im folgenden Beispiel wird ein minimaler Parametersatz verwendet, um eine Web-App und ein Speicherkonto zu erstellen.

// This template creates a webapp and a storage account.
// In order to make it more readable, we use only the minimal set of parameters to create the resources.

param location string = resourceGroup().location
// App Service plan parameters
param planName string = 'plan_${uniqueString(resourceGroup().id)}'
param kind string = 'linux'
param reserved bool = true
param sku string = 'B1'
// Webapp parameters
param webAppName string = 'webapp-${uniqueString(resourceGroup().id)}'
param linuxFxVersion string = 'PYTHON|3.8'
param identityType string = 'SystemAssigned'
param appSettings array = []
// Storage account parameters
param storageAccountName string = 'account${uniqueString(resourceGroup().id)}'


// Create an app service plan 
resource appServicePlan 'Microsoft.Web/serverfarms@2022-09-01' = {
  name: planName
  location: location
  kind: kind
  sku: {
    name: sku
  }
  properties: {
    reserved: reserved
  }
}


// Create a web app
resource appService 'Microsoft.Web/sites@2022-09-01' = {
  name: webAppName
  location: location
  properties: {
    serverFarmId: appServicePlan.id
    siteConfig: {
      linuxFxVersion: linuxFxVersion
      appSettings: appSettings
    }
  }
  identity: {
    type: identityType
  }
}


// Create a storage account
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}

Exportieren und Optimieren

Wenn die von Ihnen bereitgestellten Ressourcen mit Ihren Ressourcen in der Cloud identisch sind, kann das Exportieren der Vorlage aus Azure eine weitere Option sein. Für diesen Ansatz gelten die folgenden zwei Voraussetzungen: Die Ressourcen müssen in Azure vorhanden sein, und Sie müssen ARM-Vorlagen für Ihre IaC verwenden. Die Schaltfläche Export template befindet sich in der Regel im unteren Bereich der Randleiste im Azure-Portal. Die exportierte ARM-Vorlage spiegelt die aktuellen Ressourcenstatus wider, einschließlich der vom Dienstconnector konfigurierten Einstellungen. Normalerweise müssen Sie die Ressourceneigenschaften kennen, um die exportierte Vorlage zu optimieren.

Screenshot: Azure-Portal, Export der ARM-Vorlage einer Web-App.

Logik zum Erstellen von Verbindungen

Verwenden des Dienstconnectors und Speichern der Konfiguration in App Configuration

Die Verwendung von App Configuration zum Speichern der Konfiguration unterstützt IaC-Szenarien. Daher wird empfohlen, nach Möglichkeit diese Methode zum Erstellen Ihrer IaC-Vorlage zu verwenden.

Einfache Anweisungen zur Verwendung des Portals finden Sie in diesem Tutorial zu App Configuration. Um dieses Feature in einer Bicep-Datei hinzuzufügen, fügen Sie die App Configuration-ID in den Nutzdaten des Dienstconnectors hinzu.

resource webApp 'Microsoft.Web/sites@2022-09-01' existing = {
  name: webAppName
}

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

resource appConfiguration 'Microsoft.AppConfiguration/configurationStores@2023-03-01' existing = {
  name: appConfigurationName
}

resource serviceConnector 'Microsoft.ServiceLinker/linkers@2022-05-01' = {
  name: connectorName
  scope: webApp
  properties: {
    clientType: 'python'
    targetService: {
      type: 'AzureResource'
      id: storageAccount.id
    }
    authInfo: {
      authType: 'systemAssignedIdentity'
    }
    configurationInfo: {
      configurationStore: {
        appConfigurationId: appConfiguration.id
      }
    }
  }
}

Verwenden des Dienstconnectors

Das Erstellen von Verbindungen zwischen dem Quell- und Zieldienst mithilfe des Dienstconnectors ist die bevorzugte und empfohlene Methode, wenn sich die IaC-Einschränkungen des Dienstconnectors nicht negativ auf Ihr Szenario auswirken. Der Dienstconnector vereinfacht die Vorlage und stellt zusätzliche Features bereit, die beim direkten Erstellen von Verbindungen über Vorlagenlogik nicht verfügbar sind, z. B. eine Überprüfung des Verbindungsstatus.

// The template builds a connection between a webapp and a storage account 
// with a system-assigned identity using Service Connector

param webAppName string = 'webapp-${uniqueString(resourceGroup().id)}'
param storageAccountName string = 'account${uniqueString(resourceGroup().id)}'
param connectorName string = 'connector_${uniqueString(resourceGroup().id)}'

// Get an existing webapp
resource webApp 'Microsoft.Web/sites@2022-09-01' existing = {
  name: webAppName
}

// Get an existing storage
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' existing = {
  name: storageAccountName
}

// Create a Service Connector resource for the webapp 
// to connect to a storage account using system identity
resource serviceConnector 'Microsoft.ServiceLinker/linkers@2022-05-01' = {
  name: connectorName
  scope: webApp
  properties: {
    clientType: 'python'
    targetService: {
      type: 'AzureResource'
      id: storageAccount.id
    }
    authInfo: {
      authType: 'systemAssignedIdentity'
    }
  }
}

Informationen zu den Formaten von Eigenschaften und Werten, die beim Erstellen einer Dienstconnectorressource erforderlich sind, finden Sie unter Bereitstellen korrekter Parameter für den Dienstconnector. Sie können auch eine Vorschau einer ARM-Vorlage anzeigen und die ARM-Vorlage herunterladen, damit Sie beim Erstellen einer Dienstconnectorressource im Azure-Portal darauf verweisen können.

Screenshot: Azure-Portal, Export der ARM-Vorlage einer Dienstconnectorressource.

Verwenden der Vorlagenlogik

In Szenarien, in denen die IaC-Einschränkungen des Dienstconnectors relevant sind, sollten Sie Verbindungen ggf. direkt mithilfe der Vorlagenlogik erstellen. Die folgende Beispielvorlage zeigt, wie Sie ein Speicherkonto mithilfe einer systemseitig zugewiesenen Identität mit einer Web-App verbinden.

// The template builds a connection between a webapp and a storage account 
// with a system-assigned identity without using Service Connector

param webAppName string = 'webapp-${uniqueString(resourceGroup().id)}'
param storageAccountName string = 'account${uniqueString(resourceGroup().id)}'
param storageBlobDataContributorRole string  = 'ba92f5b4-2d11-453d-a403-e96b0029c9fe'

// Get an existing webapp
resource webApp 'Microsoft.Web/sites@2022-09-01' existing = {
  name: webAppName
}

// Get an existing storage account
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' existing = {
  name: storageAccountName
}

// Operation: Enable system-assigned identity on the source service
// No action needed as this is enabled when creating the webapp

// Operation: Configure the target service's endpoint on the source service's app settings
resource appSettings 'Microsoft.Web/sites/config@2022-09-01' = {
  name: 'appsettings'
  parent: webApp
  properties: {
    AZURE_STORAGEBLOB_RESOURCEENDPOINT: storageAccount.properties.primaryEndpoints.blob
  }
}

// Operation: Configure firewall on the target service to allow the source service's outbound IPs
// No action needed as storage account allows all IPs by default

// Operation: Create role assignment for the source service's identity on the target service
resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  scope: storageAccount
  name: guid(resourceGroup().id, storageBlobDataContributorRole)
  properties: {
    roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', storageBlobDataContributorRole)
    principalId: webApp.identity.principalId
  }
}

Wenn Sie Verbindungen direkt mithilfe der Vorlagenlogik erstellen, müssen Sie wissen, welche Schritte der Dienstconnector für jeden Authentifizierungstyp ausführt, da die Vorlagenlogik den Back-End-Vorgängen des Dienstconnectors entspricht. In der folgenden Tabelle sind die Details der Vorgänge aufgeführt, die Sie für jeden Authentifizierungstyp in Vorlagenlogik übersetzen müssen.

Authentifizierungstyp Vorgänge des Dienstconnectors
Geheimnis/Verbindungszeichenfolge - Konfigurieren der Verbindungszeichenfolge des Zieldiensts in den App-Einstellungen des Quelldiensts
- Konfigurieren der Firewall für den Zieldienst, um die ausgehenden IP-Adressen des Quelldiensts zuzulassen
Systemseitig zugewiesene verwaltete Identität - Konfigurieren des Endpunkts des Zieldiensts in den App-Einstellungen des Quelldiensts
- Konfigurieren der Firewall für den Zieldienst, um die ausgehenden IP-Adressen des Quelldiensts zuzulassen
- Aktivieren der systemseitig zugewiesenen Identität für den Quelldienst
- Erstellen einer Rollenzuweisung für die Identität des Quelldiensts für den Zieldienst
Benutzerseitig zugewiesene verwaltete Identität - Konfigurieren des Endpunkts des Zieldiensts in den App-Einstellungen des Quelldiensts
- Konfigurieren der Firewall für den Zieldienst, um die ausgehenden IP-Adressen des Quelldiensts zuzulassen
- Binden der benutzerseitig zugewiesenen Identität an den Quelldienst
- Erstellen einer Rollenzuweisung für die benutzerseitig zugewiesene Identität für den Zieldienst
Dienstprinzipal - Konfigurieren des Endpunkts des Zieldiensts in den App-Einstellungen des Quelldiensts
- Konfigurieren der App-ID (appId) und des Geheimnisses des Dienstprinzipals in den App-Einstellungen des Quelldiensts
- Konfigurieren der Firewall für den Zieldienst, um die ausgehenden IP-Adressen des Quelldiensts zuzulassen
- Erstellen einer Rollenzuweisung für den Dienstprinzipal für den Zieldienst