Secret Manager für Ihre Umgebung konfigurieren

Cloud Composer 1 | Cloud Composer 2 | Cloud Composer 3

Auf dieser Seite wird gezeigt, wie Sie mit Secret Manager Airflow-Verbindungen und -Secrets sicher speichern.

Hinweis

  • Ihre Cloud Composer-Umgebung, um Secret Manager zu verwenden muss Airflow 1.10.10 oder höher und Python 3.6 oder höher verwenden.
  • Python 2 wird nicht unterstützt.

Secret Manager für Ihre Umgebung konfigurieren

In diesem Abschnitt wird erläutert, wie Sie Secret Manager so konfigurieren, dass Sie können Secrets mit Ihrer Cloud Composer-Umgebung verwenden.

Aktivieren Sie die Secret Manager API:

Console

Secret Manager API aktivieren.

Aktivieren Sie die API

gcloud

Aktivieren Sie die Secret Manager API:

gcloud services enable secretmanager.googleapis.com

Zugriffssteuerung konfigurieren

Sie müssen die Zugriffssteuerung konfigurieren, damit Airflow auf Secrets zugreifen kann, die in Secret Manager

Dazu muss das Dienstkonto, das auf Secrets zugreift, eine Rolle mit die Berechtigung secretmanager.versions.access. Beispiel: die Rolle Accessor für Secret Manager-Secret diese Berechtigung enthält.

Sie können diese Rolle auf Secret-, Projekt-, Ordner- oder Organisationsebene zuweisen.

Verwenden Sie eine der folgenden Optionen:

DAG-Serialisierung aktivieren

Im Allgemeinen sollten Sie nur das Secret Manager-Back-End von innerhalb der execute()-Methoden der Operatoren oder mit dem Jinja-Vorlagen Variablen lassen sich beispielsweise mit var.value.example_var abrufen.

Der Airflow-Webserver wird unter einem anderen Dienstkonto mit eingeschränkten Berechtigungen ausgeführt, sodass nicht auf Secrets in Secret Manager zugegriffen werden kann. Wenn der DAG-Code während der Verarbeitung von DAG auf Secrets zugreift (nicht nur von Aufgaben aus) und er nicht angepasst werden kann, um über die execute()-Methoden auf Secrets zuzugreifen, aktivieren Sie DAG-Serialisierung. Danach stellt Airflow verarbeitet verarbeitete DAGs und benötigt keinen Zugriff auf Secrets.

Secret Manager-Backend aktivieren und konfigurieren

  1. Überschreiben Sie die folgende Airflow-Konfigurationsoption:

    Bereich Schlüssel Wert
    secrets backend airflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend
  2. Fügen Sie optionale Einstellungen hinzu, indem Sie folgenden Airflow überschreiben Konfigurationsoption:

    Bereich Schlüssel Wert
    secrets backend_kwargs Weitere Informationen finden Sie in der folgenden Beschreibung.

    Der Wert backend_kwargs ist die JSON-Darstellung des backend_kwargs-Objekt durch die folgenden Felder:

    • connections_prefix: Präfix des Secret-Namens, der gelesen werden soll, um und rufen Sie Verbindungen ab. Der Standardwert ist airflow-connections.
    • variables_prefix: Präfix des Secret-Namens, der gelesen werden soll, um abzurufen Variablen: Der Standardwert ist airflow-variables.
    • gcp_key_path: Pfad zur JSON-Datei mit den Google Cloud-Anmeldedaten Wenn nicht angegeben, wird das Standarddienstkonto verwendet.
    • gcp_keyfile_dict: JSON-Wörterbuch für Google Cloud-Anmeldedaten. Gegenseitig exklusiv bei gcp_key_path.
    • sep: Trennzeichen, das zum Verketten von connections_prefix und conn_id verwendet wird. Der Standardwert ist -.
    • project_id: Google Cloud-Projekt-ID, unter der die Secrets gespeichert sind.

    Der Wert von backend_kwargs kann beispielsweise so aussehen: {"project_id": "<project id>", "connections_prefix":"example-connections", "variables_prefix":"example-variables", "sep":"-"}

Verbindungen und Variablen in Secret Manager hinzufügen

Erstellen Sie Secrets anhand der Schritte unter Secrets und Versionen erstellen

Variablen

  • Sie müssen das Format [variable_prefix][sep][variable_name] verwenden.
  • Der Standardwert für [variable_prefix] ist airflow-variables.
  • Das Standardtrennzeichen [sep] ist -

Beispiel: Wenn der Variablenname example-var lautet, lautet der Secret-Name airflow-variables-example-var.

Verbindungsnamen

  • Sie müssen das Format [connection_prefix][sep][connection_name] verwenden.
  • Der Standardwert für [connection_prefix] ist airflow-connections.
  • Das Standardtrennzeichen [sep] ist -

Wenn der Verbindungsname beispielsweise exampleConnection lautet, lautet der Secret-Name airflow-connections-exampleConnection.

Verbindungswerte

  • Muss verwendet werden URI-Darstellung. Beispiel: postgresql://login:secret@examplehost:9000

  • Der URI muss URL-codiert sein. (in Prozent codiert). Beispielsweise muss ein Passwort, das ein Leerzeichensymbol enthält, so URL-codiert sein: postgresql://login:secret%20password@examplehost:9000.

Airflow hat eine Convenience-Methode zum Generieren einer Verbindung URIs. Ein Beispiel für das Codieren einer komplexen URL mit JSON-Extras ist verfügbar in der Airflow-Dokumentation.

Secret Manager mit Cloud Composer verwenden

Beim Abrufen von Variablen und Verbindungen prüft Cloud Composer zuerst Secret Manager. Wenn die angeforderte Variable oder Verbindung nicht gefunden wird, prüft Cloud Composer die Umgebungsvariablen und die Airflow-Datenbank.

Variablen mit Jinja-Vorlagen lesen

Mit Secret Manager können Sie Variablen lesen, Jinja-Vorlagen für mit Vorlagen erstellte Operatorfelder (zur Ausführungszeit behoben).

Für das Secret airflow-variables-secret_filename:

file_name = '{{var.value.secret_filename}}'

Variablen mit benutzerdefinierten Operatoren und Callbacks lesen

Sie können Secret Manager auch verwenden, um Variablen in benutzerdefinierten Operatoren oder Rückrufmethoden von Operatoren zu lesen. Das Lesen von Variablen in DAGs kann sich negativ auf die Leistung auswirken. Verwenden Sie daher Jinja-Vorlagen, wenn Sie Variablen in Ihren DAGs verwenden möchten.

Zum Beispiel für das Secret airflow-variables-secret_filename:

from airflow.models.variable import Variable
file_name = Variable.get('secret_filename')

Verbindungen lesen

Wenn Sie keinen benutzerdefinierten Operator schreiben, sollten Sie selten direkt auf Verbindungen zugreifen müssen. Die meisten Hooks erhalten den Verbindungsnamen Instanziierungsparameter und sollte Verbindungen aus dem Secret abrufen beim Ausführen von Aufgaben automatisch das Back-End.

Das direkte Lesen von Verbindungen kann beim Schreiben eines eigenen Hooks hilfreich sein.

Beispiel für die Verbindung airflow-connections-exampleConnection:

from airflow.hooks.base_hook import BaseHook
exampleConnection = BaseHook.get_connection('exampleConnection')

BaseHook.get_connection gibt ein Connection-Objekt zurück. Die URI-Stringdarstellung einer Verbindung kann so abgerufen werden:

exampleConnectionUri = BaseHook.get_connection('exampleConnection').get_uri()

Nächste Schritte