Configurer les secrets

Votre service peut avoir besoin de dépendances nécessitant des clés API, des mots de passe, des certificats ou d'autres informations sensibles. Pour Cloud Run, Google vous recommande de stocker ce type d'informations sensibles dans un secret créé dans Secret Manager.

Pour mettre un secret à disposition de vos conteneurs, vous avez deux possibilités :

  • Installer chaque secret en tant que volume, ce qui rend le secret disponible au conteneur en tant que fichiers. La lecture d'un volume récupère toujours la valeur du secret depuis Secret Manager, ce qui permet de l'utiliser avec la dernière version. Cette méthode fonctionne également avec la rotation des secrets.
  • Transmettre un secret à l'aide de variables d'environnement. Les variables d'environnement sont résolues au moment du démarrage de l'instance. Ainsi, si vous utilisez cette méthode, Google vous recommande d'épingler le secret à une version particulière plutôt que d'utiliser la dernière version.

Pour en savoir plus, reportez-vous au document Bonnes pratiques de Secret Manager.

Vérification des secrets lors du déploiement et de l'exécution

Pendant le déploiement du service, tous les secrets utilisés, en tant que variables d'environnement ou installés en tant que volume, sont vérifiés pour s'assurer que le compte de service utilisé pour exécuter le conteneur y a accès. Si une vérification échoue, le déploiement du service échoue.

Lors de l'exécution, lorsque les instances démarrent :

  • si le secret est une variable d'environnement, sa valeur est récupérée avant le démarrage de l'instance. Par conséquent, si la récupération du secret échoue, l'instance ne démarre pas ;
  • si le secret est installé en tant que volume, aucune vérification n'est effectuée au démarrage de l'instance. Toutefois, pendant l'exécution, si un secret est inaccessible, les tentatives de lecture du volume installé échoueront.

La propriété du volume diffère selon l'environnement d'exécution et le type de déploiement.

Lorsque vous installez un volume, l'identité propriétaire des fichiers et des répertoires varie en fonction de l'environnement d'exécution de la charge de travail et selon que le déploiement comprend un ou plusieurs conteneurs.

Dans l'environnement d'exécution de première génération où vous déployez un seul conteneur, le volume appartient à l'identité utilisée pour le conteneur. Dans tous les autres cas, le volume appartient à la racine. Cela inclut les éléments suivants :

  • Environnement d'exécution de première génération dans lequel vous déployez plusieurs conteneurs
  • Environnement de deuxième génération

Avant de commencer

  1. Enable the Secret Manager API.

    Enable the API

  2. Utilisez un secret existant ou créez-en un dans Secret Manager, comme décrit dans la section Créer un secret.

Rôles requis

Pour obtenir les autorisations nécessaires pour configurer les secrets, demandez à votre administrateur de vous accorder les rôles IAM suivants :

Pour autoriser Cloud Run à accéder au secret, l'identité du service doit disposer du rôle suivant :

Pour savoir comment ajouter le compte principal d'identité de service au rôle Accesseur de secrets de Secret Manager, consultez la section Gérer l'accès aux secrets.

Pour obtenir la liste des rôles et des autorisations IAM associés à Cloud Run, consultez les sections Rôles IAM Cloud Run et Autorisations IAM Cloud Run. Si votre service Cloud Run communique avec les API Google Cloud, telles que les bibliothèques clientes Cloud, consultez le guide de configuration de l'identité du service. Pour en savoir plus sur l'attribution de rôles, consultez les sections Autorisations de déploiement et Gérer les accès.

Rendre un secret accessible à Cloud Run

Tout changement de configuration entraîne la création d'une révision. Les révisions ultérieures obtiennent aussi automatiquement le même paramètre de configuration, à moins que vous ne le mettiez explicitement à jour.

Vous pouvez rendre un secret accessible à votre service à l'aide de la console Google Cloud, de Google Cloud CLI ou d'un fichier YAML lorsque vous déployez un nouveau service ou mettez à jour un service existant et déployez une révision. Cliquez sur l'onglet de votre choix :

