Secrets für Instanzen konfigurieren

Für die Abhängigkeiten Ihrer Instanz sind möglicherweise API-Schlüssel, Passwörter, Zertifikate oder andere vertrauliche Informationen erforderlich. Für Cloud Run empfiehlt Google, diese vertraulichen Informationen in einem Secret zu speichern, das Sie in Secret Manager erstellen.

Sie können ein Secret für Ihre Container auf eine der folgenden Arten verfügbar machen:

  • Wenn Sie jedes Secret als Volume bereitstellen, stellt Cloud Run das Secret dem Container als Dateien zur Verfügung. Beim Lesen eines Volumes ruft Cloud Run den Secret-Wert immer aus Secret Manager ab, um den Wert mit der neuesten Version zu verwenden. Diese Methode eignet sich auch gut für die Rotation von Secrets.
  • Übergeben Sie ein Secret mithilfe von Umgebungsvariablen. Umgebungsvariablen werden beim Starten der Instanz aufgelöst. Wenn Sie diese Methode verwenden, empfiehlt Google, dass Sie das Secret auf eine bestimmte Version statt auf latest setzen.

Weitere Informationen finden Sie unter Best Practices für Secret Manager.

So werden Secrets bei der Bereitstellung und zur Laufzeit geprüft

Während der Instanzbereitstellung prüft Cloud Run alle verwendeten Secrets. Mit der Prüfung wird sichergestellt, dass das Dienstkonto, mit dem der Container ausgeführt wird, die Berechtigung zum Zugriff auf diese Secrets hat.

Während der Laufzeit beim Start von Instanzen:

  • Wenn das Secret eine Umgebungsvariable ist, ruft Cloud Run den Wert des Secrets vor dem Starten der Instanz ab. Wenn der Secret-Abruf fehlschlägt, wird die Instanz nicht gestartet.
  • Wenn Sie das Secret als Volume bereitstellen, führt Cloud Run beim Start der Instanz keine Prüfungen durch. Während der Laufzeit schlägt jedoch der Zugriff auf ein bereitgestelltes Volume fehl, wenn auf ein Secret nicht zugegriffen werden kann.

Volume-Inhaberschaft

Die Inhaberschaft eines Cloud Run-Secret-Volumes variiert je nach Ausführungsumgebung und Bereitstellungstyp.

Wenn Sie ein Secret-Volume mit der Ausführungsumgebung der zweiten Generation einbinden, was beispielsweise immer bei Instanzen der Fall ist, gehört das Volume dem Root.

Hinweis

  1. Aktivieren Sie die Secret Manager API, falls sie noch nicht aktiviert ist.

    Rollen, die zum Aktivieren von APIs erforderlich sind

    Zum Aktivieren von APIs benötigen Sie die Berechtigung serviceusage.services.enable. Wenn Sie das Projekt erstellt haben, haben Sie diese Berechtigung wahrscheinlich bereits über die Rolle „Inhaber“ (roles/owner). Andernfalls können Sie diese Berechtigung über die Rolle „Service Usage-Administrator“ (roles/serviceusage.serviceUsageAdmin) erhalten. Informationen zum Zuweisen von Rollen

    API aktivieren

  2. Verwenden Sie ein vorhandenes Secret oder erstellen Sie ein Secret in Secret Manager, wie unter Secret erstellen beschrieben.

Erforderliche Rollen

Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen zuzuweisen, um die Berechtigungen zu erhalten, die Sie zur Konfiguration von Secrets benötigen:

Damit Cloud Run auf das Secret zugreifen kann, muss die Dienstidentität die folgende Rolle haben:

Eine Anleitung zum Hinzufügen des Dienstidentitätshauptkontos zur Rolle „Secret Manager Secret Accessor“ finden Sie unter Zugriff auf Secrets verwalten.

Eine Liste der IAM-Rollen und -Berechtigungen im Zusammenhang mit Cloud Run finden Sie unter IAM-Rollen für Cloud Run und IAM-Berechtigungen für Cloud Run. Wenn Ihre Cloud Run-Instanz mitGoogle Cloud -APIs wie Cloud-Clientbibliotheken verknüpft ist, lesen Sie die Konfigurationsanleitung für Dienstidentitäten. Weitere Informationen zum Zuweisen von Rollen finden Sie unter Bereitstellungsberechtigungen und Zugriff verwalten.

Secret für Cloud Run zugänglich machen

Sie können ein Secret für Ihre Instanz über die Google Cloud CLI oder YAML bereitstellen, wenn Sie eine neue Instanz bereitstellen oder eine vorhandene Instanz aktualisieren:

