Tutoriel Terraform

Ce tutoriel explique comment déployer une fonction HTTP en important un fichier ZIP de code source de fonction dans un bucket Cloud Storage, à l'aide de Terraform pour provisionner les ressources. Terraform est un outil Open Source qui vous permet de provisionner des ressources Google Cloud à l'aide de fichiers de configuration déclaratifs.

Ce tutoriel utilise une fonction HTTP Node.js comme exemple, mais il fonctionne également avec les fonctions HTTP Python, Go et Java. Les instructions sont identiques, quel que soit l'environnement d'exécution que vous utilisez.

Lorsque vous effectuez un déploiement avec Terraform, vous devez importer le fichier source compressé de votre fonction dans un bucket Cloud Storage (source_archive_bucket) et spécifier le nom de l'objet Cloud Storage (source_archive_object) dans la configuration Terraform. Pour en savoir plus, consultez le guide de spécification Terraform.

Cloud Run Functions copie le fichier source que vous importez dans source_archive_bucket vers un bucket de votre projet dont le nom suit le format gcf-v2-sources-PROJECT_NUMBER-REGION(Cloud Run Functions) ou gcf-sources-PROJECT_NUMBER-REGION (Cloud Run Functions, 1re génération). Cette configuration varie en fonction de la dépendance CMEK.

Objectifs

  • Découvrir comment utiliser Terraform pour déployer une fonction HTTP

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

For details, see Cloud Run functions pricing.

Pour obtenir une estimation des coûts en fonction de votre utilisation prévue, utilisez le simulateur de coût.

Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai sans frais.

Avant de commencer

  1. Connectez-vous à votre compte Google Cloud . Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $de crédits sans frais pour exécuter, tester et déployer des charges de travail.
  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. Installez la Google Cloud CLI.

  6. Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.

  7. Pour initialiser la gcloud CLI, exécutez la commande suivante :

    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. Installez la Google Cloud CLI.

  12. Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.

  13. Pour initialiser la gcloud CLI, exécutez la commande suivante :

    gcloud init
  14. Si la gcloud CLI est déjà installée, mettez-le à jour en exécutant la commande suivante :

    gcloud components update
  15. Préparez votre environnement de développement.

    Accéder au guide de configuration Node.js

Rôles requis

Configurer votre environnement

Dans ce tutoriel, vous exécutez des commandes dans Cloud Shell. Cloud Shell est un environnement de shell dans lequel la Google Cloud CLI est déjà installée avec des valeurs prédéfinies pour votre projet actuel. L'initialisation de Cloud Shell peut prendre quelques minutes.

Ouvrir Cloud Shell

Préparer l'application

Dans Cloud Shell, procédez comme suit :

  1. Clonez le dépôt de l'exemple d'application sur votre instance Cloud Shell :

    git clone https://github.com/terraform-google-modules/terraform-docs-samples.git
  2. Accédez au répertoire contenant les exemples de code Cloud Run Functions :

    cd terraform-docs-samples/functions/basic

    L'exemple Node.js utilisé dans ce tutoriel est une fonction HTTP de base "Hello World". Voici le fichier 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
    }

Initialiser Terraform

Dans le répertoire terraform-docs-samples/functions/basic contenant le fichier main.tf, exécutez cette commande pour ajouter les plug-ins nécessaires et créez le répertoire .terraform :

terraform init

Appliquer la configuration Terraform

Dans le même répertoire terraform-docs-samples/functions/basic contenant le fichier main.tf, déployez la fonction en appliquant la configuration. Lorsque vous y êtes invité, saisissez yes :

terraform apply

Tester la fonction

  1. Une fois le déploiement de la fonction terminé, notez la propriété de l'URI ou recherchez-la à l'aide de la commande suivante :

    gcloud functions describe function-v2 --gen2 --region=us-central1 --format="value(serviceConfig.uri)"
    
  2. Envoyez une requête à cette URL pour afficher le message "Hello World" de votre fonction. Notez que la fonction est déployée en nécessitant une authentification. Par conséquent, vous devez fournir des identifiants dans votre requête :

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

Effectuer un nettoyage

Une fois le tutoriel terminé, vous pouvez supprimer tous les éléments que vous avez créés afin d'éviter tous frais supplémentaires.

Terraform vous permet de supprimer toutes les ressources définies dans le fichier de configuration en exécutant la commande terraform destroy dans le répertoire terraform-docs-samples/functions/basic contenant votre fichier main.tf :

terraform destroy

Saisissez yes pour autoriser Terraform à supprimer vos ressources.