Condividi tramite


Come convertire l'infrastruttura in un modello IaC

Service Connessione or consente agli utenti di connettere i servizi di calcolo ai servizi di backup di destinazione in pochi clic o comandi. Quando si passa da una fase introduttiva a una fase di produzione, gli utenti devono anche eseguire la transizione dall'uso di configurazioni manuali all'uso di modelli IaC (Infrastructure as Code) nelle pipeline CI/CD. In questa guida viene illustrato come convertire i servizi di Azure connessi in modelli IaC.

Prerequisiti

  • Questa guida presuppone che si siano a conoscenza delle limitazioni del Servizio Connessione or IaC.

Panoramica della soluzione

La conversione dell'infrastruttura in modelli IaC prevede in genere due parti principali: la logica per effettuare il provisioning dei servizi di origine e di destinazione e la logica per creare connessioni. Per implementare la logica per effettuare il provisioning dei servizi di origine e di destinazione, sono disponibili due opzioni:

  • Creazione del modello da zero
  • Esportazione del modello da Azure e perfezionamento

Per implementare la logica per creare connessioni, sono disponibili tre opzioni:

  • Uso di Service Connessione or e archiviazione della configurazione in Configurazione app
  • Uso di Service Connessione or nel modello
  • Uso della logica del modello per configurare direttamente i servizi di origine e di destinazione

Le combinazioni di queste diverse opzioni possono produrre soluzioni diverse. A causa delle limitazioni IaC in Service Connessione or, è consigliabile implementare le soluzioni seguenti nell'ordine presentato di seguito. Per applicare queste soluzioni, è necessario comprendere gli strumenti IaC e la grammatica di creazione di modelli.

Soluzione Effettuare il provisioning dell'origine e della destinazione Creare una connessione Scenario applicabile Vantaggi Svantaggi
1 Creazione da zero Usare service Connessione or e archiviare la configurazione in Configurazione app Verifica dell'attività sulle risorse cloud prima di consentire il traffico in tempo reale - Il modello è semplice e leggibile
- Service Connessione or porta valore aggiuntivo
- Nessun problema IaC introdotto dal Connessione or del servizio
- È necessaria una dipendenza aggiuntiva per leggere la configurazione da Configurazione app
- Costo per controllare la disponibilità delle risorse cloud
2 Creazione da zero Usare service Connessione or Verifica dell'attività sulle risorse cloud prima di consentire il traffico in tempo reale - Il modello è semplice e leggibile
- Service Connessione or porta valore aggiuntivo
- Costo per controllare la disponibilità delle risorse cloud
3 Creazione da zero Configurare i servizi di origine e di destinazione direttamente nel modello Nessun controllo di attività sulle risorse cloud - Il modello è semplice e leggibile - Le funzionalità del Connessione or del servizio non sono disponibili
4 Esportazione e polacco Usare service Connessione or e archiviare la configurazione in Configurazione app Verifica dell'attività sulle risorse cloud prima di consentire il traffico in tempo reale - Le risorse sono esattamente le stesse del cloud
- Service Connessione or porta valore aggiuntivo
- Nessun problema IaC introdotto dal Connessione or del servizio
- È necessaria una dipendenza aggiuntiva per leggere la configurazione da Configurazione app
- Costo per controllare la disponibilità delle risorse cloud
- Supporta solo i modelli di Resource Manager
- Sforzi necessari per comprendere e perfezionare il modello
5 Esportazione e polacco Usare service Connessione or Verifica dell'attività sulle risorse cloud prima di consentire il traffico in tempo reale - Le risorse sono esattamente le stesse del cloud
- Service Connessione or porta valore aggiuntivo
- Costo per controllare la disponibilità delle risorse cloud
- Supporta solo i modelli di Resource Manager
- Sforzi necessari per comprendere e perfezionare il modello
6 Esportazione e polacco Configurare i servizi di origine e di destinazione direttamente nel modello Nessun controllo di attività sulle risorse cloud - Le risorse sono esattamente le stesse del cloud - Supporta solo il modello di Resource Manager
- Sforzi per comprendere e perfezionare il modello
- Le funzionalità del Connessione or del servizio non sono disponibili

Creazione di modelli

Le sezioni seguenti illustrano come creare un'app Web e un account di archiviazione e connetterli con un'identità assegnata dal sistema usando Bicep. Illustra come eseguire questa operazione usando service Connessione or e usando la logica del modello.

Effettuare il provisioning dei servizi di origine e di destinazione

Creazione da zero

