DAGs mit Cloud Functions und Pub/Sub-Nachrichten auslösen

Cloud Composer 1 Cloud Composer 2

Auf dieser Seite wird beschrieben, wie Sie eine ereignisbasierte Push-Architektur erstellen, indem Sie als Reaktion auf Änderungen am Pub/Sub-Thema Cloud Composer-DAGs auslösen. Die Beispiele in dieser Anleitung zeigen, wie der gesamte Zyklus der Pub/Sub-Verwaltung, einschließlich Aboverwaltung, als Teil des DAG-Prozesses behandelt wird. Es eignet sich für einige der gängigen Anwendungsfälle, in denen Sie DAGs auslösen, aber keine zusätzlichen Zugriffsberechtigungen einrichten möchten.

Beispielsweise können Nachrichten, die über Pub/Sub gesendet werden, als Lösung verwendet werden, wenn Sie aus Sicherheitsgründen keinen direkten Zugriff auf eine Cloud Composer-Umgebung gewähren möchten. Sie können eine Cloud Functions-Funktion konfigurieren, die Pub/Sub-Nachrichten erstellt und in einem Pub/Sub-Thema veröffentlicht. Sie können dann einen DAG erstellen, der Pub/Sub-Nachrichten abruft und dann diese Nachrichten verarbeitet.

In diesem spezifischen Beispiel erstellen Sie eine Cloud Function und stellen zwei DAGs bereit. Der erste DAG ruft Pub/Sub-Nachrichten ab und löst den zweiten DAG gemäß dem Pub/Sub-Nachrichteninhalt aus.

In dieser Anleitung wird davon ausgegangen, dass Sie mit Python und der Google Cloud Console vertraut sind.

Lernziele

Kosten

In dieser Anleitung werden die folgenden kostenpflichtigen Komponenten von Google Cloud verwendet:

Nach Abschluss dieser Anleitung können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.

Hinweise

Für diese Anleitung benötigen Sie ein Google Cloud-Projekt. So konfigurieren Sie das Projekt:

  1. Wählen oder erstellen Sie ein Projekt in der Google Cloud Console:

    Zur Projektauswahl

  2. Die Abrechnung für Ihr Projekt muss aktiviert sein. Hier erfahren Sie, wie Sie prüfen, ob die Abrechnung für ein Projekt aktiviert ist.

  3. Der Nutzer des Google Cloud-Projekts benötigt die folgenden Rollen, um die erforderlichen Ressourcen zu erstellen:

    • Dienstkontonutzer (roles/iam.serviceAccountUser)
    • Pub/Sub-Bearbeiter (roles/pubsub.editor)
    • Administrator für Umgebung und Speicherobjekte (roles/composer.environmentAndStorageObjectAdmin)
    • Cloud Functions-Administrator (roles/cloudfunctions.admin)
    • Loganzeige (roles/logging.viewer)
  4. Prüfen Sie, ob das Dienstkonto, mit dem Ihre Cloud Functions-Funktion ausgeführt wird, in Ihrem Projekt ausreichende Berechtigungen für den Zugriff auf Pub/Sub hat. Standardmäßig verwendet Cloud Functions das App Engine-Standarddienstkonto. Dieses Dienstkonto hat die Rolle Bearbeiter mit ausreichenden Berechtigungen für diese Anleitung.

Die APIs für Ihr Projekt aktivieren

Console

Cloud Composer, Cloud Functions, and Pub/Sub APIs aktivieren.

Aktivieren Sie die APIs

gcloud

Aktivieren Sie die Cloud Composer, Cloud Functions, and Pub/Sub APIs:

gcloud services enable composer.googleapis.com cloudfunctions.googleapis.com pubsub.googleapis.com

Terraform

Aktivieren Sie die Cloud Composer API in Ihrem Projekt. Fügen Sie dazu dem Terraform-Skript die folgenden Ressourcendefinitionen hinzu:

resource "google_project_service" "composer_api" {
  project = "<PROJECT_ID>"
  service = "composer.googleapis.com"
  // Disabling Cloud Composer API might irreversibly break all other
  // environments in your project.
  // This parameter prevents automatic disabling
  // of the API when the resource is destroyed.
  // We recommend to disable the API only after all environments are deleted.
  disable_on_destroy = false
}