Console

  1. Dans la console Google Cloud, accédez à Cloud Run :

    Accédez à Cloud Run

  2. Cliquez sur Déployer un conteneur et sélectionnez Service pour configurer un nouveau service. Remplissez la page initiale des paramètres du service, puis cliquez sur Conteneur(s), volumes, mise en réseau et sécurité pour développer la page de configuration du service.

  3. Si vous configurez un service existant, cliquez sur ce service puis sur Modifier et déployer la nouvelle révision.

  4. Suivez la procédure pour installer le secret en tant que volume ou l'exposer en tant que variable d'environnement.

    • Pour installer un secret en tant que volume, procédez comme suit :

      1. Cliquez sur l'onglet Volumes, puis sélectionnez Ajouter un volume.
      2. Dans la liste Type de volume, sélectionnez Secret.
      3. Dans le champ Nom du volume, saisissez un nom ou acceptez le nom par défaut.
      4. Dans la liste Secret, sélectionnez le secret que vous souhaitez utiliser.
      5. Dans le champ Chemin d'accès 1, saisissez le nom du fichier à installer.
      6. Dans la liste Version 1, sélectionnez la version du secret à référencer. La dernière version est sélectionnée par défaut. Si vous le souhaitez, vous pouvez sélectionner une version spécifique.
      7. Cliquez sur OK.
      8. Accédez à l'onglet Conteneur pour installer votre secret dans le conteneur.
      9. Dans l'onglet Installations de volume, cliquez sur Installer le volume.
      10. Dans la liste Nom 1, sélectionnez le nom de votre volume.
      11. Dans le champ Chemin d'installation 1, saisissez le chemin d'installation de ce secret. Il s'agit du répertoire dans lequel toutes les versions de votre secret sont placées.
      12. Cliquez sur OK.
      13. Cliquez sur Créer ou Déployer.
    • Pour exposer le secret en tant que variable d'environnement, procédez comme suit :

      1. Cliquez sur l'onglet Conteneur.
      2. Dans l'onglet Variables et secrets, cliquez sur Référencer un secret.
      3. Dans le champ Nom 1, saisissez le nom de la variable d'environnement.
      4. Dans la liste Secret, sélectionnez le secret que vous souhaitez utiliser.
      5. Dans la liste Version 1, sélectionnez la version du secret à référencer.
      6. Cliquez sur OK.
      7. Cliquez sur Créer ou Déployer.

gcloud

Pour rendre un secret accessible à votre service, saisissez l'une des commandes suivantes.

  • Pour installer le secret en tant que volume lors du déploiement d'un service, procédez comme suit :

    gcloud run deploy SERVICE --image IMAGE_URL  \
    --update-secrets=PATH=SECRET_NAME:VERSION

    Remplacez :

    • SERVICE par le nom de votre service ;
    • IMAGE_URL par une référence à l'image de conteneur, par exemple us-docker.pkg.dev/cloudrun/container/hello:latest. Si vous utilisez Artifact Registry, le dépôt REPO_NAME doit déjà être créé. L'URL se présente sous la forme suivante : LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • PATH par le chemin d'accès au volume et au nom de fichier du secret. Il doit commencer par une barre oblique, par exemple : /etc/secrets/dbconfig/password, où /etc/secrets/dbconfig/ représente le chemin d'accès du volume et password le nom du fichier secret.
    • SECRET_NAME par le nom du secret dans le même projet, ex. mysecret.
    • VERSION par la version de secret. Utilisez latest pour la version la plus récente, ou un nombre, par exemple 2.
  • Pour exposer le secret en tant que variable d'environnement lors du déploiement d'un service :

    gcloud run deploy SERVICE \
    --image IMAGE_URL \
    --update-secrets=ENV_VAR_NAME=SECRET_NAME:VERSION

    Remplacez :

    • SERVICE par le nom de votre service ;
    • IMAGE_URL par une référence à l'image de conteneur, par exemple us-docker.pkg.dev/cloudrun/container/hello:latest. Si vous utilisez Artifact Registry, le dépôt REPO_NAME doit déjà être créé. L'URL se présente sous la forme suivante : LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • ENV_VAR_NAME par le nom de la variable d'environnement que vous souhaitez utiliser avec le secret.
    • SECRET_NAME par le nom du secret dans le même projet, ex. mysecret.
    • VERSION par la version de secret. Utilisez latest pour la version la plus récente, ou un nombre, par exemple 2.
  • Vous pouvez mettre à jour plusieurs secrets en même temps. Pour ce faire, séparez les options de configuration de chaque secret par une virgule. La commande suivante met à jour un secret installé en tant que volume et un autre secret exposé en tant que variable d'environnement.

    Pour mettre à jour les secrets existants, saisissez la commande suivante :

    gcloud run deploy SERVICE --image IMAGE_URL \
    --update-secrets=PATH=SECRET_NAME:VERSION,ENV_VAR_NAME=SECRET_NAME:VERSION
  • Pour effacer les secrets existants et rendre un nouveau secret accessible au service, utilisez l'option --set-secrets :

    gcloud run services update SERVICE \
    --set-secrets="ENV_VAR_NAME=SECRET_NAME:VERSION"

