Instructivo de Terraform (2ª gen.)


En este instructivo, se muestra cómo implementar una función HTTP mediante la carga de un archivo ZIP de código fuente de función a un bucket de Cloud Storage mediante 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, usa una función 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 cuál de estos entornos de ejecución uses.

Objetivos

  • Aprende a usar Terraform para implementar una función HTTP.

Costos

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

Para obtener detalles, consulta Precios de Cloud Functions.

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 califiquen para obtener una prueba gratuita.

Antes de comenzar

  1. Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  4. Habilita las API de Cloud Functions, Cloud Run, Cloud Build, Artifact Registry, and Cloud Storage.

    Habilita las API

  5. Instala Google Cloud CLI.
  6. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

    gcloud init
  7. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  8. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  9. Habilita las API de Cloud Functions, Cloud Run, Cloud Build, Artifact Registry, and Cloud Storage.

    Habilita las API

  10. Instala Google Cloud CLI.
  11. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

    gcloud init
  12. Si ya tienes instalado gcloud CLI, ejecuta el siguiente comando para actualizarla:

    gcloud components update
  13. Prepara tu entorno de desarrollo.

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

Configure su entorno

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

Abra Cloud Shell

Prepara la aplicación

En Cloud Shell, sigue los siguientes pasos:

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

    git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
  2. Ve al directorio que contiene el código de muestra de Cloud Functions, como sigue:

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

    La muestra de Node.js que se usa en este instructivo es una función HTTP “Hello World” básica.

  3. Crea un archivo ZIP que contenga el código fuente de la función que Terraform subirá a un bucket de Cloud Storage:

    zip -r function-source.zip .
    

    Ten en cuenta que la raíz del archivo ZIP debe ser el directorio raíz del código fuente de la función, por lo que el comando anterior incluye los archivos dentro del directorio helloworldHttp, pero no incluye el directorio en sí.

Crea tu archivo main.tf

  1. En el directorio nodejs-docs-samples/functions/, crea un archivo main.tf para la configuración de Terraform:

    touch main.tf
    
  2. Copia esta configuración de Terraform en tu 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     = "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. Edita el archivo main.tf a fin de asegurarte de que tenga los valores correctos para los siguientes elementos. Debes editar este archivo cada vez que cambie la configuración (por ejemplo, para usar un entorno de ejecución diferente o implementar una función diferente):

    • Entorno de ejecución: en este ejemplo, el entorno de ejecución es nodejs16.
    • Punto de entrada de la función: en este ejemplo, el punto de entrada de la función es helloHttp.
    • Ruta al archivo ZIP: en este ejemplo, si colocaste el archivo main.tf en el directorio nodejs-docs-samples/functions/ como se describió antes, la ruta es ./helloworld/helloworldHttp/function-source.zip.

Inicializa Terraform

En el directorio nodejs-docs-samples/functions/ 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 directorio nodejs-docs-samples/functions/ que contiene tu archivo main.tf, aplica la función mediante la configuración. Cuando se te solicite, ingresa yes.

terraform apply

Pruebe la función

  1. Cuando la función termine de implementarse, toma nota de la propiedad 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 proporcionar 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 mediante la ejecución del comando terraform destroy en el directorio nodejs-docs-samples/functions/ que contiene tu archivo main.tf:

terraform destroy

Ingresa yes para permitir que Terraform borre tus recursos.