Поделиться через


Создание подключений с помощью средств IaC

Соединитель служб помогает пользователям подключать свои вычислительные службы к целевым службам резервного копирования в нескольких щелчках или командах. При переходе с начальной стадии на рабочую стадию пользователи также должны перейти от использования ручных конфигураций к использованию шаблонов инфраструктуры как кода (IaC) в конвейерах CI/CD.

В этом руководстве вы узнаете, как перевести подключенные службы Azure в шаблоны IaC.

Необходимые компоненты

Обзор решения

Преобразование инфраструктуры в шаблоны IaC обычно включает две основные части: логику подготовки исходных и целевых служб, а также логику для создания подключений. Чтобы реализовать логику для подготовки исходных и целевых служб, существует два варианта:

  • Создание шаблона с нуля
  • Экспорт шаблона из Azure и его польирование

Чтобы реализовать логику для создания подключений, существует три варианта:

  • Использование соединителя службы и сохранение конфигурации в Конфигурация приложений
  • Использование соединителя службы в шаблоне
  • Использование логики шаблона для настройки исходных и целевых служб напрямую

Сочетания этих различных вариантов могут создавать различные решения. Из-за ограничений IaC в Соединителе служб рекомендуется реализовать следующие решения в указанном ниже порядке. Чтобы применить эти решения, необходимо понять инструменты IaC и грамматику разработки шаблонов.

Решение Подготовка источника и целевого объекта Подключение к сборке Применимый сценарий Плюсы Минусы
1 Разработка с нуля Использование соединителя службы и сохранение конфигурации в Конфигурация приложений Проверка активности облачных ресурсов перед разрешением динамического трафика — Шаблон прост и доступен для чтения
— Соединитель службы приносит дополнительное значение
— Проблема IaC не появилась в соединителе службы
— требуется дополнительная зависимость для чтения конфигурации из Конфигурация приложений
— стоимость проверки активности облачных ресурсов
2 Разработка с нуля Использование соединителя службы Проверка активности облачных ресурсов перед разрешением динамического трафика — Шаблон прост и доступен для чтения
— Соединитель службы приносит дополнительное значение
— стоимость проверки активности облачных ресурсов
3 Разработка с нуля Настройка исходных и целевых служб непосредственно в шаблоне Нет проверки активности в облачных ресурсах — Шаблон прост и доступен для чтения — Функции соединителя служб недоступны
4 Экспорт и польский Использование соединителя службы и сохранение конфигурации в Конфигурация приложений Проверка активности облачных ресурсов перед разрешением динамического трафика — Ресурсы точно такие же, как и в облаке
— Соединитель службы приносит дополнительное значение
— Проблема IaC не появилась в соединителе службы
— требуется дополнительная зависимость для чтения конфигурации из Конфигурация приложений
— стоимость проверки активности облачных ресурсов
— поддерживает только шаблоны ARM
— усилия, необходимые для понимания и полировки шаблона
5 Экспорт и польский Использование соединителя службы Проверка активности облачных ресурсов перед разрешением динамического трафика — Ресурсы точно такие же, как и в облаке
— Соединитель службы приносит дополнительное значение
— стоимость проверки активности облачных ресурсов
— поддерживает только шаблоны ARM
— усилия, необходимые для понимания и полировки шаблона
6 Экспорт и польский Настройка исходных и целевых служб непосредственно в шаблоне Нет проверки активности в облачных ресурсах — Ресурсы точно такие же, как в облаке — Поддержка только шаблона ARM
— усилия по пониманию и полю шаблона
— Функции соединителя служб недоступны

Создание шаблонов

В следующих разделах показано, как создать веб-приложение и учетную запись хранения и подключить их к идентификатору, назначаемого системой, с помощью Bicep. В нем показано, как это сделать как с помощью соединителя службы, так и с помощью логики шаблона.

Подготовка исходных и целевых служб

Разработка с нуля