resource "google_project_service" "pubsub_api" {
  project = "<PROJECT_ID>"
  service = "pubsub.googleapis.com"
  disable_on_destroy = false
}

resource "google_project_service" "functions_api" {
  project = "<PROJECT_ID>"
  service = "cloudfunctions.googleapis.com"
  disable_on_destroy = false
}

Ersetzen Sie <PROJECT_ID> durch die Projekt-ID Ihres Projekts. Beispiel: example-project

Cloud Composer-Umgebung erstellen

Cloud Composer 2-Umgebung erstellen

Im Rahmen dieses Verfahrens gewähren Sie dem Composer-Dienst-Agent-Konto die Rolle Dienst-Agent-Erweiterung für die Cloud Composer v2 API (roles/composer.ServiceAgentV2Ext). Cloud Composer verwendet dieses Konto, um Vorgänge in Ihrem Google Cloud-Projekt auszuführen.

Pub/Sub-Thema erstellen

In diesem Beispiel wird ein DAG als Antwort auf eine Nachricht ausgelöst, die an ein Pub/Sub-Thema gesendet wurde. Erstellen Sie ein Pub/Sub-Thema für dieses Beispiel:

Console

  1. Rufen Sie in der Google Cloud Console die Seite Pub/Sub-Themen auf.

    Pub/Sub-Themen aufrufen

  2. Klicken Sie auf Thema erstellen.

  3. Geben Sie im Feld Themen-ID dag-topic-trigger als ID für das Thema ein.

  4. Übernehmen Sie für alle anderen Optionen die Standardeinstellungen.

  5. Klicken Sie auf Thema erstellen.

gcloud

Führen Sie den Befehl gcloud pubsub topics create in der Google Cloud CLI aus, um ein Thema zu erstellen:

gcloud pubsub topics create dag-topic-trigger

Terraform

Fügen Sie dem Terraform-Skript die folgenden Ressourcendefinitionen hinzu:

resource "google_pubsub_topic" "trigger" {
  project                    = "<PROJECT_ID>"
  name                       = "dag-topic-trigger"
  message_retention_duration = "86600s"
}

Ersetzen Sie <PROJECT_ID> durch die Projekt-ID Ihres Projekts. Beispiel: example-project

DAGs hochladen

Laden Sie DAGs in Ihre Umgebung hoch:

  1. Speichern Sie die folgende DAG-Datei auf Ihrem lokalen Computer.
  2. Ersetzen Sie <PROJECT_ID> durch die Projekt-ID Ihres Projekts. Beispiel: example-project
  3. Laden Sie die bearbeitete DAG-Datei in Ihre Umgebung hoch.
from __future__ import annotations

from datetime import datetime
import time

from airflow import DAG
from airflow import XComArg
from airflow.operators.python import PythonOperator
from airflow.operators.trigger_dagrun import TriggerDagRunOperator
from airflow.providers.google.cloud.operators.pubsub import (
    PubSubCreateSubscriptionOperator,
    PubSubPullOperator,
)

PROJECT_ID = "<PROJECT_ID>"
TOPIC_ID = "dag-topic-trigger"
SUBSCRIPTION = "trigger_dag_subscription"


def handle_messages(pulled_messages, context):
    dag_ids = list()
    for idx, m in enumerate(pulled_messages):
        data = m.message.data.decode("utf-8")
        print(f"message {idx} data is {data}")
        dag_ids.append(data)
    return dag_ids


# This DAG will run minutely and handle pub/sub messages by triggering target DAG
with DAG(
    "trigger_dag",
    start_date=datetime(2021, 1, 1),
    schedule_interval="* * * * *",
    max_active_runs=1,
    catchup=False,
) as trigger_dag:
    # If subscription exists, we will use it. If not - create new one
    subscribe_task = PubSubCreateSubscriptionOperator(
        task_id="subscribe_task",
        project_id=PROJECT_ID,
        topic=TOPIC_ID,
        subscription=SUBSCRIPTION,
    )

    subscription = subscribe_task.output

    # Proceed maximum 50 messages in callback function handle_messages
    # Here we acknowledge messages automatically. You can use PubSubHook.acknowledge to acknowledge in downstream tasks
    # https://airflow.apache.org/docs/apache-airflow-providers-google/stable/_api/airflow/providers/google/cloud/hooks/pubsub/index.html#airflow.providers.google.cloud.hooks.pubsub.PubSubHook.acknowledge
    pull_messages_operator = PubSubPullOperator(
        task_id="pull_messages_operator",
        project_id=PROJECT_ID,
        ack_messages=True,
        messages_callback=handle_messages,
        subscription=subscription,
        max_messages=50,
    )

    # Here we use Dynamic Task Mapping to trigger DAGs according to messages content
    # https://airflow.apache.org/docs/apache-airflow/2.3.0/concepts/dynamic-task-mapping.html
    trigger_target_dag = TriggerDagRunOperator.partial(task_id="trigger_target").expand(
        trigger_dag_id=XComArg(pull_messages_operator)
    )

    (subscribe_task >> pull_messages_operator >> trigger_target_dag)


