Autenticare Terraform in Azure

Terraform consente di definire, visualizzare in anteprima e distribuire l'infrastruttura cloud. Con Terraform è possibile creare file di configurazione usando la sintassi HCL. La sintassi HCL consente di specificare il provider di servizi cloud, ad esempio Azure, e gli elementi che costituiscono l'infrastruttura cloud. Dopo aver creato i file di configurazione, è necessario creare un piano di esecuzione che consenta di visualizzare in anteprima le modifiche apportate all'infrastruttura prima che vengano distribuite. Dopo aver verificato le modifiche, è possibile applicare il piano di esecuzione per distribuire l'infrastruttura.

Per usare i comandi Terraform nella sottoscrizione di Azure, è prima necessario autenticare Terraform in tale sottoscrizione. Questo articolo illustra alcuni scenari comuni per l'autenticazione in Azure.

In questo articolo vengono illustrate le operazioni seguenti:

  • Informazioni sugli scenari comuni di autenticazione di Terraform e Azure
  • Eseguire l'autenticazione tramite un account Microsoft da Cloud Shell (usando Bash o PowerShell)
  • Eseguire l'autenticazione tramite un account Microsoft da Windows (usando Bash o PowerShell)
  • Creare un'entità servizio usando l'interfaccia della riga di comando di Azure
  • Creare un'entità servizio usando PowerShell
  • Specificare le credenziali dell'entità servizio nelle variabili di ambiente
  • Specificare le credenziali dell'entità servizio in un blocco di provider Terraform

1. Configurare l'ambiente

  • Sottoscrizione di Azure: se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.

2. Autenticare Terraform in Azure

Scenari di autenticazione di Terraform e Azure

Terraform supporta solo l'autenticazione in Azure tramite l'interfaccia della riga di comando di Azure. L'autenticazione con Azure PowerShell non è supportata. Pertanto, anche se è possibile usare il modulo Azure PowerShell quando si esegue il lavoro di Terraform, è prima necessario eseguire l'autenticazione in Azure usando l'interfaccia della riga di comando di Azure.

Questo articolo illustra come autenticare Terraform in Azure per gli scenari seguenti. Per altre informazioni sulle opzioni per autenticare Terraform in Azure, vedere Autenticazione tramite l'interfaccia della riga di comando di Azure.

Eseguire l'autenticazione in Azure tramite un account Microsoft

Un account Microsoft è un nome utente (associato a un messaggio di posta elettronica e alle relative credenziali) usato per accedere a servizi Microsoft, ad esempio Azure. Un account Microsoft può essere associato a una o più sottoscrizioni di Azure, con una di queste sottoscrizioni predefinite.

I passaggi seguenti illustrano come:

  • Accedere ad Azure in modo interattivo usando un account Microsoft
  • Elencare le sottoscrizioni di Azure associate dell'account (incluso il valore predefinito)
  • Impostare la sottoscrizione corrente.
  1. Aprire una riga di comando che abbia accesso all'interfaccia della riga di comando di Azure.

  2. Eseguire az login senza parametri e seguire le istruzioni per accedere ad Azure.

    az login
    

    Punti principali:

    • Al termine dell'accesso, az login visualizza un elenco delle sottoscrizioni di Azure associate all'account Microsoft connesso, inclusa la sottoscrizione predefinita.
  3. Per confermare la sottoscrizione di Azure corrente, eseguire az account show.

    az account show
    
  4. Per visualizzare tutti i nomi e gli ID delle sottoscrizioni di Azure per un account Microsoft specifico, eseguire az account list.

    az account list --query "[?user.name=='<microsoft_account_email>'].{Name:name, ID:id, Default:isDefault}" --output Table
    

    Punti principali:

    • Sostituire il <microsoft_account_email> segnaposto con l'indirizzo di posta elettronica dell'account Microsoft di cui si desidera elencare le sottoscrizioni di Azure.
    • Con un account live, ad esempio Hotmail o Outlook, potrebbe essere necessario specificare l'indirizzo di posta elettronica completo. Ad esempio, se l'indirizzo di posta elettronica è admin@hotmail.com, potrebbe essere necessario sostituire il segnaposto con live.com#admin@hotmail.com.
  5. Per usare una sottoscrizione di Azure specifica, eseguire az account set.

    az account set --subscription "<subscription_id_or_subscription_name>"
    

    Punti principali:

    • Sostituire il <subscription_id_or_subscription_name> segnaposto con l'ID o il nome della sottoscrizione da usare.
    • La chiamata a az account set non visualizza i risultati del passaggio alla sottoscrizione di Azure specificata. È però possibile usare az account show per confermare che la sottoscrizione di Azure corrente è cambiata.
    • Se si esegue il az account list comando del passaggio precedente, si noterà che la sottoscrizione di Azure predefinita è stata modificata nella sottoscrizione specificata con az account set.

Creare un'entità servizio

Gli strumenti automatici che distribuiscono o usano servizi di Azure, come Terraform, devono sempre avere autorizzazioni limitate. Anziché avere applicazioni che accedono come utente con privilegi completi, Azure fornisce entità servizio.

