Cómo traducir la infraestructura a una plantilla de IaC

Service Connector ayuda a los usuarios a conectar sus servicios de proceso para dirigirse a los servicios de respaldo en tan solo unos clics o comandos. Al pasar de una fase de introducción a una fase de producción, los usuarios también deben realizar la transición del uso de configuraciones manuales al uso de plantillas de infraestructura como código (IaC) en sus canalizaciones de CI/CD. En esta guía, se muestra cómo traducir los servicios de Azure conectados a plantillas de IaC.

Requisitos previos

Información general de la solución

La traducción de la infraestructura a plantillas de IaC suele implicar dos partes principales: la lógica para aprovisionar servicios de origen y destino y la lógica para compilar conexiones. Para implementar la lógica para aprovisionar servicios de origen y de destino, hay dos opciones:

  • Creación de la plantilla desde cero
  • Exportación de la plantilla desde Azure y pulirla

Para implementar la lógica para compilar conexiones, hay tres opciones:

  • Uso de Service Connector y almacenamiento de la configuración en App Configuration
  • Uso de Service Connector en la plantilla
  • Uso de la lógica de plantilla para configurar los servicios de origen y destino directamente

Las combinaciones de estas diferentes opciones pueden producir diferentes soluciones. Debido a limitaciones de IaC en Service Connector, se recomienda implementar las siguientes soluciones en el orden que se presenta a continuación. Para aplicar estas soluciones, debe comprender las herramientas de IaC y la gramática de creación de plantillas.

Solución Aprovisionar origen y destino Conexión de compilación Escenario aplicable Ventajas Desventajas
1 Creación desde cero Uso de Service Connector y almacenamiento de la configuración en App Configuration Tiene comprobación de vida en los recursos en la nube antes de permitir el tráfico activo - La plantilla es sencilla y legible
- Service Connector aporta un valor adicional
- Service Connector no presenta ningún problema de IaC
- Se necesita una dependencia adicional para leer la configuración de App Configuration
- Costo para comprobar la vida de los recursos en la nube
2 Creación desde cero Uso de Service Connector Tiene comprobación de vida en los recursos en la nube antes de permitir el tráfico activo - La plantilla es sencilla y legible
- Service Connector aporta un valor adicional
- Costo para comprobar la vida de los recursos en la nube
3 Creación desde cero Configurar los servicios de origen y de destino directamente en la plantilla Ninguna comprobación de vida en los recursos en la nube - La plantilla es sencilla y legible - Las características de Service Connector no están disponibles
4 Exportación y pulido Uso de Service Connector y almacenamiento de la configuración en App Configuration Tiene comprobación de vida en los recursos en la nube antes de permitir el tráfico activo - Los recursos son exactamente iguales que en la nube
- Service Connector aporta un valor adicional
- Service Connector no presenta ningún problema de IaC
- Se necesita una dependencia adicional para leer la configuración de App Configuration
- Costo para comprobar la vida de los recursos en la nube
- Solo admite plantillas de ARM
- Esfuerzos necesarios para comprender y pulir la plantilla
5 Exportación y pulido Uso de Service Connector Tiene comprobación de vida en los recursos en la nube antes de permitir el tráfico activo - Los recursos son exactamente iguales que en la nube
- Service Connector aporta un valor adicional
- Costo para comprobar la vida de los recursos en la nube
- Solo admite plantillas de ARM
- Esfuerzos necesarios para comprender y pulir la plantilla
6 Exportación y pulido Configurar los servicios de origen y de destino directamente en la plantilla Ninguna comprobación de vida en los recursos en la nube - Los recursos son exactamente iguales que en la nube - Solo se admite la plantilla de ARM
- Esfuerzos para comprender y pulir la plantilla
- Las características de Service Connector no están disponibles

Creación de plantillas

En las secciones siguientes se muestra cómo crear una aplicación web y una cuenta de almacenamiento y conectarlas con una identidad asignada por el sistema mediante Bicep. Muestra cómo hacerlo mediante Service Connector y mediante la lógica de plantilla.

Aprovisionar servicios de origen y de destino

Creación desde cero