def _some_heavy_task():
    print("Do some operation...")
    time.sleep(1)
    print("Done!")


# Simple target DAG
with DAG(
    "target_dag",
    start_date=datetime(2022, 1, 1),
    # Not scheduled, trigger only
    schedule_interval=None,
    catchup=False,
) as target_dag:
    some_heavy_task = PythonOperator(
        task_id="some_heavy_task", python_callable=_some_heavy_task
    )

    (some_heavy_task)

Der Beispielcode enthält zwei DAGs: trigger_dag und target_dag.

Der DAG trigger_dag abonniert ein Pub/Sub-Thema, ruft Pub/Sub-Nachrichten ab und löst einen weiteren DAG aus, der in der DAG-ID der Pub/Sub-Nachrichtendaten angegeben ist. In diesem Beispiel löst trigger_dag den DAG target_dag aus, der Nachrichten an die Aufgabenlogs ausgibt.

Der DAG trigger_dag enthält die folgenden Aufgaben:

  • subscribe_task: Abonnieren Sie ein Pub/Sub-Thema.
  • pull_messages_operator: Liest Pub/Sub-Nachrichtendaten mit PubSubPullOperator.
  • trigger_target_dag: Löst entsprechend den Daten in den Nachrichten, die aus dem Pub/Sub-Thema abgerufen wurden, einen weiteren DAG aus (in diesem Beispiel target_dag).

Der DAG target_dag enthält nur eine Aufgabe: output_to_logs. Diese Aufgabe gibt Nachrichten mit einer Verzögerung von einer Sekunde an das Aufgabenlog aus.

Cloud Functions-Funktion bereitstellen, die Nachrichten zu einem Pub/Sub-Thema veröffentlicht

In diesem Abschnitt stellen Sie eine Cloud Function bereit, die Nachrichten zu einem Pub/Sub-Thema veröffentlicht.

Cloud Functions-Funktion erstellen und ihre Konfiguration angeben

Console

  1. Wechseln Sie in der Google Cloud Console zur Seite Cloud Functions.

    Zu Cloud Functions

  2. Klicken Sie auf Funktion erstellen.

  3. Wählen Sie im Feld Environment (Umgebung) die Option 1st gen (1. Generation) aus.

  4. Geben Sie im Feld Funktionsname den Namen für die Funktion ein: pubsub-publisher.

  5. Wählen Sie im Feld Trigger die Option HTTP aus.

  6. Wählen Sie im Bereich Authentifizierung die Option Nicht authentifizierte Aufrufe zulassen aus. Mit dieser Option können nicht authentifizierte Nutzer eine HTTP-Funktion aufrufen.

  7. Klicken Sie auf „Speichern“.

  8. Klicken Sie auf Weiter, um zum Schritt Code zu gelangen.

Terraform

Verwenden Sie für diesen Schritt gegebenenfalls die Google Cloud Console, da es keine einfache Möglichkeit gibt, den Quellcode der Funktion über Terraform zu verwalten.

