Instructivo de Terraform

En este instructivo, se muestra cómo implementar una función de HTTP con la carga de un archivo ZIP del código fuente de la función en un bucket de Cloud Storage usando Terraform para aprovisionar los recursos. Terraform es una herramienta de código abierto que te permite aprovisionar recursos de Google Cloud con archivos de configuración declarativos.

En este instructivo, se usa una función de HTTP de Node.js como ejemplo, pero también se aplica a las funciones de HTTP de Python, Go y Java. Las instrucciones son las mismas sin importar el entorno de ejecución que uses.

Cuando implementas con Terraform, debes subir el archivo fuente comprimido de tu función a un bucket 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 fuente que subes en source_archive_bucket a un bucket 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 según la dependencia de la CMEK.

Objetivos

  • Aprender a usar Terraform para implementar una función de HTTP

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

For details, see Cloud Run functions pricing.

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.

Es posible que los usuarios nuevos de Google Cloud cumplan con los requisitos para acceder a una prueba gratuita.

Antes de comenzar

  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 role (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 usas un proveedor de identidad externo (IdP), primero debes Acceder a gcloud CLI 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 role (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 usas un proveedor de identidad externo (IdP), primero debes Acceder a gcloud CLI con tu identidad federada.

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

    gcloud init
  14. Si ya tienes instalada la gcloud CLI, ejecuta el siguiente comando para actualizarla:

    gcloud components update
  15. Prepara tu entorno de desarrollo.

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

  16. Roles requeridos

    Configura tu entorno

    En este instructivo, ejecutarás comandos en Cloud Shell. Cloud Shell es un entorno de shell que tiene la Google Cloud CLI ya instalada y valores ya establecidos para el proyecto actual. La inicialización de Cloud Shell puede demorar varios minutos:

    Abrir Cloud Shell

    Prepara la aplicación

    En Cloud Shell, sigue los pasos siguientes:

    1. Clona el repositorio de la app de ejemplo en tu instancia de Cloud Shell:

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

      cd terraform-docs-samples/functions/basic

      La muestra de Node.js que se usa en este instructivo es una función de HTTP "Hello World" básica. 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
      }

    Inicializa Terraform

    En el directorio terraform-docs-samples/functions/basic que contiene tu archivo main.tf, ejecuta este comando para agregar los complementos necesarios y compilar 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, aplica la configuración para implementar la función. Cuando se te indique, ingresa yes.

    terraform apply
    

    Prueba la función

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

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

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

    Realiza una limpieza

    Después de completar el instructivo, puedes borrar todo lo que creaste para no incurrir en más costos.

    Terraform te permite quitar 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 tu archivo main.tf.

    terraform destroy
    

    Ingresa yes para permitir que Terraform borre tus recursos.