Utiliser des secrets

Votre service ou votre tâche peut nécessiter des dépendances de clés API, de mots de passe 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

Lors du déploiement du service ou de la création de la tâche, tous les secrets utilisés, qu'ils soient des 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 ou la création de la tâche é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.

Autoriser Cloud Run à accéder à un secret

Vous pouvez utiliser un secret de Secret Manager existant ou en créer un nouveau. Toutefois, pour autoriser un service Cloud Run à accéder au secret, vous devez attribuer le rôle Accesseur de secrets de Secret Manager au compte de service Cloud Run :

  1. Accédez à la page Secret Manager dans la console.

  2. Sélectionnez le secret, puis cliquez sur Ajouter une entité principale dans l'onglet des autorisations situé à droite.

  3. Dans la zone de texte Nouvelles entités principales, saisissez l'adresse e-mail du compte de service pour votre service Cloud Run.

  4. Attribuez-lui le rôle Accesseur de secrets de Secret Manager.

Rendre un secret accessible à Cloud Run

Vous pouvez mettre des secrets à la disposition des services et des tâches.

Pour les services 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, 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 :

Console

  1. Accédez à Cloud Run

  2. Cliquez sur Créer un service si vous configurez un nouveau service sur lequel effectuer un déploiement. Si vous configurez un service existant, cliquez sur celui-ci puis sur Modifier et déployer la nouvelle révision.

  3. Si vous configurez un nouveau service, renseignez la page de paramètres initiale du service selon vos besoins, puis cliquez sur Suivant > Conteneur, variables et secrets, connexions, sécurité pour accéder à la page de configuration du service.

  4. Cliquez sur l'onglet Variables et secrets.

    image

  5. Dans l'onglet "Variables et secrets" :

    • Sous Secrets, cliquez sur Référencer un secret.
    • Sélectionnez le secret que vous souhaitez utiliser dans la liste déroulante Secret.
    • Dans le menu déroulant Méthode de référence, sélectionnez la manière dont vous souhaitez utiliser votre secret, installé en tant que volume ou exposé en tant que variables d'environnement.
    • Si vous installez le secret en tant que volume,
      1. Sous Chemin d'installation, spécifiez le chemin d'installation que vous utilisez pour les secrets.
      2. La dernière version est sélectionnée par défaut. Si vous le souhaitez, vous pouvez sélectionner une version spécifique. Dans Chemins spécifiés pour les versions des secrets, spécifiez le chemin d'accès à la version et le numéro de version.
      3. Cliquez sur OK.
    • Si vous exposez le secret en tant que variable d'environnement :
      1. Indiquez le Nom de la variable et sélectionnez la version de secret, ou la plus récente pour utiliser systématiquement la version de secret actuelle.
      2. Cliquez sur OK.

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

Ligne de commande

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 du conteneur, par exemple us-docker.pkg.dev/cloudrun/container/hello:latest ;
    • 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 du conteneur, par exemple us-docker.pkg.dev/cloudrun/container/hello:latest ;
    • 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

Vous pouvez télécharger et afficher la configuration de service existante à l'aide de la commande gcloud run services describe --format export, qui renvoie les résultats nettoyés au format YAML. Vous pouvez ensuite modifier les champs décrits ci-dessous et importer le fichier YAML modifié à l'aide de la commande gcloud run services replace. Veillez à ne modifier que les champs indiqués.

  1. Pour afficher et télécharger la configuration, exécutez la commande suivante :

    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 du conteneur, par exemple us-docker.pkg.dev/cloudrun/container/hello:latest ;
    • 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 utilisant la commande suivante :

    gcloud run services replace service.yaml

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

Vous pouvez référencer un secret provenant d'un autre projet si le compte de service de votre projet a été autorisé à accéder au secret.

Console

  1. Accédez à Cloud Run

  2. Cliquez sur Créer un service si vous configurez un nouveau service sur lequel effectuer un déploiement. Si vous configurez un service existant, cliquez sur celui-ci puis sur Modifier et déployer la nouvelle révision.

  3. Si vous configurez un nouveau service, renseignez la page de paramètres initiale du service selon vos besoins, puis cliquez sur Suivant > Conteneur, variables et secrets, connexions, sécurité pour accéder à la page de configuration du service.

  4. Cliquez sur l'onglet Variables et secrets.

    image

  5. Dans l'onglet "Variables et secrets" :

    • Sous Secrets, cliquez sur Référencer un secret.
    • Sélectionnez Vous ne voyez pas votre secret ? Saisissez votre ID de ressource secret dans la liste déroulante Secret pour afficher le formulaire suivant :

      Secrets inter-projets

    • Dans le formulaire Ajouter un secret par ID de ressource, saisissez le secret de l'autre projet au format projects/PROJECT_NUMBER/secrets/SECRET_NAME. Vous pouvez également copier et coller l'ID de ressource de l'autre projet si vous y avez accès en sélectionnant le secret, en cliquant sur les points de suspension Actions à droite du secret, puis en sélectionnant Copier l'ID de ressource dans le menu déroulant.
    • Cliquez sur Ajouter un secret.
    • Dans le menu déroulant Méthode de référence, sélectionnez la manière dont vous souhaitez utiliser votre secret, installé en tant que volume ou exposé en tant que variables d'environnement.
    • Si vous installez le secret en tant que volume,
      1. Sous Chemin d'installation, spécifiez le chemin d'installation que vous utilisez pour les secrets.
      2. La dernière version est sélectionnée par défaut. Si vous le souhaitez, vous pouvez sélectionner une version spécifique. Dans Chemins spécifiés pour les versions des secrets, spécifiez le chemin d'accès à la version et le numéro de version.
      3. Cliquez sur OK.
    • Si vous exposez le secret en tant que variable d'environnement :
      1. Indiquez le Nom de la variable et sélectionnez la version de secret, ou la plus récente pour utiliser systématiquement la version de secret actuelle.
      2. Cliquez sur OK.

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