gcloud

  • Wenn Sie das Secret beim Bereitstellen einer Instanz als Umgebungsvariable bereitstellen möchten, führen Sie den folgenden Befehl aus:

    gcloud beta run instances deploy INSTANCE \
      --image IMAGE_URL \
      --update-secrets=ENV_VAR_NAME=SECRET_NAME:VERSION

    Ersetzen Sie Folgendes:

    • INSTANCE: Der Name der Instanz.
    • IMAGE_URL: Ein Verweis auf das Container-Image, z. B. us-docker.pkg.dev/cloudrun/container/hello:latest.
    • ENV_VAR_NAME: Der Name der Umgebungsvariable, die Sie mit dem Secret verwenden möchten.
    • SECRET_NAME: der Name des Secrets im selben Projekt, z. B. mysecret.
    • VERSION: die Secret-Version. Verwenden Sie latest für die neueste Version oder eine Zahl, z. B. 2.
  • Wenn Sie mehrere Secrets gleichzeitig aktualisieren möchten, trennen Sie die Konfigurationsoptionen für jedes Secret durch ein Komma. Mit dem folgenden Befehl wird ein Secret aktualisiert, das als Volume bereitgestellt wird, und ein weiteres Secret, das als Umgebungsvariable bereitgestellt wird. Führen Sie den folgenden Befehl aus, um vorhandene Secrets zu aktualisieren:

    gcloud beta run instances deploy INSTANCE \
    --image IMAGE_URL \
    --update-secrets=PATH=SECRET_NAME:VERSION,ENV_VAR_NAME=SECRET_NAME:VERSION
  • Wenn Sie vorhandene Secrets löschen und ein neues Secret für die Instanz verfügbar machen möchten, verwenden Sie das Flag --set-secrets:

    gcloud beta run instances update INSTANCE \
     --set-secrets="ENV_VAR_NAME=SECRET_NAME:VERSION"

YAML

  1. Wenn Sie eine neue Instanz erstellen, überspringen Sie diesen Schritt. Wenn Sie eine vorhandene Instanz aktualisieren, laden Sie die zugehörige YAML-Konfiguration herunter:

    gcloud beta run instances describe INSTANCE --format export > instance.yaml
  2. Für Secrets, die als Umgebungsvariablen bereitgestellt werden:

    apiVersion: run.googleapis.com/v1
    kind: Instance
    metadata:
      name: INSTANCE
      annotations:
        run.googleapis.com/launch-stage: BETA
    spec:
      containers:
      - image: IMAGE_URL
        env:
        - name: ENV_VAR
          valueFrom:
            secretKeyRef:
              key: SECRET_VERSION
              name: SECRET_NAME

    Ersetzen Sie Folgendes:

    • INSTANCE: Der Name Ihrer Cloud Run-Instanz.
    • IMAGE_URL: ein Verweis auf das Container-Image, z. B. us-docker.pkg.dev/cloudrun/container/hello:latest
    • ENV_VAR: der Name der Umgebungsvariablen.
    • SECRET_VERSION: die Secret-Version. Verwenden Sie latest für die neueste Version oder eine Zahl, z. B. 2.
    • SECRET_NAME: Der Name des Secrets, z. B. mysecret.
  3. Für Secrets, die als Dateipfade bereitgestellt werden:

    apiVersion: run.googleapis.com/v1
    kind: Instance
    metadata:
      name: INSTANCE
      annotations:
        run.googleapis.com/launch-stage: BETA
    spec:
      containers:
      - image: IMAGE_URL
        volumeMounts:
        - name: VOLUME_NAME
          mountPath: MOUNT_PATH
      volumes:
      - name: VOLUME_NAME
        secret:
          secretName: SECRET_NAME
          items:
          - key: SECRET_VERSION
            path: SECRET_NAME

    Ersetzen Sie Folgendes:

    • INSTANCE: Der Name Ihrer Cloud Run-Instanz.
    • IMAGE_URL: Ein Verweis auf das Container-Image, z. B. us-docker.pkg.dev/cloudrun/container/hello:latest.
    • VOLUME_NAME: Ein beliebiger Name für Ihr Volume.
    • MOUNT_PATH: der relative Pfad, unter dem Sie das Volume bereitstellen, z. B. /mnt/my-volume.
    • SECRET_NAME: Der Name des Secrets, z. B. mysecret.
    • SECRET_VERSION: die Secret-Version. Verwenden Sie latest für die neueste Version oder eine Zahl, z. B. 2.
  4. Ersetzen Sie die Instanz mit dem folgenden Befehl durch die neue Konfiguration:

    gcloud beta run services replace service.yaml