YAML

  1. Si vous créez un service, ignorez cette étape. Si vous mettez à jour un service existant, téléchargez sa configuration YAML :

    gcloud run services describe SERVICE --format export > service.yaml
  2. Pour les secrets exposés en tant que variables d'environnement, sous env, mettez à jour les attributs ENV_VAR, VERSION et/ou SECRET_NAME selon vos besoins. Si plusieurs secrets sont installés en tant que variables d'environnement, vous aurez plusieurs de ces attributs.

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
          name: REVISION
        spec:
          containers:
          - image: IMAGE_URL
            env:
            - name: ENV_VAR
              valueFrom:
                secretKeyRef:
                  key: VERSION
                  name: SECRET_NAME
  3. Pour les secrets installés en tant que chemins de fichiers, mettez à jour les attributs MOUNT_PATH, VOLUME_NAME, VERSION, FILENAME et/ou SECRET_NAME selon vos besoins. Si plusieurs secrets sont installés en tant que chemins de fichiers, vous aurez plusieurs de ces attributs.

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
          name: REVISION
        spec:
          containers:
          - image: IMAGE_URL
            volumeMounts:
            - mountPath: MOUNT_PATH
              name: VOLUME_NAME
          volumes:
          - name: VOLUME_NAME
            secret:
              items:
              - key: VERSION
                path: FILENAME
              secretName: SECRET_NAME

    Notez que VOLUME_NAME peut être défini sur n'importe quel nom.

    Remplacer

    • SERVICE par le nom de votre service Cloud Run
    • IMAGE_URL par une référence à l'image de conteneur, par exemple us-docker.pkg.dev/cloudrun/container/hello:latest. Si vous utilisez Artifact Registry, le dépôt REPO_NAME doit déjà être créé. L'URL se présente sous la forme suivante : LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • REVISION par un nouveau nom de révision ou supprimez-le (le cas échéant). Si vous indiquez un nouveau nom de révision, il doit répondre aux critères suivants :
      • Commencer par SERVICE-
      • Ne contenir que des lettres minuscules, des chiffres et -
      • Ne pas se terminer par -
      • Ne pas dépasser 63 caractères
  4. Remplacez la configuration du service en exécutant la commande suivante :

    gcloud run services replace service.yaml