La creación de la plantilla desde cero es la manera preferida y recomendada de aprovisionar servicios de origen y de destino, ya que es fácil empezar y hace que la plantilla sea sencilla y legible. A continuación se muestra un ejemplo, mediante un conjunto mínimo de parámetros para crear una aplicación web y una cuenta de almacenamiento.

// This template creates a webapp and a storage account.
// In order to make it more readable, we use only the mininal 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'
}

Exportación y pulido

Si los recursos que está aprovisionando son exactamente los mismos que los que tiene en la nube, exportar la plantilla desde Azure podría ser otra opción. Las dos instalaciones de este enfoque son: los recursos existen en Azure y usa plantillas de ARM para IaC. El botón Export template suele estar en la parte inferior de la barra lateral de Azure Portal. La plantilla de ARM exportada refleja los estados actuales del recurso, incluida la configuración configurada por Service Connector. Normalmente, debe conocer las propiedades de los recursos para pulir la plantilla exportada.

Captura de pantalla de Azure Portal, exportación de la plantilla de arm de una aplicación web.

Compilación de la lógica de conexión

Uso de Service Connector y almacenamiento de la configuración en App Configuration

El uso de App Configuration para almacenar la configuración admite de forma natural escenarios de IaC. Por lo tanto, se recomienda usar este método para compilar la plantilla de IaC si es posible.

Para obtener instrucciones sencillas del portal, puede consultar este tutorial de App Configuration. Para agregar esta característica a un archivo de bicep, agregue el id. de App Configuration en la carga de Service Connector.

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

Uso de Service Connector

La creación de conexiones entre el servicio de origen y de destino mediante Service Connector es la manera preferida y recomendada si el Service Connector limitación IaC no importa para su escenario. Service Connector simplifica la plantilla y también proporciona elementos adicionales, como la validación del estado de conexión, que no tendrá si va a compilar conexiones a través de la lógica de plantilla directamente.

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

Para los formatos de propiedades y valores necesarios al crear un recurso de Service Connector, compruebe cómo proporcionar parámetros correctos. También puede obtener una vista previa y descargar una plantilla de ARM como referencia al crear un recurso de Service Connector en Azure Portal.

Captura de pantalla de Azure Portal, exportación de la plantilla arm de un recurso del conector de servicio.

Uso de la lógica de plantilla

En los escenarios en los que el conector de servicio limitación de IaC importa, considere la posibilidad de crear conexiones mediante la lógica de plantilla directamente. La plantilla siguiente es un ejemplo que muestra cómo conectar una cuenta de almacenamiento a una aplicación web mediante una identidad asignada por el sistema.

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

Al compilar conexiones mediante la lógica de plantilla directamente, es fundamental comprender lo que Service Connector hace para cada tipo de autenticación, ya que la lógica de plantilla es equivalente a las operaciones de back-end de Service Connector. En la tabla siguiente se muestran los detalles de la operación que debe traducir a la lógica de plantilla para cada tipo de autenticación.

Auth type Operaciones de Service Connector
Secreto / cadena de conexión - Configuración de la cadena de conexión del servicio de destino en la configuración de la aplicación del servicio de origen
- Configuración del firewall en el servicio de destino para permitir las direcciones IP salientes del servicio de origen
Identidad administrada asignada por el sistema - Configuración del punto de conexión del servicio de destino en la configuración de la aplicación del servicio de origen
- Configuración del firewall en el servicio de destino para permitir las direcciones IP salientes del servicio de origen
- Habilitación de la identidad asignada por el sistema en el servicio de origen
- Creación de una asignación de roles para la identidad del servicio de origen en el servicio de destino
Identidad administrada asignada por el usuario - Configuración del punto de conexión del servicio de destino en la configuración de la aplicación del servicio de origen
- Configuración del firewall en el servicio de destino para permitir las direcciones IP salientes del servicio de origen
- Enlace de la identidad asignada por el usuario al servicio de origen
- Creación de una asignación de roles para la identidad asignada por el usuario en el servicio de destino
Entidad de servicio - Configuración del punto de conexión del servicio de destino en la configuración de la aplicación del servicio de origen
- Configuración del appId y el secreto de la entidad de servicio en la configuración de la aplicación del servicio de origen
- Configuración del firewall en el servicio de destino para permitir las direcciones IP salientes del servicio de origen
- Creación de una asignación de roles para la entidad de servicio en el servicio de destino