Uso dello storage degli oggetti per i file di stato

Memorizza i file di stato Terraform nello storage degli oggetti OCI.

Nota

Dei tipi backend descritti in questa pagina, si consiglia di utilizzare un uso del backend nativo OCI.

Utilizzo di un backend compatibile con S3 (obsoleto)

Nota

Il metodo backend compatibile con S3 non è più valido. Utilizzare questo metodo solo se non si è in grado di eseguire l'upgrade a Terraform versione v1.12.0 o successiva.

Per configurare il backend compatibile con S3, attenersi alla procedura descritta nelle sezioni riportate di seguito.

Task 1: Impostazione dell'accesso a OCI

Per ulteriori informazioni sulla compatibilità S3, vedere Prerequisiti dell'interfaccia API di compatibilità Amazon S3. Per informazioni sulle autorizzazioni per Object Lifecycle Management, vedere Criteri IAM obbligatori.
  1. Iscriviti a Oracle Cloud Infrastructure e ottieni uno spazio di nomi univoco.
  2. Qualsiasi utente dell'API di compatibilità Amazon S3 con lo storage degli oggetti deve disporre dell'autorizzazione per utilizzare il servizio. Se non si è sicuri di disporre dell'autorizzazione, contattare l'amministratore. Per informazioni di base sui criteri, vedere funzionamento dei criteri. Per i criteri che consentono l'uso dello storage degli oggetti, fare riferimento ai criteri comuni e al riferimento ai criteri.
  3. Utilizzare una chiave segreta del cliente esistente o crearne una. Una chiave segreta del cliente è costituita da una coppia chiave di accesso/chiave segreta. Per ulteriori informazioni, vedere Utilizzo delle chiavi segrete cliente. Per utilizzare o creare la coppia di chiavi:
    • Per utilizzare una chiave segreta cliente esistente, è necessario già conoscere la chiave segreta. Per motivi di sicurezza, non è possibile recuperare una chiave segreta dopo la generazione. Per mostrare o copiare la chiave di accesso: nel menu di navigazione selezionare il menu Profilo Icona menu Profilo, quindi selezionare Impostazioni utente o Profilo personale, a seconda dell'opzione visualizzata. Sul lato sinistro della pagina selezionare Chiavi segrete cliente. Passare il puntatore del mouse sulla chiave di accesso associata al nome di una determinata chiave segreta del cliente, quindi selezionare Copia.
    • Per creare una chiave segreta del cliente mediante la console, vedere Per creare una chiave segreta del cliente.
    • Per creare una chiave segreta del cliente utilizzando l'interfaccia a riga di comando (CLI, Command Line Interface), vedere oci iam customer-secret-key create.

Task 2: Configura autenticazione

  1. Impostare la posizione per il file delle credenziali.
    Attenzione

    Non impostare mai gli attributi access_key e secret_key nella stessa configurazione backend Terraform. La memorizzazione di questi attributi nella stessa configurazione crea un rischio per la sicurezza.

    La posizione predefinita è ~/.aws/credentials. È possibile impostare una posizione alternativa utilizzando l'opzione shared_credentials_file del backend S3.

  2. Configurare la voce [default] nel file delle credenziali con le credenziali di storage degli oggetti appropriate.

    Il file può contenere un numero qualsiasi di profili di credenziali. Se si fornisce un nome di profilo diverso, è necessario aggiornare anche l'opzione profile del backend nel file di configurazione Terraform.

    Di seguito è riportato un esempio di credenziali di storage degli oggetti.

    [default]
    aws_access_key_id=ae37c0b4ffc488c7d4e6b360a21312244330718f
    aws_secret_access_key=mSTdaWhlbWj3ty4JZXlm0NUZV52xlImWjayJLJ6OH9A=
    Nota

    I valori chiave forniti nell'esempio non sono validi. I valori validi aws_access_key_id e aws_secret_access_key sono valori specifici dell'utente generati utilizzando i passi precedenti.