Auf Secrets aus anderen Projekten verweisen

Wenn Sie auf ein Secret aus einem anderen Projekt verweisen möchten, prüfen Sie, ob das Instanzkonto Ihres Projekts Zugriff auf das Secret hat.

gcloud

Führen Sie den folgenden Befehl aus, um auf ein Secret als Umgebungsvariable zu verweisen:

gcloud beta run instances deploy INSTANCE \
    --image IMAGE_URL \
    --update-secrets=ENV_VAR_NAME=projects/PROJECT_NUMBER/secrets/SECRET_NAME:VERSION

Ersetzen Sie Folgendes:

  • INSTANCE: Der Name der Instanz.
  • IMAGE_URL: Ein Verweis auf das Container-Image, z. B. us-docker.pkg.dev/cloudrun/container/hello:latest.
  • PROJECT_NUMBER: Die Projektnummer des Projekts, in dem das Secret erstellt wurde.
  • SECRET_NAME: Der Name des Secrets, z. B. mysecret.
  • VERSION: die Secret-Version. Verwenden Sie latest für die neueste Version oder eine Zahl, z. B. 2.

YAML

  1. Wenn Sie eine neue Instanz erstellen, überspringen Sie diesen Schritt. Wenn Sie eine vorhandene Instanz aktualisieren, laden Sie die zugehörige YAML-Konfiguration herunter:

    gcloud beta run instances describe INSTANCE --format export > instance.yaml
  2. Für Secrets, die als Umgebungsvariablen bereitgestellt werden:

    apiVersion: run.googleapis.com/v1
    kind: Instance
    metadata:
      name: INSTANCE
      annotations:
        run.googleapis.com/launch-stage: BETA
        metadata:
          annotations:
            run.googleapis.com/secrets: SECRET_LOOKUP_NAME:projects/PROJECT_NUMBER/secrets/SECRET_NAME
        spec:
          containers:
          - image: IMAGE_URL
            env:
            - name: ENV_VAR
              valueFrom:
                secretKeyRef:
                  key: SECRET_VERSION
                  name: SECRET_LOOKUP_NAME

    Ersetzen Sie Folgendes:

    • INSTANCE: Der Name Ihrer Cloud Run-Instanz.
    • SECRET_LOOKUP_NAME: Ein beliebiger Name mit einer gültigen Syntax für Secret-Namen, z. B. my-secret. Dieser kann SECRET_NAME entsprechen.
    • PROJECT_NUMBER: die Projektnummer des Projekts, in dem das Secret erstellt wurde.
    • SECRET_NAME: Der Name des Secrets, z. B. mysecret.
    • IMAGE_URL: ein Verweis auf das Container-Image, z. B. us-docker.pkg.dev/cloudrun/container/hello:latest
    • ENV_VAR: der Name der Umgebungsvariablen.
    • SECRET_VERSION: die Secret-Version. Verwenden Sie latest für die neueste Version oder eine Zahl, z. B. 2.
  3. Für Secrets, die als Dateipfade bereitgestellt werden:

    apiVersion: run.googleapis.com/v1
    kind: Instance
    metadata:
      name: INSTANCE
      annotations:
        run.googleapis.com/launch-stage: BETA
    metadata:
      annotations:
        run.googleapis.com/secrets: SECRET_LOOKUP_NAME:projects/PROJECT_NUMBER/secrets/SECRET_NAME
    spec:
      containers:
      - image: IMAGE_URL
        volumeMounts:
        - name: VOLUME_NAME
          mountPath: MOUNT_PATH
      volumes:
      - name: VOLUME_NAME
        secret:
          secretName: SECRET_NAME
          items:
          - key: SECRET_VERSION
            path: SECRET_LOOKUP_NAME

    Ersetzen Sie Folgendes:

    • INSTANCE: Der Name Ihrer Cloud Run-Instanz.
    • SECRET_LOOKUP_NAME: Ein beliebiger Name mit einer gültigen Syntax für Secret-Namen, z. B. my-secret. Er kann mit SECRET_NAME identisch sein.
    • PROJECT_NUMBER: die Projektnummer des Projekts, in dem das Secret erstellt wurde.
    • SECRET_NAME: Der Name des Secrets, z. B. mysecret.
    • IMAGE_URL: Ein Verweis auf das Container-Image, z. B. us-docker.pkg.dev/cloudrun/container/hello:latest.
    • VOLUME_NAME: Ein beliebiger Name für Ihr Volume.
    • MOUNT_PATH: der relative Pfad, unter dem Sie das Volume bereitstellen, z. B. /mnt/my-volume.
    • SECRET_VERSION: die Secret-Version. Verwenden Sie latest für die neueste Version oder eine Zahl, z. B. 2.
  4. Ersetzen Sie die Instanz mit dem folgenden Befehl durch die neue Konfiguration:

    gcloud beta run instances replace instance.yaml

