Secrets für Instanzen konfigurieren

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

Es gibt folgende Möglichkeiten, ein Secret für Ihre Container verfügbar zu machen:

  • Wenn Sie jedes Secret als Volume bereitstellen, macht Cloud Run das Secret für den Container als Dateien verfügbar. Beim Lesen eines Volumes ruft Cloud Run immer den Secret-Wert aus Secret Manager ab, um den Wert mit der neuesten Version zu verwenden. Diese Methode funktioniert auch gut mit der Secret-Rotation.
  • Ü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 die neueste Version (latest) setzen.

Weitere Informationen finden Sie unter Secret Manager Best Practices.

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

Bei der Bereitstellung der Instanz prüft Cloud Run alle von Ihnen verwendeten Secrets. Bei 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 bereitstellen, was bei Instanzen immer der Fall ist, ist der Root-Nutzer der Inhaber des Volumes.

Hinweis

  1. Aktivieren Sie die Secret Manager API.

    Erforderliche Rollen zum Aktivieren von APIs

    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ätspools zur Rolle „Zugriffsperson für Secret Manager-Secret“ 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 mit Google 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

  • Führen Sie den folgenden Befehl aus, um das Secret beim Bereitstellen einer Instanz als Umgebungsvariable bereitzustellen:

    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 Umgebungsvariablen, die Sie mit dem Secret verwenden möchten.
    • SECRET_NAME: Der Secret-Name 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
  • Mit dem Flag --set-secrets können Sie vorhandene Secrets löschen und ein neues Secret für die Instanz zugänglich machen:

    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 Secret-Name, 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 Secret-Name, 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 Instanz konto 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 Secret-Name, 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 Secret-Namen- Syntax, 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 Secret-Name, 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 Secret-Namen- Syntax, 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 Secret-Name, 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. Verwenden Sie den folgenden Befehl:

    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 mithilfe 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 unter 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 die Bereitstellung 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 unter 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.