Terraform

  1. Créez un secret et une version de secret.

    resource "google_secret_manager_secret" "default" {
      secret_id = "my-secret"
      replication {
        auto {}
      }
    }
    
    resource "google_secret_manager_secret_version" "default" {
      secret      = google_secret_manager_secret.default.name
      secret_data = "this is secret data"
    }
  2. Créez un compte de service et accordez-lui l'accès au secret :

    resource "google_service_account" "default" {
      account_id   = "cloud-run-service-account"
      display_name = "Service account for Cloud Run"
    }
    
    resource "google_secret_manager_secret_iam_member" "default" {
      secret_id = google_secret_manager_secret.default.id
      role      = "roles/secretmanager.secretAccessor"
      # Grant the new deployed service account access to this secret.
      member     = "serviceAccount:${google_service_account.default.email}"
      depends_on = [google_secret_manager_secret.default]
    }
  3. Les secrets de Secret Manager sont accessibles depuis Cloud Run en tant que chemins d'accès de fichiers installés ou en tant que variables d'environnement.

    1. Pour les secrets installés en tant que chemins de fichiers, référencez la ressource Secret Manager dans le paramètre volumes. La valeur name correspond à une entrée du paramètre volume_mounts :

      resource "google_cloud_run_v2_service" "mounted_secret" {
        name     = "service-with-mounted-secret"
        location = "us-central1"
        ingress  = "INGRESS_TRAFFIC_ALL"
      
        deletion_protection = false # set to "true" in production
      
        template {
          volumes {
            name = "my-service-volume"
            secret {
              secret = google_secret_manager_secret.default.secret_id
              items {
                version = "latest"
                path    = "my-secret"
                mode    = 0 # use default 0444
              }
            }
          }
          containers {
            image = "us-docker.pkg.dev/cloudrun/container/hello"
            volume_mounts {
              name       = "my-service-volume"
              mount_path = "/secrets"
            }
          }
          service_account = google_service_account.default.email
        }
        depends_on = [google_secret_manager_secret_version.default]
      }
    2. Pour les secrets exposés en tant que variables d'environnement, référencez la ressource Secret Manager dans le paramètre env :

      resource "google_cloud_run_v2_service" "env_variable_secret" {
        name     = "service-with-env-var-secret"
        location = "us-central1"
        ingress  = "INGRESS_TRAFFIC_ALL"
      
        deletion_protection = false # set to "true" in production
      
        template {
          containers {
            image = "us-docker.pkg.dev/cloudrun/container/hello"
            env {
              name = "MY_SECRET"
              value_source {
                secret_key_ref {
                  secret  = google_secret_manager_secret.default.secret_id
                  version = "latest"
                }
              }
            }
          }
          service_account = google_service_account.default.email
        }
        depends_on = [google_secret_manager_secret_version.default]
      }

Référencer des secrets provenant d'autres projets

Pour référencer un secret provenant d'un autre projet, vérifiez que le compte de service de votre projet a accès au secret.