Einstellungen für Secrets aufrufen

So rufen Sie die aktuellen Secret-Einstellungen für Ihre Cloud Run-Instanz auf:

gcloud

  1. Führen Sie dazu diesen Befehl aus:

    gcloud beta run instances describe INSTANCE
  2. Suchen Sie in der zurückgegebenen Konfiguration nach der Einstellung für Secrets.

Secrets aus einer Instanz entfernen

Sie können Secrets aus einer Instanz mit der gcloud CLI entfernen:

gcloud

Sie können alle Secrets aus einer Instanz entfernen oder ein oder mehrere Secrets angeben, die entfernt werden sollen.

Führen Sie den folgenden Befehl aus, um alle Secrets zu entfernen:

  gcloud beta run instances deploy INSTANCE --image IMAGE_URL \
      --clear-secrets

Ersetzen Sie Folgendes:

  • INSTANCE: Der Name der Instanz.
  • IMAGE_URL: Ein Verweis auf das Container-Image, z. B. us-docker.pkg.dev/cloudrun/container/hello:latest.

Mit dem Flag --remove-secrets geben Sie eine Liste der zu entfernenden Secrets an. Mit dem folgenden Befehl wird ein Secret gelöscht, das als Volume bereitgestellt wird, und ein weiteres Secret, das als Umgebungsvariable freigegeben wird.

  gcloud beta run instances deploy INSTANCE --image IMAGE_URL \
      --remove-secrets=ENV_VAR_NAME,SECRET_FILE_PATH

Ersetzen Sie Folgendes:

  • INSTANCE: Der Name der Instanz.
  • IMAGE_URL: Ein Verweis auf das Container-Image, z. B. us-docker.pkg.dev/cloudrun/container/hello:latest.
  • ENV_VAR_NAME: der Name der Umgebungsvariablen.
  • SECRET_FILE_PATH: der vollständige Pfad des Secrets. Beispiel: /mnt/secrets/primary/latest, wobei /mnt/secrets/primary/ der Bereitstellungspfad und latest der Pfad des Secrets ist. Sie können auch die Bereitstellungspfade und die Pfade des Secrets separat angeben:

    --set-secrets MOUNT_PATH:SECRET_PATH=SECRET:VERSION

Secrets in Ihrem Code verwenden

Beispiele für den Zugriff auf Secrets in Ihrem Code als Umgebungsvariablen finden Sie in der Anleitung zur Endnutzerauthentifizierung, insbesondere im Abschnitt Vertrauliche Konfigurationen mit Secret Manager verarbeiten.

Beschränkungen

In den folgenden Abschnitten werden die Einschränkungen beschrieben, die für das Einbinden von Secrets gelten.

Unzulässige Pfade

  • Mit Cloud Run können Sie keine Secrets unter /dev, /proc und /sys oder in ihren Unterverzeichnissen bereitstellen.
  • Mit Cloud Run können Sie nicht mehrere Secrets auf demselben Pfad bereitstellen, da zwei Volume-Bereitstellungen nicht an demselben Speicherort bereitgestellt werden können.

Regionale Secrets

Cloud Run unterstützt keine regionalen Secrets.

Verzeichnis überschreiben

Wenn das Secret als Volume in Cloud Run bereitgestellt wird und das letzte Verzeichnis im Volume-Bereitstellungspfad bereits vorhanden ist, sind alle Dateien oder Ordner im vorhandenen Verzeichnis nicht mehr zugänglich.

Wenn z. B. ein Secret mit dem Namen my-secret im Pfad /etc/app_data bereitgestellt wird, wird der gesamte Inhalt im Verzeichnis app_data überschrieben und die einzige sichtbare Datei ist /etc/app_data/my-secret.

Um das Überschreiben von Dateien in einem vorhandenen Verzeichnis zu vermeiden, erstellen Sie ein neues Verzeichnis für die Bereitstellung des Secrets, z. B. /etc/app_data/secrets, sodass der Bereitstellungspfad für das Secret /etc/app_data/secrets/my-secret lautet.