Task 3: configurare il backend S3 in Terraform

  1. Impostare il valore endpoint dello storage degli oggetti nel formato seguente:
    https://<namespace>.compat.objectstorage.<region>.oraclecloud.com
  2. Aggiornare il blocco terraform all'interno della configurazione Terraform per definire il tipo backend.
    Nota

    Poiché le variabili e la gente del posto non vengono accettate nel blocco terraform, è necessario impostare i valori di configurazione del backend con codice fisso.

    Di seguito sono riportati i blocchi organizzati in base alla versione Terraform. Selezionare il blocco che inserisce nella cache la versione della configurazione Terraform.

    Terraform versione 1.6.4 o successiva

    # (Terraform version >= 1.6.4)
    terraform {
      backend "s3" {
        bucket                    = "terraform-states"
        region                    = "us-phoenix-1"
        key                       = "tf.tfstate"
        skip_region_validation      = true
        skip_credentials_validation = true
        skip_requesting_account_id  = true
        use_path_style              = true
        skip_s3_checksum            = true
        skip_metadata_api_check = true
        endpoints = {
          s3 = "https://<namespace>.compat.objectstorage.<region>.oraclecloud.com"
        }
      }
    }

    Versioni Terraform precedenti alla 1.64

    # (Terraform version < 1.6.4)
    terraform {
      backend "s3" {
        bucket   = "terraform-states"
        key      = "networking/terraform.tfstate"
        region   = "us-phoenix-1"
        endpoint = "https://<namespace>.compat.objectstorage.<region>.oraclecloud.com"
       skip_region_validation      = true
        skip_credentials_validation = true
        skip_metadata_api_check     = true
        force_path_style            = true
      }
    }
    Attenzione

    Se si utilizza lo stesso bucket in molte configurazioni Terraform, la chiave deve essere univoca per evitare di sovrascrivere il file di stato. In questo esempio viene utilizzato un singolo bucket (terraform-states) per memorizzare tutti i file di stato Terraform, ma viene utilizzato un prefisso univoco per il nome dell'oggetto in base alla risorsa (networking).
  3. Eseguire terraform init.

    Se si dispone già di un file terraform.tfstate esistente, Terraform richiede di confermare che il file di stato corrente è quello da caricare nello stato remoto.

  4. Eseguire terraform apply.
Il file di stato generato viene caricato nello storage degli oggetti.
Per condividere lo stato tra i progetti Terraform, utilizzare la configurazione backend in terraform_remote_state. Per maggiori informazioni, vedere Accessing Remote States.

Uso di un backend HTTP

Nota

Poiché il backend HTTP richiede una richiesta preautenticata (PAR, Pre-Authenticated Request) per ciascun file di stato, il metodo preferito per memorizzare i file di stato nello storage degli oggetti è Uso del backend nativo OCI.

Utilizzare il tipo di backend HTTP per memorizzare lo stato utilizzando un client REST e per recuperare, aggiornare e rimuovere lo stato utilizzando i metodi HTTP GET, POST e DELETE.

Per configurare il backend HTTP, attenersi alla procedura descritta nelle sezioni seguenti.

Task 1: Carica stato esistente

Prima di creare la richiesta preautenticata (PAR, Pre-authenticated Request) è necessario che nel bucket esista un file di stato. Questo file può essere un file di stato esistente o vuoto per lo stato iniziale.
Per caricare un file di stato esistente utilizzando Curl, effettuare una richiesta HTTP PUT all'URL dell'area di memorizzazione degli oggetti:
curl -X PUT -H "Content-Type: text/plain" --data-binary "@path/to/local/tfstate" http://<prefix>/<my-access-uri>
Per istruzioni su come caricare un file in un bucket utilizzando la console, l'interfaccia CLI o l'interfaccia API, vedere Uploading an Object Storage in a Bucket.

Task 2: Creare una richiesta preautenticata di lettura/scrittura

Nel caso di una richiesta preautenticata (PAR, Pre-authenticated Request) nello storage degli oggetti che specifica le autorizzazioni di lettura/scrittura, è possibile accedere al file di stato Terraform senza fornire le credenziali.

Per istruzioni su come creare una richiesta PAR utilizzando la console, l'interfaccia CLI o l'interfaccia API, vedere Creazione di una richiesta preautenticata nello storage degli oggetti.

Task 3: configurare il backend HTTP in Terraform

  1. Impostare il valore dell'indirizzo nel seguente formato, in cui l'area e l'URI di accesso sono specifici per l'utente:
    https://objectstorage.<region>.oraclecloud.com/<my-access-uri>

    Ad esempio:

    https://objectstorage.us-phoenix-1.oraclecloud.com/p/example-guid/n/example/b/terraform-state/o/terraform.tfstate
  2. Aggiornare il blocco terraform all'interno della configurazione Terraform per definire il tipo backend.
    Nota

    Poiché le variabili e la gente del posto non vengono accettate nel blocco terraform, è necessario impostare i valori di configurazione del backend con codice fisso.

    Di seguito viene riportato un esempio di configurazione Terraform che utilizza l'area us-phoenix-1.

    terraform {
      backend "http" {
        update_method = "PUT"
        address       = "https://objectstorage.us-phoenix-1.oraclecloud.com/p/example-guid/n/example/b/terraform-state/o/terraform.tfstate"
      }
    }

    Per ulteriori informazioni sui file di configurazione e stato che fanno riferimento al codice e un riepilogo delle variabili di configurazione, vedere HTTP.

  3. Eseguire terraform init.
  4. Eseguire terraform apply.
Il file di stato generato viene caricato nello storage degli oggetti.
Per condividere lo stato tra i progetti Terraform, utilizzare la configurazione backend in terraform_remote_state. Per maggiori informazioni, vedere Accessing Remote States.