Console

  1. Dans la console Google Cloud, accédez à Cloud Run :

    Accédez à Cloud Run

  2. Cliquez sur Déployer un conteneur et sélectionnez Service pour configurer un nouveau service. Remplissez la page initiale des paramètres du service, puis cliquez sur Conteneur(s), volumes, mise en réseau et sécurité pour développer la page de configuration du service.

  3. Si vous configurez un service existant, cliquez sur ce service puis sur Modifier et déployer la nouvelle révision.

  4. Suivez la procédure pour installer le secret en tant que volume ou l'exposer en tant que variable d'environnement.

    • Pour installer un secret en tant que volume, procédez comme suit :

      1. Cliquez sur l'onglet Volumes, puis sélectionnez Ajouter un volume.
      2. Dans la liste Type de volume, sélectionnez Secret.
      3. Dans le champ Nom du volume, saisissez un nom ou acceptez le nom par défaut.
      4. Dans la liste Secret, cliquez sur Saisir le secret manuellement.
      5. Saisissez l'ID de ressource du secret au format suivant :

        projects/PROJECT_NUMBER/secrets/SECRET_NAME
        

        Remplacez les éléments suivants :

        • PROJECT_NUMBER par le numéro de votre projet Google Cloud Pour obtenir des instructions détaillées sur la recherche de votre numéro de projet, consultez la section Créer et gérer des projets.

        • SECRET_NAME : nom du secret dans Secret Manager.

      6. Dans le champ Chemin d'accès 1, saisissez le nom du fichier à installer.

      7. Dans la liste Version 1, sélectionnez la version du secret à référencer. La dernière version est sélectionnée par défaut. Si vous le souhaitez, vous pouvez sélectionner une version spécifique.

      8. Cliquez sur OK.

      9. Accédez à l'onglet Conteneur pour installer votre secret dans le conteneur.

      10. Dans l'onglet Installations de volume, cliquez sur Installer le volume.

      11. Dans la liste Nom 1, sélectionnez le nom de votre volume.

      12. Dans le champ Chemin d'installation 1, saisissez le chemin d'installation de ce secret. Il s'agit du répertoire dans lequel toutes les versions de votre secret sont placées.

      13. Cliquez sur OK.

      14. Cliquez sur Créer ou Déployer.

    • Pour exposer le secret en tant que variable d'environnement, procédez comme suit :

      1. Cliquez sur l'onglet Conteneur.
      2. Dans l'onglet Variables et secrets, cliquez sur Référencer un secret.
      3. Dans le champ Nom 1, saisissez le nom de la variable d'environnement.
      4. Dans la liste Secret, cliquez sur Saisir le secret manuellement.
      5. Saisissez l'ID de ressource du secret au format suivant :

        projects/PROJECT_NUMBER/secrets/SECRET_NAME
        

        Remplacez les éléments suivants :

        • PROJECT_NUMBER par le numéro de votre projet Google Cloud Pour obtenir des instructions détaillées sur la recherche de votre numéro de projet, consultez la section Créer et gérer des projets.

        • SECRET_NAME : nom du secret dans Secret Manager.

      6. Dans la liste Version 1, sélectionnez la version du secret à référencer.

      7. Cliquez sur OK.

      8. Cliquez sur Créer ou Déployer.

gcloud

  • Pour installer un secret en tant que volume lors du déploiement d'un service :

    gcloud run deploy SERVICE --image IMAGE_URL  \
    --update-secrets=PATH=projects/PROJECT_NUMBER/secrets/SECRET_NAME:VERSION

    Remplacez :

    • SERVICE par le nom de votre service ;
    • IMAGE_URL par une référence à l'image de conteneur, par exemple us-docker.pkg.dev/cloudrun/container/hello:latest. Si vous utilisez Artifact Registry, le dépôt REPO_NAME doit déjà être créé. L'URL se présente sous la forme suivante : LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • PATH par le chemin d'accès au volume et au nom de fichier du secret. Il doit commencer par une barre oblique, par exemple : /etc/secrets/dbconfig/password, où /etc/secrets/dbconfig/ représente le chemin d'accès du volume et password le nom du fichier secret.
    • PROJECT_NUMBER par le numéro du projet dans lequel le secret a été créé.
    • SECRET_NAME par le nom secret, ex. mysecret.
    • VERSION par la version de secret. Utilisez latest pour la version la plus récente, ou un nombre, par exemple 2.

YAML

  1. Si vous créez un service, ignorez cette étape. Si vous mettez à jour un service existant, téléchargez sa configuration YAML :

    gcloud run services describe SERVICE --format export > service.yaml

