Jak tworzyć połączenia za pomocą narzędzi IaC
Łącznik usług ułatwia użytkownikom łączenie swoich usług obliczeniowych z docelowymi usługami zapasowymi za pomocą zaledwie kilku kliknięć lub poleceń. Podczas przechodzenia z etapu rozpoczęcia pracy do etapu produkcyjnego użytkownicy muszą również przejść z używania konfiguracji ręcznych do używania szablonów infrastruktury jako kodu (IaC) w potokach ciągłej integracji/ciągłego wdrażania.
Z tego przewodnika dowiesz się, jak przetłumaczyć połączone usługi platformy Azure na szablony IaC.
Wymagania wstępne
- W tym przewodniku założono, że masz świadomość ograniczeń IaC łącznika usług.
Omówienie rozwiązania
Tłumaczenie infrastruktury na szablony IaC zwykle obejmuje dwie główne części: logikę aprowizacji usług źródłowych i docelowych oraz logikę do tworzenia połączeń. Aby zaimplementować logikę aprowizacji usług źródłowych i docelowych, dostępne są dwie opcje:
- Tworzenie szablonu od podstaw
- Eksportowanie szablonu z platformy Azure i polerowanie go
Aby zaimplementować logikę do tworzenia połączeń, dostępne są trzy opcje:
- Używanie łącznika usługi i konfiguracja magazynu w usłudze App Configuration
- Używanie łącznika usługi w szablonie
- Używanie logiki szablonu do bezpośredniego konfigurowania usług źródłowych i docelowych
Kombinacje tych różnych opcji mogą tworzyć różne rozwiązania. Ze względu na ograniczenia IaC w łączniku usługi zalecamy zaimplementowanie następujących rozwiązań w podanej poniżej kolejności. Aby zastosować te rozwiązania, musisz zrozumieć narzędzia IaC i gramatykę tworzenia szablonów.
Rozwiązanie | Aprowizuj źródło i element docelowy | Połączenie kompilacji | Odpowiedni scenariusz | Plusy | Minusy |
---|---|---|---|---|---|
1 | Tworzenie od podstaw | Używanie łącznika usługi i konfiguracji magazynu w usłudze App Configuration | Ma kontrolę aktualności zasobów w chmurze przed zezwoleniem na ruch na żywo | — Szablon jest prosty i czytelny — Łącznik usługi przynosi dodatkową wartość — Brak problemu Z IaC jest wprowadzany przez łącznik usługi |
— Potrzebna jest dodatkowa zależność do odczytu konfiguracji z usługi App Configuration — Koszt sprawdzania aktualności zasobów w chmurze |
2 | Tworzenie od podstaw | Korzystanie z łącznika usługi | Ma kontrolę aktualności zasobów w chmurze przed zezwoleniem na ruch na żywo | — Szablon jest prosty i czytelny — Łącznik usługi przynosi dodatkową wartość |
— Koszt sprawdzania aktualności zasobów w chmurze |
3 | Tworzenie od podstaw | Konfigurowanie usług źródłowych i docelowych bezpośrednio w szablonie | Brak sprawdzania aktualności zasobów w chmurze | — Szablon jest prosty i czytelny | — Funkcje łącznika usług nie są dostępne |
100 | Eksport i polski | Używanie łącznika usługi i konfiguracji magazynu w usłudze App Configuration | Ma kontrolę aktualności zasobów w chmurze przed zezwoleniem na ruch na żywo | — Zasoby są dokładnie takie same jak w chmurze — Łącznik usługi przynosi dodatkową wartość — Brak problemu Z IaC jest wprowadzany przez łącznik usługi |
— Potrzebna jest dodatkowa zależność do odczytu konfiguracji z usługi App Configuration — Koszt sprawdzania aktualności zasobów w chmurze — Obsługuje tylko szablony usługi ARM - Wysiłki wymagane do zrozumienia i dopracowania szablonu |
5 | Eksport i polski | Korzystanie z łącznika usługi | Ma kontrolę aktualności zasobów w chmurze przed zezwoleniem na ruch na żywo | — Zasoby są dokładnie takie same jak w chmurze — Łącznik usługi przynosi dodatkową wartość |
— Koszt sprawdzania aktualności zasobów w chmurze — Obsługuje tylko szablony usługi ARM - Wysiłki wymagane do zrozumienia i dopracowania szablonu |
6 | Eksport i polski | Konfigurowanie usług źródłowych i docelowych bezpośrednio w szablonie | Brak sprawdzania aktualności zasobów w chmurze | — Zasoby są dokładnie takie same jak w chmurze | — Obsługa tylko szablonu usługi ARM - Wysiłki mające na celu zrozumienie i dopracowanie szablonu — Funkcje łącznika usług nie są dostępne |
Tworzenie szablonów
W poniższych sekcjach pokazano, jak utworzyć aplikację internetową i konto magazynu oraz połączyć je z tożsamością przypisaną przez system przy użyciu aplikacji Bicep. Pokazuje on, jak to zrobić zarówno przy użyciu łącznika usługi, jak i logiki szablonu.
Aprowizuj usługi źródłowe i docelowe
Tworzenie od podstaw
Tworzenie szablonu od podstaw jest preferowanym i zalecanym sposobem aprowizacji usług źródłowych i docelowych, ponieważ łatwo rozpocząć pracę i sprawia, że szablon jest prosty i czytelny. Poniżej przedstawiono przykład użycia minimalnego zestawu parametrów w celu utworzenia aplikacji internetowej i konta magazynu.
// 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'
}
Eksport i polski
Jeśli aprowizowane zasoby są dokładnie takie same jak te, które znajdują się w chmurze, eksportowanie szablonu z platformy Azure może być inną opcją. Te dwie lokalne metody to: zasoby istnieją na platformie Azure i używasz szablonów usługi ARM dla infrastruktury IaC. Przycisk Export template
znajduje się zwykle u dołu paska bocznego w witrynie Azure Portal. Wyeksportowany szablon usługi ARM odzwierciedla bieżące stany zasobu, w tym ustawienia skonfigurowane przez łącznik usługi. Zazwyczaj musisz wiedzieć o właściwościach zasobu, aby przeolerować wyeksportowany szablon.
Tworzenie logiki połączenia
Używanie łącznika usługi i przechowywanie konfiguracji w usłudze App Configuration
Używanie usługi App Configuration do przechowywania konfiguracji w naturalny sposób obsługuje scenariusze IaC. Dlatego zalecamy użycie tej metody do skompilowania szablonu IaC, jeśli jest to możliwe.
Aby uzyskać proste instrukcje dotyczące portalu, zapoznaj się z tym samouczkiem dotyczącym usługi App Configuration. Aby dodać tę funkcję do pliku bicep, dodaj identyfikator konfiguracji aplikacji w ładunku łącznika usługi.
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
}
}
}
}
Korzystanie z łącznika usługi
Tworzenie połączeń między usługą źródłową i docelową przy użyciu łącznika usługi jest preferowaną i zalecaną metodą, pod warunkiem że ograniczenie IaC łącznika usług nie ma negatywnego wpływu na Twój scenariusz. Łącznik usługi upraszcza szablon i udostępnia dodatkowe funkcje, takie jak walidacja kondycji połączenia, które nie są dostępne podczas tworzenia połączeń bezpośrednio za pośrednictwem logiki szablonu.
// 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'
}
}
}
Aby zapoznać się z formatami właściwości i wartości wymaganych podczas tworzenia zasobu łącznika usługi, sprawdź , jak podać poprawne parametry. Podczas tworzenia zasobu łącznika usługi Service Connector w witrynie Azure Portal można również wyświetlić podgląd i pobrać szablon usługi ARM.
Korzystanie z logiki szablonu
W przypadku scenariuszy, w których ma znaczenie ograniczenie IaC łącznika usług, rozważ bezpośrednie tworzenie połączeń przy użyciu logiki szablonu. Poniższy szablon przedstawia przykład łączenia konta magazynu z aplikacją internetową przy użyciu tożsamości przypisanej przez system.
// 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
}
}
Podczas bezpośredniego tworzenia połączeń przy użyciu logiki szablonu należy zrozumieć, co łącznik usługi robi dla każdego typu uwierzytelniania, ponieważ logika szablonu jest równoważna operacjom zaplecza łącznika usługi. W poniższej tabeli przedstawiono szczegóły operacji, które należy przetłumaczyć na logikę szablonu dla każdego typu uwierzytelniania.
Typ uwierzytelniania | Operacje łącznika usług |
---|---|
Wpisy tajne/parametry połączenia | — Konfigurowanie parametry połączenia usługi docelowej w ustawieniach aplikacji usługi źródłowej — Konfigurowanie zapory w usłudze docelowej w celu zezwolenia na wychodzące adresy IP usługi źródłowej |
Tożsamość zarządzana przypisana przez system | — Konfigurowanie punktu końcowego usługi docelowej w ustawieniach aplikacji usługi źródłowej — Konfigurowanie zapory w usłudze docelowej w celu zezwolenia na wychodzące adresy IP usługi źródłowej — Włączanie tożsamości przypisanej przez system w usłudze źródłowej — Tworzenie przypisania roli dla tożsamości usługi źródłowej w usłudze docelowej |
Tożsamość zarządzana przypisana przez użytkownika | — Konfigurowanie punktu końcowego usługi docelowej w ustawieniach aplikacji usługi źródłowej — Konfigurowanie zapory w usłudze docelowej w celu zezwolenia na wychodzące adresy IP usługi źródłowej — Wiązanie tożsamości przypisanej przez użytkownika z usługą źródłową — Tworzenie przypisania roli dla tożsamości przypisanej przez użytkownika w usłudze docelowej |
Jednostka usługi | — Konfigurowanie punktu końcowego usługi docelowej w ustawieniach aplikacji usługi źródłowej — Konfigurowanie identyfikatora appId i wpisu tajnego jednostki usługi źródłowej w ustawieniach aplikacji usługi źródłowej — Konfigurowanie zapory w usłudze docelowej w celu zezwolenia na wychodzące adresy IP usługi źródłowej — Tworzenie przypisania roli dla jednostki usługi w usłudze docelowej |