In diesem Beispiel wird gezeigt, wie Sie eine Cloud Function aus einer lokalen ZIP-Archivdatei hochladen. Dazu erstellen Sie einen Cloud Storage-Bucket, speichern die Datei in diesem Bucket und verwenden sie dann als Quelle für Cloud Function. Wenn Sie diesen Ansatz verwenden, aktualisiert Terraform den Quellcode der Funktion nicht automatisch, auch wenn Sie eine neue Archivdatei erstellen. Ändern Sie den Dateinamen des Archivs, um den Funktionscode noch einmal hochzuladen.

  1. Laden Sie die Dateien pubsub_publisher.py und requirements.txt herunter.
  2. Ersetzen Sie in der Datei pubsub_publisher.py den Platzhalter <PROJECT_ID> durch die Projekt-ID Ihres Projekts. Beispiel: example-project.
  3. Erstellen Sie mit der Datei pbusub_publisner.py und der Datei requirements.txt ein ZIP-Archiv mit dem Namen pubsub_function.zip.
  4. Speichern Sie das ZIP-Archiv in einem Verzeichnis, in dem Ihr Terraform-Skript gespeichert ist.
  5. Fügen Sie Ihrem Terraform-Skript die folgenden Ressourcendefinitionen hinzu und ersetzen Sie <PROJECT_ID> durch die Projekt-ID Ihres Projekts.
resource "google_storage_bucket" "cloud_function_bucket" {
  project        = <PROJECT_ID>
  name           = "<PROJECT_ID>-cloud-function-source-code"
  location       = "US"
  force_destroy  = true
  uniform_bucket_level_access = true
}

resource "google_storage_bucket_object" "cloud_function_source" {
  name   = "pubsub_function.zip"
  bucket = google_storage_bucket.cloud_function_bucket.name
  source = "./pubsub_function.zip"
}

resource "google_cloudfunctions_function" "pubsub_function" {
  project = <PROJECT_ID>
  name    = "pubsub-publisher"
  runtime = "python310"
  region  = "us-central1"

  available_memory_mb   = 128
  source_archive_bucket = google_storage_bucket.cloud_function_bucket.name
  source_archive_object = "pubsub_function.zip"
  timeout               = 60
  entry_point           = "pubsub_publisher"
  trigger_http          = true
}

Cloud Functions-Codeparameter angeben

Console

  1. Wählen Sie im Schritt Code im Feld Laufzeit die Sprachlaufzeit aus, die Ihre Funktion verwendet. Wählen Sie in diesem Beispiel Python 3.10 aus.

  2. Geben Sie im Feld Einstiegspunkt den Wert pubsub_publisher ein. Das ist der Code, der beim Ausführen Ihrer Cloud Functions-Funktion ausgeführt wird. Der Wert dieses Flags muss ein Funktionsname oder ein voll qualifizierter Klassenname im Quellcode sein.

Terraform

Diesen Schritt überspringen. Cloud Function-Parameter sind bereits in der Ressource google_cloudfunctions_function definiert.

Cloud Function-Code hochladen

Console

Wählen Sie im Feld Quellcode die entsprechende Option für die Bereitstellung des Funktionsquellcodes aus. In dieser Anleitung fügen Sie den Funktionscode mit dem Inline-Editor von Cloud Functions ein. Alternativ können Sie eine ZIP-Datei hochladen oder Cloud Source Repositories verwenden.

  1. Fügen Sie das folgende Codebeispiel in die Datei main.py ein.
  2. Ersetzen Sie <PROJECT_ID> durch die Projekt-ID Ihres Projekts. Beispiel: example-project
from google.cloud import pubsub_v1

project = "<PROJECT_ID>"
topic = "dag-topic-trigger"


def pubsub_publisher(request):
    """Publish message from HTTP request to Pub/Sub topic.
    Args:
        request (flask.Request): HTTP request object.
    Returns:
        The response text with message published into Pub/Sub topic
        Response object using
        `make_response <http://flask.pocoo.org/docs/1.0/api/#flask.Flask.make_response>`.
    """
    request_json = request.get_json()
    print(request_json)
    if request.args and "message" in request.args:
        data_str = request.args.get("message")
    elif request_json and "message" in request_json:
        data_str = request_json["message"]
    else:
        return "Message content not found! Use 'message' key to specify"

    publisher = pubsub_v1.PublisherClient()
    # The `topic_path` method creates a fully qualified identifier
    # in the form `projects/{project_id}/topics/{topic_id}`
    topic_path = publisher.topic_path(project, topic)

    # The required data format is a bytestring
    data = data_str.encode("utf-8")
    # When you publish a message, the client returns a future.
    message_length = len(data_str)
    future = publisher.publish(topic_path, data, message_length=str(message_length))
    print(future.result())

    return f"Message {data} with message_length {message_length} published to {topic_path}."

