Infrastruttura come codice
Suggerimento
Questo contenuto è un estratto dell'eBook, Progettazione di applicazioni .NET native del cloud per Azure, disponibile in .NET Docs o come PDF scaricabile gratuitamente che può essere letto offline.
I sistemi nativi del cloud adottano microservizi, contenitori e progettazione moderna del sistema per ottenere velocità e agilità. Forniscono fasi di compilazione e rilascio automatizzate per garantire codice coerente e qualitativo. Tuttavia, questa è solo parte della storia. Come si effettua il provisioning degli ambienti cloud su cui vengono eseguiti questi sistemi?
Le applicazioni moderne native del cloud adottano la pratica ampiamente accettata dell'infrastruttura come codice o IaC
. Con IaC è possibile automatizzare il provisioning della piattaforma. Sostanzialmente, si applicano procedure di progettazione software, ad esempio test e controllo delle versioni alle procedure DevOps. L'infrastruttura e le distribuzioni sono automatizzate, coerenti e ripetibili. Proprio come il recapito continuo ha automatizzato il modello tradizionale di distribuzioni manuali, l'infrastruttura distribuita come codice (IaC) sta evolvendo il modo in cui vengono gestiti gli ambienti dell'applicazione.
Strumenti come Azure Resource Manager (ARM), Terraform e l'interfaccia della riga di comando di Azure consentono di creare uno script dichiarativo dell'infrastruttura cloud necessaria.
Modelli di Gestione risorse di Azure
ARM è l'acronimo di Azure Resource Manager. Si tratta di un motore di provisioning API integrato in Azure ed esposto come servizio API. ARM consente di distribuire, aggiornare, eliminare e gestire le risorse contenute nel gruppo di risorse di Azure in un'unica operazione coordinata. È possibile fornire al motore un modello basato su JSON che specifica le risorse necessarie e la relativa configurazione. ARM orchestra automaticamente la distribuzione nell'ordine corretto rispettando le dipendenze. Il motore garantisce l'idempotenza. Se esiste già una risorsa desiderata con la stessa configurazione, il provisioning verrà ignorato.
I modelli di Azure Resource Manager sono un linguaggio basato su JSON per definire varie risorse in Azure. Lo schema di base è simile alla figura 10-14.
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "",
"apiProfile": "",
"parameters": { },
"variables": { },
"functions": [ ],
"resources": [ ],
"outputs": { }
}
Figura 10-14 - Schema per un modello di Resource Manager
All'interno di questo modello, è possibile definire un contenitore di archiviazione all'interno della sezione resources, come illustrato di seguito:
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"name": "[variables('storageAccountName')]",
"location": "[parameters('location')]",
"apiVersion": "2018-07-01",
"sku": {
"name": "[parameters('storageAccountType')]"
},
"kind": "StorageV2",
"properties": {}
}
],
Figura 10-15 - Esempio di un account di archiviazione definito in un modello di Resource Manager
Un modello di Resource Manager può essere parametrizzato con informazioni di configurazione e ambiente dinamico. In questo modo è possibile riutilizzarlo per definire ambienti diversi, ad esempio sviluppo, controllo di qualità o produzione. In genere, il modello crea tutte le risorse all'interno di un singolo gruppo di risorse di Azure. È possibile definire più gruppi di risorse in un singolo modello di Resource Manager, se necessario. È possibile eliminare tutte le risorse in un ambiente eliminando il gruppo di risorse stesso. L'analisi dei costi può essere eseguita anche a livello di gruppo di risorse, consentendo una rapida contabilità della quantità di costi di ogni ambiente.
Sono disponibili molti esempi di modelli di Resource Manager nel progetto modelli di avvio rapido di Azure in GitHub. Consentono di accelerare la creazione di un nuovo modello o la modifica di un modello esistente.
I modelli di Resource Manager possono essere eseguiti in molti modi. Forse il modo più semplice consiste nell’incollarli nel portale di Azure. Per le distribuzioni sperimentali, questo metodo può essere rapido. Possono anche essere eseguiti come parte di un processo di compilazione o versione in Azure DevOps. Esistono attività che sfruttano le connessioni in Azure per eseguire i modelli. Le modifiche apportate ai modelli di Resource Manager vengono applicate in modo incrementale, vale a dire che per aggiungere una nuova risorsa è sufficiente aggiungerla al modello. Gli strumenti riconciliano le differenze tra le risorse correnti e quelle definite nel modello. Le risorse verranno quindi create o modificate in modo che corrispondano a quanto definito nel modello.
Terraform
Le applicazioni native del cloud vengono spesso costruite come cloud agnostic
. In questo modo, l'applicazione non è strettamente associata a un determinato fornitore di cloud e può essere distribuita in qualsiasi cloud pubblico.
Terraform è uno strumento commerciale che consente di effettuare il provisioning di applicazioni native del cloud in tutti i principali operatori cloud: Azure, Google Cloud Platform, AWS e AliCloud. Anziché usare JSON come linguaggio di definizione del modello, usa l'HCL (Hashicorp Configuration Language) che è leggermente più terso.
Un file Terraform di esempio che esegue la stessa operazione del modello di Resource Manager precedente (figura 10-15) è illustrato nella figura 10-16:
provider "azurerm" {
version = "=1.28.0"
}
resource "azurerm_resource_group" "testrg" {
name = "production"
location = "West US"
}
resource "azurerm_storage_account" "testsa" {
name = "${var.storageAccountName}"
resource_group_name = "${azurerm_resource_group.testrg.name}"
location = "${var.region}"
account_tier = "${var.tier}"
account_replication_type = "${var.replicationType}"
}
Figura 10-16 - Esempio di modello di Resource Manager
Terraform fornisce anche messaggi di errore intuitivi per i modelli di problema. È anche disponibile un'attività di convalida utile che può essere usata nella fase di compilazione per rilevare gli errori del modello in anticipo.
Come per i modelli di Resource Manager, gli strumenti da riga di comando sono disponibili per distribuire modelli Terraform. In Azure Pipelines sono disponibili anche attività create dalla community che possono convalidare e applicare modelli Terraform.
In alcuni casi, i modelli Terraform e ARM generano valori significativi, ad esempio una stringa di connessione a un database appena creato. Queste informazioni possono essere acquisite nella pipeline di compilazione e usate nelle attività successive.
Script e attività dell'interfaccia della riga di comando di Azure
Infine, è possibile sfruttare l' interfaccia della riga di comando di Azure per creare uno script dichiarativo dell'infrastruttura cloud. Gli script dell'interfaccia della riga di comando di Azure possono essere creati, trovati e condivisi per effettuare il provisioning e configurare quasi tutte le risorse di Azure. L'interfaccia della riga di comando è semplice da usare con una curva di apprendimento dolce. Gli script vengono eseguiti all'interno di PowerShell o Bash. È anche semplice eseguirne il debug, soprattutto a confronto con i modelli di Resource Manager.
Gli script dell'interfaccia della riga di comando di Azure funzionano bene quando è necessario rimuovere e ridistribuire l'infrastruttura. L'aggiornamento di un ambiente esistente può essere complicato. Molti comandi dell'interfaccia della riga di comando non sono idempotenti. Ciò significa che ricreano la risorsa ogni volta che vengono eseguite, anche se la risorsa esiste già. È sempre possibile aggiungere codice che verifica l'esistenza di ogni risorsa prima di crearla. Tuttavia, in questo modo, lo script può diventare voluminoso e difficile da gestire.
Questi script possono essere incorporati anche nelle pipeline di Azure DevOps come Azure CLI tasks
. L'esecuzione della pipeline richiama lo script.
La figura 10-17 mostra un frammento di codice YAML che elenca la versione dell'interfaccia della riga di comando di Azure e i dettagli della sottoscrizione. Si noti che i comandi dell'interfaccia della riga di comando di Azure sono inclusi in uno script inline.
- task: AzureCLI@2
displayName: Azure CLI
inputs:
azureSubscription: <Name of the Azure Resource Manager service connection>
scriptType: ps
scriptLocation: inlineScript
inlineScript: |
az --version
az account show
Figura 10-17 - Script dell'interfaccia della riga di comando di Azure
Nell'articolo Che cos'è l'infrastruttura come codice, l’autore Sam Guckheimer spiega che "I team che implementano IaC può offrire ambienti stabili e su larga scala. Teams evita la configurazione manuale degli ambienti e applica la coerenza rappresentando lo stato desiderato degli ambienti tramite codice. Le distribuzioni dell'infrastruttura con IaC sono ripetibili ed evitano i problemi di runtime causati dalla deriva delle configurazioni o da dipendenze mancanti. I team DevOps possono collaborare con un set unificato di procedure e strumenti per distribuire applicazioni e l'infrastruttura di supporto rapidamente, in modo affidabile e su larga scala".