Создание шаблона с нуля является предпочтительным и рекомендуемым способом подготовки исходных и целевых служб, так как легко приступить к работе и сделать шаблон простым и удобочитаемым. Ниже приведен пример использования минимального набора параметров для создания веб-приложения и учетной записи хранения.

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

Экспорт и польский

Если ресурсы, которые вы подготавливаете, точно совпадают с теми, которые у вас есть в облаке, экспорт шаблона из Azure может быть еще одним вариантом. Это два подхода: ресурсы существуют в Azure, и вы используете шаблоны ARM для IaC. Кнопка Export template обычно находится в нижней части боковой панели портал Azure. Экспортированный шаблон ARM отражает текущее состояние ресурса, включая параметры, настроенные соединителем службы. Обычно необходимо знать о свойствах ресурсов, чтобы отполировать экспортированный шаблон.

Снимок экрана: портал Azure экспорт шаблона ARM веб-приложения.

Логика подключения сборки

Использование соединителя службы и сохранение конфигурации в Конфигурация приложений

Использование Конфигурация приложений для хранения конфигурации естественно поддерживает сценарии IaC. Поэтому мы рекомендуем использовать этот метод для создания шаблона IaC, если это возможно.

Простые инструкции по порталу см. в этом руководстве по Конфигурация приложений. Чтобы добавить эту функцию в файл bicep, добавьте идентификатор Конфигурация приложений в полезные данные соединителя службы.

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

Использование соединителя службы

Создание подключений между исходной и целевой службой с помощью соединителя службы является предпочтительным и рекомендуемым подходом, если ограничение IaC service Connector не негативно влияет на ваш сценарий. Соединитель служб упрощает шаблон и предоставляет дополнительные функции, такие как проверка работоспособности подключения, которые недоступны при создании подключений непосредственно с помощью логики шаблона.

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

Для форматов свойств и значений, необходимых при создании ресурса соединителя служб, проверьте , как предоставить правильные параметры. Вы также можете предварительно просмотреть и скачать шаблон ARM для справки при создании ресурса соединителя службы в портал Azure.

Снимок экрана: портал Azure экспорт шаблона ARM ресурса соединителя службы.

Использование логики шаблона

В сценариях, в которых важно ограничение Соединителя служб IaC, рассмотрите возможность создания подключений непосредственно с помощью логики шаблона. В следующем шаблоне показано, как подключить учетную запись хранения к веб-приложению с помощью удостоверения, назначаемого системой.

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

При создании подключений с помощью логики шаблона напрямую важно понимать, что делает соединитель служб для каждого типа проверки подлинности, так как логика шаблона эквивалентна операциям серверной части соединителя службы. В следующей таблице показаны сведения об операции, которые необходимо преобразовать в логику шаблона для каждого типа проверки подлинности.

Тип проверки подлинности Операции соединителя служб
Строка секрета или подключения — настройка строка подключения целевой службы в параметрах приложения исходной службы
— настройте брандмауэр в целевой службе, чтобы разрешить исходящие IP-адреса исходной службы
Управляемое удостоверение, назначаемое системой — настройка конечной точки целевой службы в параметрах приложения исходной службы
— настройте брандмауэр в целевой службе, чтобы разрешить исходящие IP-адреса исходной службы
— включение назначаемого системой удостоверения в исходной службе
— создание назначения ролей для удостоверения исходной службы в целевой службе
Управляемое удостоверение, назначаемое пользователем — настройка конечной точки целевой службы в параметрах приложения исходной службы
— настройте брандмауэр в целевой службе, чтобы разрешить исходящие IP-адреса исходной службы
— привязка назначенного пользователем удостоверения к исходной службе
— создание назначения ролей для назначаемого пользователем удостоверения в целевой службе
Субъект-служба — настройка конечной точки целевой службы в параметрах приложения исходной службы
— настройка идентификатора приложения субъекта-службы и секрета в параметрах приложения исходной службы
— настройте брандмауэр в целевой службе, чтобы разрешить исходящие IP-адреса исходной службы
— создание назначения ролей для субъекта-службы в целевой службе