Terraform

Diesen Schritt überspringen. Cloud Function-Parameter sind bereits in der Ressource google_cloudfunctions_function definiert.

Cloud Function-Abhängigkeiten angeben

Console

Geben Sie die Funktionsabhängigkeiten in der Metadatendatei requirements.txt an:

requests-toolbelt==1.0.0
google-auth==2.19.1
google-cloud-pubsub==2.17.0

Wenn Sie die Funktion bereitstellen, lädt und installiert Cloud Functions die in der Datei requirements.txt deklarierten Abhängigkeiten (eine Zeile pro Paket). Diese Datei muss sich im selben Verzeichnis wie die Datei main.py befinden, die den Funktionscode enthält. Weitere Informationen finden Sie unter Anforderungsdateien in der pip-Dokumentation.

Terraform

Diesen Schritt überspringen. Cloud Function-Abhängigkeiten sind in der Datei requirements.txt im Archiv pubsub_function.zip definiert.

Cloud Functions-Funktion bereitstellen

Console

Klicken Sie auf Bereitstellen. Wenn die Bereitstellung erfolgreich abgeschlossen wurde, wird die Funktion mit einem grünen Häkchen auf der Seite Cloud Functions in der Google Cloud Console angezeigt.

Das Dienstkonto, mit dem Ihre Cloud Functions-Funktion ausgeführt wird, muss in Ihrem Projekt ausreichend Berechtigungen für den Zugriff auf Pub/Sub haben.

Terraform

  1. Initialisieren Sie Terraform:

    terraform init
    
  2. Prüfen Sie die Konfiguration und prüfen Sie, ob die Ressourcen, die Terraform erstellt oder aktualisiert wird, Ihren Erwartungen entsprechen:

    terraform plan
    
  3. Führen Sie den folgenden Befehl aus, um zu prüfen, ob Ihre Konfiguration gültig ist:

    terraform validate
    
  4. Wenden Sie die Terraform-Konfiguration an, indem Sie den folgenden Befehl ausführen und in die Eingabeaufforderung "yes" eingeben:

    terraform apply
    

Warten Sie, bis Terraform die Meldung „Apply complete“ anzeigt.

Rufen Sie in der Google Cloud Console Ihre Ressourcen in der UI auf und prüfen Sie, ob sie von Terraform erstellt oder aktualisiert wurden.

Cloud Functions-Funktion testen

So prüfen Sie, ob Ihre Funktion eine Nachricht in einem Pub/Sub-Thema veröffentlicht und ob die Beispiel-DAGs wie vorgesehen funktionieren:

  1. Prüfen Sie, ob die DAGs aktiv sind:

    1. Rufen Sie in der Google Cloud Console die Seite Umgebungen auf.

      Zur Seite Umgebungen“

    2. Klicken Sie in der Liste der Umgebungen auf den Namen Ihrer Umgebung. Die Seite Umgebungsdetails wird geöffnet.

    3. Rufen Sie den Tab DAGs auf.

    4. Prüfen Sie die Werte in der Spalte Status für DAGs mit den Namen trigger_dag und target_dag. Beide DAGs müssen den Status Active haben.

  2. Senden Sie per Push eine Pub/Sub-Testnachricht. Sie können dies in Cloud Shell tun:

    1. Rufen Sie in der Google Cloud Console die Seite Funktionen auf.

      Zu Cloud Functions

    2. Klicken Sie auf den Namen der Funktion: pubsub-publisher.

    3. Rufen Sie den Tab Test auf.

    4. Geben Sie im Bereich Auslösendes Ereignis konfigurieren den folgenden JSON-Schlüssel/Wert ein: {"message": "target_dag"}. Ändern Sie das Schlüssel/Wert-Paar nicht, da diese Nachricht den Test-DAG später auslöst.

    5. Klicken Sie im Abschnitt Testbefehl auf In Cloud Shell testen.

    6. Warten Sie im Cloud Shell-Terminal, bis ein Befehl automatisch angezeigt wird. Führen Sie diesen Befehl durch Drücken von Enter aus.

    7. Wenn die Meldung Cloud Shell autorisieren angezeigt wird, klicken Sie auf Autorisieren.

    8. Prüfen Sie, ob der Nachrichteninhalt der Pub/Sub-Nachricht entspricht. In diesem Beispiel muss die Ausgabenachricht mit Message b'target_dag' with message_length 10 published to als Antwort von Ihrer Funktion beginnen.

  3. Prüfen Sie, ob target_dag ausgelöst wurde:

    1. Warten Sie mindestens eine Minute, bis eine neue DAG-Ausführung von trigger_dag abgeschlossen wird.

    2. Rufen Sie in der Google Cloud Console die Seite Umgebungen auf.

      Zur Seite Umgebungen“

    3. Klicken Sie in der Liste der Umgebungen auf den Namen Ihrer Umgebung. Die Seite Umgebungsdetails wird geöffnet.

    4. Rufen Sie den Tab DAGs auf.

    5. Klicken Sie auf trigger_dag, um die Seite DAG-Details aufzurufen. Auf dem Tab Ausführungen wird eine Liste der DAG-Ausführungen für den DAG trigger_dag angezeigt.

      Dieser DAG wird jede Minute ausgeführt und verarbeitet alle Pub/Sub-Nachrichten, die von der Funktion gesendet werden. Wenn keine Nachrichten gesendet wurden, wird die Aufgabe trigger_target in den DAG-Ausführungslogs als Skipped gekennzeichnet. Wenn DAGs ausgelöst wurden, wird die Aufgabe trigger_target als Success markiert.

    6. Sehen Sie sich mehrere aktuelle DAG-Ausführungen an, um eine DAG-Ausführung zu finden, bei der alle drei Aufgaben (subscribe_task, pull_messages_operator und trigger_target) den Status Success haben.

    7. Gehen Sie zurück zum Tab DAGs und prüfen Sie, ob in der Spalte Erfolgreiche Ausführungen für den DAG target_dag eine erfolgreiche Ausführung aufgeführt ist.

