Tutorial su Terraform (2ª generazione)


Questo tutorial mostra come eseguire il deployment di una funzione HTTP caricando un file ZIP con il codice sorgente della funzione in un bucket Cloud Storage, utilizzando Terraform per eseguire il provisioning delle risorse. Terraform è uno strumento open source che consente di eseguire il provisioning delle risorse Google Cloud con file di configurazione dichiarativi.

Questo tutorial utilizza una funzione HTTP Node.js come esempio, ma funziona anche con le funzioni HTTP Python, Go e Java. Le istruzioni sono le stesse indipendentemente dal runtime che utilizzi.

Obiettivi

  • Scopri come utilizzare Terraform per eseguire il deployment di una funzione HTTP.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

Per maggiori dettagli, vedi i prezzi di Cloud Functions.

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud possono essere idonei a una prova senza costi aggiuntivi.

Prima di iniziare

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. Abilita le API Cloud Functions, Cloud Run, Cloud Build, Artifact Registry, and Cloud Storage.

    Abilita le API

  5. Installa Google Cloud CLI.
  6. Per initialize gcloud CLI, esegui questo comando:

    gcloud init
  7. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  8. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  9. Abilita le API Cloud Functions, Cloud Run, Cloud Build, Artifact Registry, and Cloud Storage.

    Abilita le API

  10. Installa Google Cloud CLI.
  11. Per initialize gcloud CLI, esegui questo comando:

    gcloud init
  12. Se hai già installato gcloud CLI, aggiornalo eseguendo questo comando:

    gcloud components update
  13. Preparare l'ambiente di sviluppo.

    Vai alla guida alla configurazione di Node.js

Configurazione dell'ambiente

In questo tutorial eseguirai comandi in Cloud Shell. Cloud Shell è un ambiente shell con Google Cloud CLI già installato, incluso Google Cloud CLI, e con valori già impostati per il progetto attuale. L'inizializzazione di Cloud Shell può richiedere diversi minuti:

Apri Cloud Shell

Preparazione dell'applicazione

In Cloud Shell, esegui questi passaggi:

  1. Clona il repository dell'app di esempio nella tua istanza di Cloud Shell:

    git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
  2. Passa alla directory che contiene il codice di esempio di Cloud Functions:

    cd nodejs-docs-samples/functions/helloworld/helloworldHttp

    L'esempio Node.js utilizzato in questo tutorial è una funzione HTTP "Hello World" di base.

  3. Crea un file ZIP contenente il codice sorgente della funzione che Terraform caricherà in un bucket Cloud Storage:

    zip -r function-source.zip .
    

    Tieni presente che la directory principale del file ZIP deve essere la directory radice del codice sorgente della funzione, quindi il comando precedente include i file all'interno della directory helloworldHttp ma non include la directory stessa.

Crea il tuo file main.tf

  1. Nella directory nodejs-docs-samples/functions/, crea un file main.tf per la configurazione di Terraform:

    touch main.tf
    
  2. Copia questa configurazione Terraform nel file main.tf:

    terraform {
      required_providers {
        google = {
          source  = "hashicorp/google"
          version = ">= 4.34.0"
        }
      }
    }
    
    resource "random_id" "default" {
      byte_length = 8
    }
    
    resource "google_storage_bucket" "default" {
      name                        = "${random_id.default.hex}-gcf-source" # Every bucket name must be globally unique
      location                    = "US"
      uniform_bucket_level_access = true
    }
    
    data "archive_file" "default" {
      type        = "zip"
      output_path = "/tmp/function-source.zip"
      source_dir  = "functions/hello-world/"
    }
    resource "google_storage_bucket_object" "object" {
      name   = "function-source.zip"
      bucket = google_storage_bucket.default.name
      source = data.archive_file.default.output_path # Add path to the zipped function source code
    }
    
    resource "google_cloudfunctions2_function" "default" {
      name        = "function-v2"
      location    = "us-central1"
      description = "a new function"
    
      build_config {
        runtime     = "nodejs16"
        entry_point = "helloHttp" # Set the entry point
        source {
          storage_source {
            bucket = google_storage_bucket.default.name
            object = google_storage_bucket_object.object.name
          }
        }
      }
    
      service_config {
        max_instance_count = 1
        available_memory   = "256M"
        timeout_seconds    = 60
      }
    }
    
    resource "google_cloud_run_service_iam_member" "member" {
      location = google_cloudfunctions2_function.default.location
      service  = google_cloudfunctions2_function.default.name
      role     = "roles/run.invoker"
      member   = "allUsers"
    }
    
    output "function_uri" {
      value = google_cloudfunctions2_function.default.service_config[0].uri
    }
  3. Modifica il file main.tf per assicurarti che contenga i valori corretti per i seguenti elementi. Devi modificare questo file ogni volta che cambia la configurazione (ad esempio per utilizzare un runtime diverso o per eseguire il deployment di una funzione diversa):

    • Runtime: in questo esempio, il runtime è nodejs16.
    • Punto di ingresso della funzione: in questo esempio, il punto di ingresso della funzione è helloHttp.
    • Percorso del file ZIP: in questo esempio, se hai inserito il file main.tf nella directory nodejs-docs-samples/functions/ come descritto sopra, il percorso sarà ./helloworld/helloworldHttp/function-source.zip.

Inizializza Terraform

Nella directory nodejs-docs-samples/functions/ contenente il file main.tf, esegui questo comando per aggiungere i plug-in necessari e creare la directory .terraform:

terraform init

Applicare la configurazione Terraform

Nella directory nodejs-docs-samples/functions/ contenente il file main.tf, esegui il deployment della funzione applicando la configurazione. Quando richiesto, inserisci yes:

terraform apply

testa la funzione

  1. Al termine del deployment della funzione, prendi nota della proprietà URI o cercala utilizzando il seguente comando:

    gcloud functions describe function-v2 --gen2 --region=us-central1 --format="value(serviceConfig.uri)"
    
  2. Invia una richiesta a questo URL per visualizzare il messaggio "Hello World" della tua funzione. Tieni presente che il deployment della funzione è stato eseguito richiedendo l'autenticazione. Pertanto, devi fornire le credenziali nella tua richiesta:

    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" YOUR_FUNCTION_URL
    

Esegui la pulizia

Dopo aver completato il tutorial, puoi eliminare tutto ciò che hai creato in modo da non sostenere ulteriori costi.

Terraform consente di rimuovere tutte le risorse definite nel file di configurazione eseguendo il comando terraform destroy nella directory nodejs-docs-samples/functions/ contenente il file main.tf:

terraform destroy

Inserisci yes per consentire a Terraform di eliminare le risorse.