Creación de conexiones con herramientas 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, aprenderá a convertir los servicios de Azure conectados en plantillas de IaC.
Requisitos previos
- En esta guía se da por supuesto que conoce las Limitaciones de IaC de Service Connector.
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 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'
}
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.
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, siempre y cuando la limitación de IaC de Service Connector no afecte negativamente a su escenario. Service Connector simplifica la plantilla y proporciona características adicionales, como una validación del estado de conexión, que no están disponibles al crear conexiones directamente a través de la lógica de plantilla.
// 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'
}
}
}
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.
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 |