Zusammenfassung

In dieser Anleitung haben Sie gelernt, wie Sie mit Cloud Functions Nachrichten in einem Pub/Sub-Thema veröffentlichen und einen DAG bereitstellen, der ein Pub/Sub-Thema abonniert, Pub/Sub-Nachrichten abruft und einen anderen DAG auslöst, der in der DAG-ID der Nachrichtendaten angegeben ist.

Es gibt auch alternative Möglichkeiten, Pub/Sub-Abos zu erstellen und zu verwalten und DAGs auszulösen, die in dieser Anleitung nicht behandelt werden. Sie können beispielsweise Airflow-DAGs mit Cloud Functions auslösen, wenn ein bestimmtes Ereignis eintritt. Mit unseren Anleitungen können Sie die anderen Google Cloud-Features testen.

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder behalten Sie das Projekt bei und löschen Sie die einzelnen Ressourcen.

Projekt löschen

    Google Cloud-Projekt löschen:

    gcloud projects delete PROJECT_ID

Einzelne Ressourcen löschen

Wenn Sie mehrere Anleitungen und Kurzanleitungen durcharbeiten möchten, können Sie die Überschreitung von Projektkontingenten verhindern, indem Sie Projekte wiederverwenden.

Console

  1. Löschen Sie die Cloud Composer-Umgebung. Während dieses Vorgangs löschen Sie auch den Bucket der Umgebung.
  2. Löschen Sie das Pub/Sub-Thema dag-topic-trigger.
  3. Löschen Sie die Cloud Functions-Funktion.

    1. Rufen Sie in der Google Cloud Console Cloud Functions auf.

      Zu Cloud Functions

    2. Klicken Sie auf das Kästchen für die Funktion, die Sie löschen möchten: pubsub-publisher.

    3. Klicken Sie auf Löschen und folgen Sie der Anleitung.

Terraform

  1. Achten Sie darauf, dass Ihr Terraform-Skript keine Einträge für Ressourcen enthält, die noch für Ihr Projekt erforderlich sind. So können Sie beispielsweise einige APIs aktiviert lassen und IAM-Berechtigungen weiterhin zugewiesen bleiben (wenn Sie Ihrem Terraform-Skript solche Definitionen hinzugefügt haben).
  2. Führen Sie terraform destroy aus.
  3. Löschen Sie den Bucket der Umgebung manuell. Cloud Composer löscht sie nicht automatisch. Sie können dies über die Google Cloud Console oder die Google Cloud CLI tun.

Nächste Schritte