Tutorial di Terraform


Questo tutorial mostra come eseguire il deployment di una funzione HTTP caricando un file ZIP del codice sorgente della funzione in un bucket Cloud Storage e utilizzando Terraform per 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 funzioni HTTP Python, Go e Java. Le istruzioni sono le stesse indipendentemente da quale di questi runtime utilizzi.

Obiettivi

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

Costi

In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:

For details, see Cloud Run functions pricing.

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud potrebbero essere idonei per una prova gratuita.

Prima di iniziare

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Functions, Cloud Run, Cloud Build, Artifact Registry, and Cloud Storage APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Cloud Functions, Cloud Run, Cloud Build, Artifact Registry, and Cloud Storage APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

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

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

    Vai alla guida alla configurazione di Node.js

Configurazione dell'ambiente

In questo tutorial esegui comandi in Cloud Shell. Cloud Shell è un ambiente shell in cui è già installato Google Cloud CLI, inclusi i valori già impostati per il progetto corrente. L'inizializzazione di Cloud Shell può richiedere diversi minuti:

Apri Cloud Shell

Preparazione della richiesta

In Cloud Shell, esegui i seguenti passaggi:

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

    git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
  2. Passa alla directory che contiene i codici di esempio delle funzioni Cloud Run:

    cd nodejs-docs-samples/functions

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

Creare il 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 la configurazione cambia (ad esempio per utilizzare un runtime o eseguire il deployment di una funzione diversi):

    • Runtime: in questo esempio, sostituisci nodejs16 con l'ultima versione del runtime Node.js nodejs22.
    • Entry point della funzione: in questo esempio, l'entry point della funzione è helloHttp.
    • Percorso alla directory di origine: in questo esempio, sostituisci source_dir con helloworld/helloworldHttp.
    • La configurazione di member="allUsers" IAM non andrà a buon fine se il progetto è soggetto a un criterio dell'organizzazione con limitazioni del dominio che impedisce di concedere i ruoli IAM all'entità allUsers. Utilizza con cautela in produzione e, se possibile, valuta la possibilità di utilizzare un elenco di membri più limitato.

Inizializza Terraform

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

terraform init

Applica 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, annota la 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 funzione. Tieni presente che il deployment della funzione richiede autenticazione. Pertanto, devi fornire le credenziali nella 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 per evitare di incorrere in ulteriori costi.

Terraform ti 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.