Accesso agli stati remoti

Utilizzare terraform_remote_state per accedere alle proprietà degli oggetti in una configurazione Terraform da un'altra configurazione.

Ad esempio, è possibile utilizzare una configurazione per definire i compartimenti e un'altra per definire le reti VCN. Se le risorse si trovano nella stessa cartella di configurazione Terraform, è possibile fare riferimento a un OCID compartimento dalla configurazione della VCN utilizzando un elemento quale: module.iam_compartment_SANDBOX.compartment_id.

Ma supponiamo che le nostre definizioni non condividano un file di stato e abbiamo una struttura di file simile alla seguente:

.
├── governance
│   ├── compartments.tf
│   ├── outputs.tf
│   ├── remote-backend.tf
│   └── variables.tf
├── networking
│   ├── outputs.tf
│   ├── remote-backend.tf
│   ├── remote-state-data_governance.tf
│   ├── variables.tf
│   └── vcns.tf
└── terraform-states_bucket_credentials

In questo esempio:

  • Le configurazioni governance e networking memorizzano i rispettivi file di stato in un bucket di storage degli oggetti OCI utilizzando i file remote-backend.tf e terraform-states_bucket_credentials.
  • Il file compartments.tf crea un compartimento a livello radice utilizzando il modulo iam-compartment del registro Terraform come indicato di seguito.
    module "iam_compartment_SANDBOX" {
      source = "oracle-terraform-modules/iam/oci//modules/iam-compartment"
      version = "2.0.0"
      tenancy_ocid = var.tenancy_ocid
      compartment_id = var.tenancy_ocid # define the parent compartment. Creation at tenancy root if omitted
      compartment_name = "SANDBOX"
      compartment_description = "Test and evaluate OCI features here"
      compartment_create = true # if false, a data source with a matching name is created instead
      enable_delete = true # if false, on `terraform destroy`, compartment is deleted from the terraform state but not from oci
    }

Definizione degli output

L'origine dati terraform_remote_state può accedere ai valori di output da un'altra configurazione Terraform utilizzando il file di stato più recente con un backend remoto. Affinché la configurazione networking possa accedere alla configurazione governance e recuperare dinamicamente le proprietà delle risorse Terraform, è necessario definire gli output per la configurazione Terraform governance. Senza un output definito, i valori non possono essere utilizzati dall'esterno della relativa configurazione.

Il file governance/outputs.tf ha un aspetto simile al seguente:

output "iam_compartment_SANDBOX" {
  description = "compartment ocid, parent ocid, name, description"
  value = {
    id = module.iam_compartment_SANDBOX.compartment_id
    parent_id = module.iam_compartment_SANDBOX.parent_compartment_id
    name = module.iam_compartment_SANDBOX.compartment_name
    description = module.iam_compartment_SANDBOX.compartment_description
  }
}

Riferimento a uno stato remoto

In questo esempio, viene utilizzato il modulo vcn del registro Terraform per definire una nuova VCN. La configurazione networking fa riferimento alla configurazione governance per definire l'OCID del compartimento della VCN:

module "vcn_hub1iad" {
  source = "oracle-terraform-modules/vcn/oci"
  version = "2.2.0"

  # general oci parameters
  compartment_id = data.terraform_remote_state.governance.outputs.iam_compartment_SANDBOX["id"]
  tags = var.tags

  # vcn parameters
  create_drg = false
  internet_gateway_enabled = true
  lockdown_default_seclist = true
  nat_gateway_enabled = false
  service_gateway_enabled = false
  vcn_cidr = "10.0.0.0/16"
  vcn_dns_label = "hub1iad"
  vcn_name = "hub1"
}

Tuttavia, affinché la riga compartment_id = data.terraform_remote_state.governance.outputs.iam_compartment_SANDBOX["id"] venga interpretata correttamente, è necessario definire un oggetto data.terraform_remote_state.

Definizione dell'origine dati dello stato remoto

Dopo aver aggiunto la seguente origine dati terraform_remote_state alla configurazione networking, è possibile accedere agli output Terraform governance dalle configurazioni all'interno della cartella networking:

data "terraform_remote_state" "governance" {
  backend = "oci"
  config = {
    bucket = "terraform-states"
    key = "governance/terraform.tfstate"
    region = "us-phoenix-1"
    endpoint = "https://acme.compat.objectstorage.us-phoenix-1.oraclecloud.com"
    shared_credentials_file = "../terraform-states_bucket_credentials"
    skip_region_validation = true
    skip_credentials_validation = true
    skip_metadata_api_check = true
    force_path_style = true
  }
}

Se si definisce l'origine dati dello stato remoto in un file separato, ad esempio remote-state-data_governance.tf, è possibile copiare e incollare il file in base alle esigenze. Ogni nuova configurazione può quindi fare riferimento al compartimento nello stesso modo.