Terraform-Anleitung (2. Generation)


In dieser Anleitung wird gezeigt, wie Sie eine HTTP-Funktion bereitstellen. Dazu laden Sie eine ZIP-Datei mit dem Funktionsquellcode in einen Cloud Storage-Bucket hoch und verwenden Terraform zum Bereitstellen der Ressourcen. Terraform ist ein Open-Source-Tool, mit dem Sie Google Cloud-Ressourcen mit deklarativen Konfigurationsdateien bereitstellen können.

In dieser Anleitung wird als Beispiel eine HTTP-Funktion von Node.js verwendet. Sie funktioniert jedoch auch mit Python-, Go- und Java-HTTP-Funktionen. Die Anleitungen sind identisch, unabhängig davon, welche dieser Laufzeiten Sie verwenden.

Lernziele

  • Anleitung zum Bereitstellen einer HTTP-Funktion mit Terraform

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

Weitere Informationen finden Sie unter Cloud Functions-Preise.

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Vorbereitung

  1. Melden Sie sich bei Ihrem Google Cloud-Konto an. Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

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

    Aktivieren Sie die APIs

  5. Installieren Sie die Google Cloud CLI.
  6. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    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. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

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

    Aktivieren Sie die APIs

  10. Installieren Sie die Google Cloud CLI.
  11. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  12. Wenn Sie die gcloud CLI bereits installiert haben, aktualisieren Sie sie mit dem folgenden Befehl:

    gcloud components update
  13. Bereiten Sie die Entwicklungsumgebung vor.

    Einrichtungsleitfaden für Node.js aufrufen

Umgebung einrichten

In dieser Anleitung führen Sie Befehle in Cloud Shell aus. Cloud Shell ist eine Shell-Umgebung, in der das Google Cloud CLI einschließlich der Google Cloud-Befehlszeile vorinstalliert ist. Auch die Werte für Ihr aktuelles Projekt sind bereits festgelegt. Die Initialisierung von Cloud Shell kann mehrere Minuten dauern:

Cloud Shell öffnen

Anwendung vorbereiten

Führen Sie in Cloud Shell folgende Schritte aus:

  1. Klonen Sie das Repository der Beispielanwendung in Ihre Cloud Shell-Instanz:

    git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
  2. Wechseln Sie in das Verzeichnis, das den Cloud Functions-Beispielcode enthält:

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

    Das in dieser Anleitung verwendete Node.js-Beispiel ist eine grundlegende HTTP-Funktion "Hello World".

  3. Erstellen Sie eine ZIP-Datei mit dem Quellcode der Funktion, den Terraform in einen Cloud Storage-Bucket hochlädt:

    zip -r function-source.zip .
    

    Beachten Sie, dass das Stammverzeichnis der ZIP-Datei das Stammverzeichnis Ihres Quellcodes der Funktion sein muss. Der obige Befehl enthält also die Dateien im Verzeichnis helloworldHttp, aber nicht das Verzeichnis selbst.

Erstellen Sie die Datei main.tf:

  1. Erstellen Sie im Verzeichnis nodejs-docs-samples/functions/ eine main.tf-Datei für die Terraform-Konfiguration:

    touch main.tf
    
  2. Kopieren Sie diese Terraform-Konfiguration in Ihre main.tf-Datei:

    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. Bearbeiten Sie die Datei main.tf, um sicherzustellen, dass sie die richtigen Werte für die folgenden Elemente enthält. Sie müssen diese Datei bearbeiten, wenn sich Ihre Konfiguration ändert, z. B. um eine andere Laufzeit zu verwenden oder eine andere Funktion bereitzustellen:

    • Laufzeit: In diesem Beispiel lautet die Laufzeit nodejs16.
    • Funktionseinstiegspunkt: In diesem Beispiel ist der Funktionseinstiegspunkt helloHttp.
    • Pfad zur ZIP-Datei: Wenn Sie Ihre main.tf-Datei wie oben beschrieben im Verzeichnis nodejs-docs-samples/functions/ abgelegt haben, lautet der Pfad ./helloworld/helloworldHttp/function-source.zip.

Terraform initialisieren

Führen Sie im nodejs-docs-samples/functions/-Verzeichnis, das die main.tf-Datei enthält, diesen Befehl aus, um die erforderlichen Plug-ins hinzuzufügen und das .terraform-Verzeichnis zu erstellen:

terraform init

Wenden Sie die Terraform-Konfiguration an:

Stellen Sie die Funktion im nodejs-docs-samples/functions/-Verzeichnis, das die main.tf-Datei enthält, bereit. Wenden Sie dazu die Konfiguration an. Geben Sie bei Aufforderung yes ein:

terraform apply

Funktion testen

  1. Notieren Sie sich nach der Bereitstellung der Funktion das Attribut von URI oder suchen Sie es mit diesem Befehl:

    gcloud functions describe function-v2 --gen2 --region=us-central1 --format="value(serviceConfig.uri)"
    
  2. Stellen Sie eine Anfrage an diese URL, um die Nachricht "Hello World" Ihrer Funktion zu sehen. Beachten Sie, dass die Funktion implementiert ist und eine Authentifizierung erfordert. Daher müssen Sie in Ihrer Anfrage Anmeldedaten angeben:

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

Bereinigen

Nachdem Sie die Anleitung abgeschlossen haben, können Sie alle erstellten Elemente löschen, sodass keine weiteren Kosten anfallen.

Mit Terraform können Sie alle in der Konfigurationsdatei definierten Ressourcen entfernen. Führen Sie dazu den terraform destroy-Befehl im nodejs-docs-samples/functions/-Verzeichnis aus, das Ihre main.tf-Datei enthält:

terraform destroy

Geben Sie yes ein, damit Terraform Ihre Ressourcen löschen kann.