La creazione del modello da zero è il modo preferito e consigliato per effettuare il provisioning dei servizi di origine e di destinazione, perché è facile iniziare e rendere il modello semplice e leggibile. Di seguito è riportato un esempio che usa un set minimo di parametri per creare un'app Web e un account di archiviazione.

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

Esportazione e polacco

Se le risorse di cui si sta eseguendo il provisioning sono esattamente le stesse di quelle disponibili nel cloud, l'esportazione del modello da Azure potrebbe essere un'altra opzione. Le due impostazioni locali di questo approccio sono: le risorse sono presenti in Azure e si usano i modelli di Resource Manager per l'IaC. Il Export template pulsante si trova in genere nella parte inferiore della barra laterale in portale di Azure. Il modello arm esportato riflette gli stati correnti della risorsa, incluse le impostazioni configurate da Service Connessione or. In genere è necessario conoscere le proprietà delle risorse per completare il modello esportato.

Screenshot del portale di Azure, esportazione del modello arm di un'app Web.

Creare la logica di connessione

Uso di Service Connessione or e archiviazione della configurazione in Configurazione app

L'uso del Configurazione app per archiviare la configurazione supporta naturalmente gli scenari IaC. È quindi consigliabile usare questo metodo per compilare il modello IaC, se possibile.

Per istruzioni semplici sul portale, è possibile fare riferimento a questa esercitazione Configurazione app. Per aggiungere questa funzionalità in un file bicep, aggiungere l'ID Configurazione app nel payload del Connessione or del servizio.

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 di Service Connessione or

La creazione di connessioni tra il servizio di origine e quello di destinazione tramite Service Connessione or è il modo consigliato e consigliato se la limitazione IaC del servizio Connessione or non è rilevante per lo scenario in uso. Service Connessione or semplifica il modello e fornisce anche elementi aggiuntivi, ad esempio la convalida dell'integrità della connessione, che non saranno disponibili se si creano connessioni direttamente tramite la logica del modello.

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

Per i formati di proprietà e valori necessari durante la creazione di una risorsa di Connessione or del servizio, verificare come specificare i parametri corretti. È anche possibile visualizzare in anteprima e scaricare un modello di Resource Manager per riferimento durante la creazione di una risorsa Connessione or del servizio nella portale di Azure.

Screenshot della portale di Azure, esportazione del modello arm di una risorsa del connettore di servizi.

Uso della logica del modello

Per gli scenari in cui la limitazione IaC di Service Connessione or è importante, prendere in considerazione la creazione di connessioni usando direttamente la logica del modello. Il modello seguente illustra come connettere un account di archiviazione a un'app Web usando un'identità assegnata dal 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
  }
}

Quando si creano connessioni usando direttamente la logica del modello, è fondamentale comprendere le operazioni di service Connessione or per ogni tipo di autenticazione, perché la logica del modello equivale alle operazioni back-end di service Connessione or. Nella tabella seguente vengono illustrati i dettagli dell'operazione che è necessario convertire nella logica del modello per ogni tipo di autenticazione.

Tipo di autenticazione Operazioni di service Connessione or
Stringa secret/Connessione ion - Configurare il stringa di connessione del servizio di destinazione nelle impostazioni dell'app del servizio di origine
- Configurare il firewall nel servizio di destinazione per consentire gli indirizzi IP in uscita del servizio di origine
Identità gestita assegnata dal sistema - Configurare l'endpoint del servizio di destinazione nelle impostazioni dell'app del servizio di origine
- Configurare il firewall nel servizio di destinazione per consentire gli indirizzi IP in uscita del servizio di origine
- Abilitare l'identità assegnata dal sistema nel servizio di origine
- Creare un'assegnazione di ruolo per l'identità del servizio di origine nel servizio di destinazione
Identità gestita assegnata dall'utente - Configurare l'endpoint del servizio di destinazione nelle impostazioni dell'app del servizio di origine
- Configurare il firewall nel servizio di destinazione per consentire gli indirizzi IP in uscita del servizio di origine
- Associare l'identità assegnata dall'utente al servizio di origine
- Creare un'assegnazione di ruolo per l'identità assegnata dall'utente nel servizio di destinazione
Entità servizio - Configurare l'endpoint del servizio di destinazione nelle impostazioni dell'app del servizio di origine
- Configurare l'appId e il segreto dell'entità servizio nelle impostazioni dell'app del servizio di origine
- Configurare il firewall nel servizio di destinazione per consentire gli indirizzi IP in uscita del servizio di origine
- Creare un'assegnazione di ruolo per l'entità servizio nel servizio di destinazione