Il modello più comune consiste nell'accedere in modo interattivo ad Azure, creare un'entità servizio, testare l'entità servizio e quindi usare tale entità servizio per l'autenticazione futura (in modo interattivo o dagli script).

  1. Per creare un'entità servizio, accedere ad Azure. Dopo l'autenticazione in Azure tramite un account Microsoft, tornare qui.

  2. Se si sta creando un'entità servizio da Git Bash, impostare la MSYS_NO_PATHCONV variabile di ambiente. Questo passaggio non è necessario se si usa Cloud Shell.

    export MSYS_NO_PATHCONV=1    
    

    Punti principali:

    • È possibile impostare la MSYS_NO_PATHCONV variabile di ambiente a livello globale (per tutte le sessioni del terminale) o in locale (solo per la sessione corrente). Poiché la creazione di un'entità servizio non è un'operazione eseguita spesso, l'esempio imposta il valore per la sessione corrente. Per impostare questa variabile di ambiente a livello globale, aggiungere l'impostazione al ~/.bashrc file.
  3. Per creare un'entità servizio, eseguire az ad sp create-for-rbac.

    az ad sp create-for-rbac --name <service_principal_name> --role Contributor --scopes /subscriptions/<subscription_id>
    

    Punti principali:

    • È possibile sostituire con <service-principal-name> un nome personalizzato per l'ambiente o omettere completamente il parametro. Se si omette il parametro , il nome dell'entità servizio viene generato in base alla data e all'ora correnti.
    • Al termine, az ad sp create-for-rbac visualizza diversi valori. I valori appId, password e tenant vengono usati nel passaggio successivo.
    • Se viene persa, questa password non può essere recuperata. Di conseguenza, è consigliabile archiviarla in un luogo sicuro. Se si dimentica la password, è possibile reimpostare le credenziali dell'entità servizio.
    • Per questo articolo viene usata un'entità servizio con un ruolo Collaboratore . Per altre informazioni sui ruoli di controllo degli Controllo di accesso accessi in base al ruolo, vedere Controllo degli accessi in base al ruolo: ruoli predefiniti.
    • L'output della creazione dell'entità servizio include credenziali riservate. Assicurarsi di non includere queste credenziali nel codice o di controllare le credenziali nel controllo del codice sorgente.
    • Per altre informazioni sulle opzioni per la creazione di un'entità servizio con l'interfaccia della riga di comando di Azure, vedere l'articolo Creare un'entità servizio di Azure con l'interfaccia della riga di comando di Azure.

Specificare le credenziali dell'entità servizio nelle variabili di ambiente

Dopo aver creato un'entità servizio, è possibile specificarne le credenziali in Terraform tramite variabili di ambiente.

  1. Modificare il ~/.bashrc file aggiungendo le variabili di ambiente seguenti.

    export ARM_SUBSCRIPTION_ID="<azure_subscription_id>"
    export ARM_TENANT_ID="<azure_subscription_tenant_id>"
    export ARM_CLIENT_ID="<service_principal_appid>"
    export ARM_CLIENT_SECRET="<service_principal_password>"
    
  2. Per eseguire lo ~/.bashrc script, eseguire source ~/.bashrc (o il relativo equivalente abbreviato . ~/.bashrc). È anche possibile uscire e riaprire Cloud Shell perché lo script venga eseguito automaticamente.

    . ~/.bashrc
    
  3. Dopo aver impostato le variabili di ambiente, è possibile verificarne i valori nel modo seguente:

    printenv | grep ^ARM*
    

Punti principali:

  • Come per qualsiasi variabile di ambiente, per accedere a un valore di sottoscrizione di Azure dall'interno di uno script Terraform, usare la sintassi seguente: ${env.<environment_variable>}. Ad esempio, per accedere al ARM_SUBSCRIPTION_ID valore, specificare ${env.ARM_SUBSCRIPTION_ID}.
  • La creazione e l'applicazione di piani di esecuzione terraform apporta modifiche alla sottoscrizione di Azure associata all'entità servizio. Questo fatto può talvolta generare confusione se si è connessi a una sottoscrizione di Azure e le variabili di ambiente puntano a una seconda sottoscrizione di Azure. Esaminiamo l'esempio seguente per spiegare. Si supponga di avere due sottoscrizioni di Azure: SubA e SubB. Se la sottoscrizione di Azure corrente è SubA (determinata tramite az account show) mentre le variabili di ambiente puntano a SubB, tutte le modifiche apportate da Terraform si trovano in SubB. È quindi necessario accedere alla sottoscrizione SubB per eseguire i comandi dell'interfaccia della riga di comando di Azure o i comandi di Azure PowerShell per visualizzare le modifiche.

Specificare le credenziali dell'entità servizio in un blocco di provider Terraform

Il blocco del provider di Azure definisce la sintassi che consente di specificare le informazioni di autenticazione della sottoscrizione di Azure.

terraform {
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = "~>2.0"
    }
  }
}

provider "azurerm" {
  features {}

  subscription_id   = "<azure_subscription_id>"
  tenant_id         = "<azure_subscription_tenant_id>"
  client_id         = "<service_principal_appid>"
  client_secret     = "<service_principal_password>"
}

# Your code goes here

Attenzione

La possibilità di specificare le credenziali della sottoscrizione di Azure in un file di configurazione terraform può essere utile, soprattutto durante i test. Tuttavia, non è consigliabile archiviare le credenziali in un file di testo non crittografato che può essere visualizzato da utenti non attendibili.

3. Verificare i risultati

Verificare di aver eseguito l'autenticazione nella sottoscrizione di Azure visualizzando la sottoscrizione corrente.

Per confermare la sottoscrizione di Azure corrente tramite l'interfaccia della riga di comando di Azure, eseguire az account show.

az account show

Passaggi successivi