En raison de contraintes liées à la compatibilité des API, les emplacements des secrets doivent être stockés dans une annotation.

  1. Pour les secrets exposés en tant que variables d'environnement :

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        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: VERSION
                  name: SECRET_LOOKUP_NAME

    Remplacez :

    • SERVICE par le nom de votre service ;
    • IMAGE_URL par une référence à l'image de conteneur, par exemple us-docker.pkg.dev/cloudrun/container/hello:latest. Si vous utilisez Artifact Registry, le dépôt REPO_NAME doit déjà être créé. L'URL se présente sous la forme suivante : LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • ENV_VAR
    • PROJECT_NUMBER par le numéro du projet dans lequel le secret a été créé.
    • SECRET_NAME par le nom secret, ex. mysecret.
    • VERSION par la version de secret. Utilisez latest pour la version la plus récente, ou un nombre, par exemple 2.
    • SECRET_LOOKUP_NAME par un nom ayant une syntaxe de nom de secret valide (par exemple, my-secret), pouvant être identique à SECRET_NAME.
  2. Pour les secrets installés en tant que chemins de fichiers :

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/secrets: SECRET_LOOKUP_NAME:projects/PROJECT_NUMBER/secrets/SECRET_NAME
        spec:
          containers:
          - image: IMAGE_URL
            volumeMounts:
            - mountPath: MOUNT_PATH
              name: VOLUME_NAME
          volumes:
          - name: VOLUME_NAME
            secret:
              items:
              - key: VERSION
                path: FILENAME
              secretName: SECRET_LOOKUP_NAME

    Remplacez :

    • SERVICE par le nom de votre service ;
    • IMAGE_URL par une référence à l'image de conteneur, par exemple us-docker.pkg.dev/cloudrun/container/hello:latest. Si vous utilisez Artifact Registry, le dépôt REPO_NAME doit déjà être créé. L'URL se présente sous la forme suivante : LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • PATH par le chemin d'accès au volume et au nom de fichier du secret. Il doit commencer par une barre oblique, par exemple : /etc/secrets/dbconfig/password, où /etc/secrets/dbconfig/ représente le chemin d'accès du volume et password le nom du fichier secret.
    • PROJECT_NUMBER par le numéro du projet dans lequel le secret a été créé.
    • SECRET_NAME par le nom secret, ex. mysecret.
    • VERSION par la version de secret. Utilisez latest pour la version la plus récente, ou un nombre, par exemple 2.
    • SECRET_LOOKUP_NAME par un nom ayant une syntaxe de nom de secret valide (par exemple, my-secret), pouvant être identique à SECRET_NAME.
    • VOLUME_NAME par n'importe quel nom (par exemple my-volume), pouvant être identique à SECRET_NAME.

Afficher les paramètres des secrets

Pour afficher les paramètres actuels des secrets pour votre service Cloud Run, procédez comme suit :

Console

  1. Dans la console Google Cloud, accédez à Cloud Run :

    Accédez à Cloud Run

  2. Cliquez sur le service qui vous intéresse pour ouvrir la page Informations sur le service.

  3. Cliquez sur l'onglet Révisions.

  4. Dans le panneau de détails sur la droite, le paramètre des secrets est répertorié sous l'onglet Conteneur.

gcloud

  1. Exécutez la commande suivante :

    gcloud run services describe SERVICE
  2. Recherchez le paramètre des secrets dans la configuration renvoyée.

Utiliser des secrets dans votre code

Pour obtenir des exemples sur l'accès aux secrets de votre code en tant que variables d'environnement, reportez-vous au tutoriel sur l'authentification de l'utilisateur final, en particulier la section Gérer une configuration sensible avec Secret Manager.

Chemins et limites non autorisés

Cloud Run ne vous permet pas d'installer des secrets sur /dev, /proc et /sys, ou dans leurs sous-répertoires.

Si vous installez des secrets sur /tmp et que vous utilisez un environnement d'exécution de première génération, reportez-vous au problème connu sur l'installation de secrets sur /tmp.

Cloud Run ne vous permet pas d'installer plusieurs secrets sur le même chemin d'accès, car deux installations de volume ne peuvent pas être installées au même emplacement.

Remplacer un répertoire

Si le secret est installé en tant que volume dans Cloud Run et que le dernier répertoire du chemin d'installation du volume existe déjà, tous les fichiers ou dossiers du répertoire existant deviennent inaccessibles.

Par exemple, si un secret nommé my-secret est installé sur le chemin d'accès /etc/app_data, tout le contenu du répertoire app_data sera écrasé et le seul fichier visible est /etc/app_data/my-secret.

Pour éviter d'écraser des fichiers dans un répertoire existant, créez un nouveau répertoire pour installer le secret, par exemple /etc/app_data/secrets, afin que le chemin d'installation du secret soit /etc/app_data/secrets/my-secret.