Udostępnij za pośrednictwem


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.

Zrzut ekranu witryny Azure Portal przedstawiający eksportowanie szablonu usługi ARM aplikacji internetowej.

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.

Zrzut ekranu witryny Azure Portal przedstawiający eksportowanie szablonu usługi ARM zasobu łącznika usługi.

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