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
- Dieser Leitfaden setzt voraus, dass Sie mit den Einschränkungen für Infrastructure-as-Code (IaC) des Dienstconnectors vertraut sind.
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.
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.
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 |