Tutorial de Terraform


En este tutorial se muestra cómo desplegar una función HTTP subiendo un archivo ZIP del código fuente de la función a un segmento de Cloud Storage y usando Terraform para aprovisionar los recursos. Terraform es una herramienta de código abierto que te permite aprovisionar Google Cloud recursos con archivos de configuración declarativos.

En este tutorial se usa una función HTTP de Node.js como ejemplo, pero también funciona con funciones HTTP de Python, Go y Java. Las instrucciones son las mismas independientemente del tiempo de ejecución que utilices.

Cuando despliegues con Terraform, debes subir el archivo fuente comprimido de tu función a un segmento de Cloud Storage (source_archive_bucket) y especificar el nombre del objeto de Cloud Storage (source_archive_object) en la configuración de Terraform. Para obtener más información, consulta la guía de especificaciones de Terraform.

Cloud Run Functions copia el archivo de origen que subes en source_archive_bucket a un contenedor de tu proyecto con un nombre que sigue el formato gcf-v2-sources-PROJECT_NUMBER-REGION(Cloud Run Functions) o gcf-sources-PROJECT_NUMBER-REGION Cloud Run Functions (1.ª gen.). Esta configuración varía en función de la dependencia de CMEK.

Objetivos

  • Consulta cómo usar Terraform para desplegar una función HTTP.

Costes

En este documento, se utilizan los siguientes componentes facturables de Google Cloud:

For details, see Cloud Run functions pricing.

Para generar una estimación de costes basada en el uso previsto, utiliza la calculadora de precios.

Los usuarios nuevos Google Cloud pueden disfrutar de una prueba gratuita.

Antes de empezar

  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.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

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

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. Install the Google Cloud CLI.

  6. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  7. Para inicializar gcloud CLI, ejecuta el siguiente comando:

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

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

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  13. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  14. Si ya tienes instalada la CLI de gcloud, actualízala ejecutando el siguiente comando:

    gcloud components update
  15. Prepara tu entorno de desarrollo.

    Ir a la guía de configuración de Node.js

  16. Roles obligatorios

    Configurar un entorno

    En este tutorial, ejecutarás comandos en Cloud Shell. Cloud Shell es un entorno de shell con la CLI de Google Cloud ya instalada, incluidos la CLI de Google Cloud y los valores ya definidos para tu proyecto actual. Cloud Shell puede tardar varios minutos en inicializarse:

    Abrir Cloud Shell

    Preparar la aplicación

    En Cloud Shell, sigue estos pasos:

    1. Clona el repositorio de la aplicación de ejemplo en tu instancia de Cloud Shell:

      git clone https://github.com/terraform-google-modules/terraform-docs-samples.git
    2. Cambia al directorio que contiene los ejemplos de código de Cloud Run Functions:

      cd terraform-docs-samples/functions/basic

      El ejemplo de Node.js que se usa en este tutorial es una función HTTP básica de "Hola, mundo". Este es el archivo 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     = "nodejs22"
          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
      }

    Inicializar Terraform

    En el directorio terraform-docs-samples/functions/basic que contiene el archivo main.tf, ejecuta este comando para añadir los complementos necesarios y crear el directorio .terraform:

    terraform init
    

    Aplica la configuración de Terraform

    En el mismo directorio terraform-docs-samples/functions/basic que contiene el archivo main.tf, implementa la función aplicando la configuración. Cuando se te solicite, introduce yes:

    terraform apply
    

    Probar función

    1. Cuando la función termine de implementarse, anota la propiedad URI o búscala con el siguiente comando:

      gcloud functions describe function-v2 --gen2 --region=us-central1 --format="value(serviceConfig.uri)"
      
    2. Envía una solicitud a esta URL para ver el mensaje "Hello World" de tu función. Ten en cuenta que la función se implementa y requiere autenticación. Por lo tanto, debes proporcionar las credenciales en tu solicitud:

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

    Limpieza

    Una vez que hayas completado el tutorial, puedes eliminar todo lo que hayas creado para no incurrir en más costes.

    Terraform te permite eliminar todos los recursos definidos en el archivo de configuración ejecutando el comando terraform destroy en el directorio terraform-docs-samples/functions/basic que contiene el archivo main.tf:

    terraform destroy
    

    Escribe yes para permitir que Terraform elimine tus recursos.