Ligne de commande

  • 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 du conteneur, par exemple us-docker.pkg.dev/cloudrun/container/hello:latest ;
    • 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

Vous pouvez télécharger et afficher la configuration de service existante à l'aide de la commande gcloud run services describe --format export, qui renvoie les résultats nettoyés au format YAML. Vous pouvez ensuite modifier les champs décrits ci-dessous et importer le fichier YAML modifié à l'aide de la commande gcloud run services replace. Veillez à ne modifier que les champs indiqués.

  1. Pour afficher et télécharger la configuration, exécutez la commande suivante :

    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:
          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 du conteneur, par exemple us-docker.pkg.dev/cloudrun/container/hello:latest ;
    • 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:
          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 du conteneur, par exemple us-docker.pkg.dev/cloudrun/container/hello:latest ;
    • 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.

Pour les tâches Cloud Run

Vous pouvez rendre un secret accessible à votre tâche à l'aide de la console ou de Google Cloud CLI :

Console

  1. Accédez à Cloud Run

  2. Si vous configurez une nouvelle tâche, cliquez sur l'onglet Tâches et remplissez la page des paramètres initiaux de la tâche selon vos besoins. Si vous configurez une tâche existante, cliquez sur celle-ci, puis sur Modifier.

  3. Cliquez sur Conteneur, Variables, Connexions, Sécurité pour développer la page des propriétés de la tâche.

  4. Cliquez sur l'onglet Variables et secrets.

    Image

  5. Dans l'onglet "Variables et secrets" :

    • Sous Secrets, cliquez sur Référencer un secret.
    • Sélectionnez le secret que vous souhaitez utiliser dans la liste déroulante Secret.
    • Dans le menu déroulant Méthode de référence, sélectionnez la manière dont vous souhaitez utiliser votre secret, installé en tant que volume ou exposé en tant que variables d'environnement.
    • Si vous installez le secret en tant que volume,
      1. Sous Chemin d'installation, spécifiez le chemin d'installation que vous utilisez pour les secrets.
      2. La dernière version est sélectionnée par défaut. Si vous le souhaitez, vous pouvez sélectionner une version spécifique. Dans Chemins spécifiés pour les versions des secrets, spécifiez le chemin d'accès à la version et le numéro de version.
      3. Cliquez sur OK.
    • Si vous exposez le secret en tant que variable d'environnement :
      1. Indiquez le Nom de la variable et sélectionnez la version de secret, ou la plus récente pour utiliser systématiquement la version de secret actuelle.
      2. Cliquez sur OK.

  6. Cliquez sur Créer ou Mettre à jour.

Command line

  • Pour spécifier le secret dans une variable d'environnement lors de la création d'une tâche, procédez comme suit :

    gcloud beta run jobs create JOB_NAME \
    --image IMAGE_URL \
    --set-secrets ENV_VAR_NAME=SECRET_NAME:VERSION

    Remplacer

    • JOB_NAME par le nom de votre tâche.
    • ENV_VAR_NAME par le nom de la variable d'environnement à utiliser pour 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.
    • Remplacez IMAGE_URL par une référence à l'image de conteneur, par exemple us-docker.pkg.dev/cloudrun/container/job:latest.

    Vous pouvez spécifier plusieurs paires variable d'environnement/secret, en utilisant une liste délimitée par des virgules.

  • Pour spécifier le secret dans une variable d'environnement lors de la mise à jour d'une tâche, procédez comme suit :

    gcloud beta run jobs update JOB_NAME \
    --set-secrets ENV_VAR_NAME=SECRET_NAME:VERSION
  • Pour installer le secret en tant que volume lors de la création d'une tâche, procédez comme suit :

    gcloud beta run jobs create JOB_NAME \
    --image IMAGE_URL \
    --set-secrets=PATH=SECRET_NAME:VERSION

    Remplacez :

    • JOB_NAME par le nom de votre tâche.
    • IMAGE_URL par une référence à l'image du conteneur, par exemple us-docker.pkg.dev/cloudrun/container/job:latest ;
    • 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 mettre à jour un secret dans une tâche existante, procédez comme suit :

    gcloud beta run jobs update JOB_NAME \
    --update-secrets=PATH=SECRET_NAME:VERSION

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. 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 Variables et secrets.

Ligne de commande

  1. Exécutez la commande suivante :

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

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

Console

  1. Accéder aux tâches Cloud Run

  2. Cliquez sur la tâche qui vous intéresse pour ouvrir la page Informations sur la tâche.

  3. Cliquez sur l'onglet Configuration.

  4. Localisez le paramètre des secrets dans les détails de la configuration.

Command line

  1. Exécutez la commande suivante :

    gcloud beta run jobs describe JOB_NAME
  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.