Configura i secret

Il servizio potrebbe dover avere dipendenze che richiedono chiavi API, password o altre informazioni sensibili. Per Cloud Run, Google consiglia di archiviare questo tipo di informazioni sensibili in un secret creato in Secret Manager.

Puoi rendere un secret disponibile per i tuoi container in due modi:

  • Monta ogni secret come volume, in modo da rendere il secret disponibile al container come file. La lettura di un volume recupera sempre il valore del secret da Secret Manager, in modo che possa essere utilizzato con la versione più recente. Questo metodo funziona bene anche con la rotazione dei secret.
  • Passa un secret utilizzando le variabili di ambiente. Le variabili di ambiente vengono risolte al momento dell'avvio dell'istanza, quindi se utilizzi questo metodo, Google consiglia di bloccare il secret su una determinata versione anziché utilizzare il valore più recente.

Per saperne di più, consulta il documento sulle best practice di Secret Manager.

Come vengono controllati i secret durante il deployment e il runtime

Durante il deployment del servizio, tutti i secret utilizzati, che siano variabile di ambiente o montati come volume, vengono controllati per garantire che l'account di servizio utilizzato per eseguire il container vi abbia accesso. Se un controllo non va a buon fine, il deployment del servizio non va a buon fine.

Durante il runtime, all'avvio delle istanze:

  • Se il secret è una variabile di ambiente, il suo valore viene recuperato prima di avviare l'istanza. Di conseguenza, se il recupero del secret non va a buon fine, l'istanza non viene avviata.
  • Se il secret viene montato come volume, non viene eseguito alcun controllo durante l'avvio dell'istanza. Tuttavia, se un secret non è accessibile durante il runtime, i tentativi di lettura del volume montato non andranno a buon fine.

La proprietà dei volumi varia in base all'ambiente di esecuzione e al tipo di deployment

Quando installi un volume, l'identità proprietaria dei file e delle directory varia a seconda dell'ambiente di esecuzione del carico di lavoro e del fatto che il deployment sia costituito da uno o più container.

Nell'ambiente di esecuzione di prima generazione in cui esegui il deployment di un singolo container, il volume è di proprietà dell'identità utilizzata per il container. In tutti gli altri casi, il volume è di proprietà dell'account root. Include:

  • Ambiente di esecuzione di prima generazione in cui esegui il deployment di più container
  • L'ambiente di seconda generazione

Consenti a Cloud Run di accedere a un secret

Puoi utilizzare un secret di Secret Manager esistente o crearne uno nuovo. Tuttavia, per accedere al secret, devi concedere il ruolo Funzione di accesso ai secret di Secret Manager all'account di servizio utilizzato per la tua identità di servizio Cloud Run.

Quando selezioni un secret dalla pagina Cloud Run nella console Google Cloud, viene eseguito automaticamente un controllo delle autorizzazioni e ti viene chiesto di aggiungere eventuali autorizzazioni mancanti.

Per eseguire questa azione manualmente:

  1. Vai alla pagina di Secret Manager nella console Google Cloud:

    Vai a Secret Manager

  2. Fai clic sul secret nell'elenco

  3. Nella scheda Autorizzazione, fai clic su Concedi accesso.

  4. Nella casella di testo Nuove entità, inserisci l'indirizzo email dell'identità del servizio Cloud Run.

  5. Concedigli il ruolo di Accessore ai secret di Secret Manager.

Rendi un secret accessibile a Cloud Run

Qualsiasi modifica alla configurazione comporta la creazione di una nuova revisione. Anche per le revisioni successive verrà applicata automaticamente questa impostazione di configurazione, a meno che non apporti aggiornamenti espliciti per modificarla.

Puoi rendere un secret accessibile al tuo servizio utilizzando la console Google Cloud, Google Cloud CLI o un file YAML quando esegui il deployment di un nuovo servizio o aggiorni un servizio esistente ed esegui il deployment di una revisione:

Console

  1. Nella console Google Cloud, vai a Cloud Run:

    Vai a Cloud Run

  2. Fai clic su Crea servizio se stai configurando un nuovo servizio in cui stai eseguendo il deployment. Se stai configurando un servizio esistente, fai clic sul servizio e poi su Modifica ed esegui il deployment di nuova revisione.

  3. Se stai configurando un nuovo servizio, compila la pagina iniziale delle impostazioni del servizio in base alle tue esigenze, quindi fai clic su Container, volumi, networking, sicurezza per espandere la pagina di configurazione del servizio.

  4. Fai clic sulla scheda Contenitore.

    immagine

    • In Secret:
      • Fai clic su Riferimento a un secret.
      • Seleziona il secret che vuoi utilizzare dall'elenco a discesa Secret.
      • Nel menu a discesa Metodo di riferimento, seleziona in che modo vuoi utilizzare il secret, montato come volume o esposto come variabili di ambiente.
      • Se stai montando il secret come volume:
        1. In Percorso di montaggio, specifica il percorso di montaggio che utilizzi per i secret.
        2. Per impostazione predefinita, è selezionata la versione più recente. Se vuoi, puoi selezionare una versione specifica. In Percorsi specificati per le versioni dei secret, specifica il percorso della versione e il numero della versione.
        3. Fai clic su Fine.
      • Se stai esponendo il secret come variabile di ambiente:
        1. Fornisci il nome della variabile e seleziona la versione del secret o la versione più recente per utilizzare sempre la versione corrente del secret.
        2. Fai clic su Fine.
  5. Fai clic su Crea o Esegui il deployment.

Riga di comando

Per rendere un secret accessibile al tuo servizio, inserisci uno dei seguenti comandi.

  • Per montare il secret come volume durante il deployment di un servizio:

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

    Sostituisci:

    • SERVICE con il nome del servizio.
    • IMAGE_URL con un riferimento all'immagine container, ad esempio us-docker.pkg.dev/cloudrun/container/hello:latest. Se utilizzi Artifact Registry, è necessario già creare il repository REPO_NAME. L'URL ha la forma LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • PATHcon il percorso di montaggio del volume e il nome file del secret. Deve iniziare con una barra iniziale, ad esempio: /etc/secrets/dbconfig/password, dove /etc/secrets/dbconfig/ è il percorso di montaggio del volume e password è il nome file del secret.
    • SECRET_NAME con il nome del secret nello stesso progetto, ad esempio mysecret.
    • VERSION con la versione del secret. Utilizza latest per la versione più recente o un numero, ad esempio 2.
  • Per esporre il secret come variabile di ambiente durante il deployment di un servizio:

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

    Sostituisci:

    • SERVICE con il nome del servizio.
    • IMAGE_URL con un riferimento all'immagine container, ad esempio us-docker.pkg.dev/cloudrun/container/hello:latest. Se utilizzi Artifact Registry, è necessario già creare il repository REPO_NAME. L'URL ha la forma LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • ENV_VAR_NAME con il nome della variabile di ambiente che vuoi utilizzare con il secret.
    • SECRET_NAME con il nome del secret nello stesso progetto, ad esempio mysecret.
    • VERSION con la versione del secret. Utilizza latest per la versione più recente o un numero, ad esempio 2.
  • Puoi aggiornare più secret contemporaneamente. A questo scopo, separa le opzioni di configurazione per ogni secret con una virgola. Il comando seguente aggiorna un secret montato come volume e un altro secret esposto come variabile di ambiente.

    Per aggiornare i secret esistenti, inserisci il seguente comando:

    gcloud run deploy SERVICE --image IMAGE_URL \
    --update-secrets=PATH=SECRET_NAME:VERSION,ENV_VAR_NAME=SECRET_NAME:VERSION
    
  • Per cancellare i secret esistenti e rendere un nuovo secret accessibile al servizio, utilizza il flag --set-secrets:

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

YAML

Puoi scaricare e visualizzare le configurazioni di servizio esistenti utilizzando il comando gcloud run services describe --format export, che restituisce risultati puliti in formato YAML. Puoi quindi modificare i campi descritti di seguito e caricare il file YAML modificato utilizzando il comando gcloud run services replace. Assicurati di modificare i campi solo come documentato.

  1. Per visualizzare e scaricare la configurazione:

    gcloud run services describe SERVICE --format export > service.yaml
  2. Per i secret esposti come variabili di ambiente, in env, aggiorna ENV_VAR, VERSION e/o SECRET_NAME come preferisci. Se hai più secret montati come variabili di ambiente, avrai più di questi attributi.

    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. Per i secret montati come percorsi dei file, aggiorna MOUNT_PATH, VOLUME_NAME, VERSION, FILENAME e/o SECRET_NAME in base alle tue esigenze. Se hai più secret montati come percorsi di file, avrai più di questi attributi.

    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

    Tieni presente che VOLUME_NAME può essere impostato su qualsiasi nome.

    Sostituisci

    • SERVICE con il nome del tuo servizio Cloud Run
    • IMAGE_URL con un riferimento all'immagine container, ad esempio us-docker.pkg.dev/cloudrun/container/hello:latest. Se utilizzi Artifact Registry, è necessario già creare il repository REPO_NAME. L'URL ha la forma LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • REVISION con un nuovo nome di revisione oppure eliminala (se presente). Se specifichi un nuovo nome, la revisione deve soddisfare i seguenti criteri:
      • Inizia con SERVICE-
      • Contiene solo lettere minuscole, numeri e -
      • Non termina con -
      • Non supera i 63 caratteri
  4. Sostituisci il servizio con la nuova configurazione utilizzando il seguente comando:

    gcloud run services replace service.yaml

Terraform

  1. Creare un secret e una versione del secret.

    
    terraform {
      required_providers {
        google = {
          source  = "hashicorp/google"
          version = "~> 5.13.0"
        }
      }
    }
    
    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. Crea un account di servizio e concedi l'accesso al 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. È possibile accedere ai secret di Secret Manager da Cloud Run come percorsi di file montati o come variabili di ambiente.

    1. Per i secret montati come percorsi dei file, fai riferimento alla risorsa Secret Manager nel parametro volumes. name corrisponde a una voce nel parametro volume_mounts:

      resource "google_cloud_run_v2_service" "mounted_secret" {
        name     = "cloudrun-srv-mounted-secret"
        location = "us-central1"
        ingress  = "INGRESS_TRAFFIC_ALL"
      
        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. Per i secret esposti come variabili di ambiente, fai riferimento alla risorsa Secret Manager nel parametro env:

      resource "google_cloud_run_v2_service" "env_variable_secret" {
        name     = "cloudrun-srv-env-var-secret"
        location = "us-central1"
        ingress  = "INGRESS_TRAFFIC_ALL"
      
        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]
      }

Riferimento ai secret di altri progetti

Puoi fare riferimento a un secret di un altro progetto, se all'account di servizio del progetto è stato consentito l'accesso al secret.

Console

  1. Nella console Google Cloud, vai a Cloud Run:

    Vai a Cloud Run

  2. Fai clic su Crea servizio se stai configurando un nuovo servizio in cui stai eseguendo il deployment. Se stai configurando un servizio esistente, fai clic sul servizio e poi su Modifica ed esegui il deployment di nuova revisione.

  3. Se stai configurando un nuovo servizio, compila la pagina iniziale delle impostazioni del servizio in base alle tue esigenze, quindi fai clic su Container, volumi, networking, sicurezza per espandere la pagina di configurazione del servizio.

  4. Fai clic sulla scheda Contenitore.

    immagine

    • In Secret:
      • Fai clic su Riferimento a un secret.
      • Seleziona Non vedi il tuo secret? Inserisci l'ID risorsa del secret dall'elenco a discesa Secret per visualizzare il seguente modulo:

        Secret tra progetti

      • Nel modulo Add a secret by resource ID (Aggiungi un secret tramite ID risorsa), inserisci il secret dell'altro progetto nel formato projects/PROJECT_NUMBER/secrets/SECRET_NAME. In alternativa, puoi copiare e incollare l'ID risorsa dall'altro progetto se hai accesso, selezionando il secret, facendo clic sui puntini di sospensione Azioni a destra del secret e selezionando Copia ID risorsa dal menu a discesa.
      • Fai clic su Aggiungi secret.
      • Nel menu a discesa Metodo di riferimento, seleziona il modo in cui vuoi utilizzare il secret, montato come volume o esposto come variabili di ambiente.
      • Se stai montando il secret come volume:
        1. In Percorso di montaggio, specifica il percorso di montaggio che utilizzi per i secret.
        2. Per impostazione predefinita, è selezionata la versione più recente. Se vuoi, puoi selezionare una versione specifica. In Percorsi specificati per le versioni dei secret, specifica il percorso della versione e il numero della versione.
        3. Fai clic su Fine.
      • Se stai esponendo il secret come variabile di ambiente:
        1. Fornisci il nome della variabile e seleziona la versione del secret o la versione più recente per utilizzare sempre la versione corrente del secret.
        2. Fai clic su Fine.
  5. Fai clic su Crea o Esegui il deployment.

Riga di comando

  • Per montare un secret come volume durante il deployment di un servizio:

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

    Sostituisci:

    • SERVICE con il nome del servizio.
    • IMAGE_URL con un riferimento all'immagine container, ad esempio us-docker.pkg.dev/cloudrun/container/hello:latest. Se utilizzi Artifact Registry, è necessario già creare il repository REPO_NAME. L'URL ha la forma LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • PATHcon il percorso di montaggio del volume e il nome file del secret. Deve iniziare con una barra iniziale, ad esempio: /etc/secrets/dbconfig/password, dove /etc/secrets/dbconfig/ è il percorso di montaggio del volume e password è il nome file del secret.
    • PROJECT_NUMBER con il numero del progetto in cui è stato creato il secret.
    • SECRET_NAME con il nome del secret, ad esempio mysecret.
    • VERSION con la versione del secret. Utilizza latest per la versione più recente o un numero, ad esempio 2.

YAML

Puoi scaricare e visualizzare le configurazioni di servizio esistenti utilizzando il comando gcloud run services describe --format export, che restituisce risultati puliti in formato YAML. Puoi quindi modificare i campi descritti di seguito e caricare il file YAML modificato utilizzando il comando gcloud run services replace. Assicurati di modificare i campi solo come documentato.

  1. Per visualizzare e scaricare la configurazione:

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

A causa di vincoli relativi alla compatibilità delle API, le località dei secret devono essere archiviate in un'annotazione.

  1. Per i secret esposti come variabili di ambiente:

    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

    Sostituisci:

    • SERVICE con il nome del servizio.
    • IMAGE_URL con un riferimento all'immagine container, ad esempio us-docker.pkg.dev/cloudrun/container/hello:latest. Se utilizzi Artifact Registry, è necessario già creare il repository REPO_NAME. L'URL ha la forma LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • ENV_VAR
    • PROJECT_NUMBER con il numero del progetto in cui è stato creato il secret.
    • SECRET_NAME con il nome del secret, ad esempio mysecret.
    • VERSION con la versione del secret. Utilizza latest per la versione più recente o un numero, ad esempio 2.
    • SECRET_LOOKUP_NAME con qualsiasi nome con una sintassi del nome del secret valida (ad es. my-secret), può essere uguale a SECRET_NAME
  2. Per i secret montati come percorsi di file:

    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

    Sostituisci:

    • SERVICE con il nome del servizio.
    • IMAGE_URL con un riferimento all'immagine container, ad esempio us-docker.pkg.dev/cloudrun/container/hello:latest. Se utilizzi Artifact Registry, è necessario già creare il repository REPO_NAME. L'URL ha la forma LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • PATHcon il percorso di montaggio del volume e il nome file del secret. Deve iniziare con una barra iniziale, ad esempio: /etc/secrets/dbconfig/password, dove /etc/secrets/dbconfig/ è il percorso di montaggio del volume e password è il nome file del secret.
    • PROJECT_NUMBER con il numero del progetto in cui è stato creato il secret.
    • SECRET_NAME con il nome del secret, ad esempio mysecret.
    • VERSION con la versione del secret. Utilizza latest per la versione più recente o un numero, ad esempio 2.
    • SECRET_LOOKUP_NAME con qualsiasi nome con una sintassi del nome del secret valida (ad es. my-secret), può essere uguale a SECRET_NAME
    • VOLUME_NAME con qualsiasi nome (ad es. my-volume), può essere uguale a SECRET_NAME

Visualizza le impostazioni dei secret

Per visualizzare le impostazioni attuali dei secret per il tuo servizio Cloud Run:

Console

  1. Nella console Google Cloud, vai a Cloud Run:

    Vai a Cloud Run

  2. Fai clic sul servizio che ti interessa per aprire la pagina Dettagli servizio.

  3. Fai clic sulla scheda Revisioni.

  4. Nel riquadro dei dettagli sulla destra, l'impostazione dei secret è elencata nella scheda Contenitore.

Riga di comando

  1. Utilizza il seguente comando:

    gcloud run services describe SERVICE
  2. Individua l'impostazione dei secret nella configurazione restituita.

Utilizza i secret nel codice

Per esempi di accesso ai secret nel codice come variabili di ambiente, fai riferimento al tutorial sull'autenticazione degli utenti finali, in particolare la sezione Gestione della configurazione sensibile con Secret Manager.

Percorsi e limitazioni non consentiti

Cloud Run non consente di montare i secret in /dev, /proc e /sys o nelle relative sottodirectory.

Se stai montando secret su /tmp e utilizzi l'ambiente di esecuzione di prima generazione, consulta il problema noto relativo al montaggio dei secret su /tmp.

Cloud Run non consente di montare più secret nello stesso percorso perché non è possibile montare due montaggi di volumi nella stessa posizione.

Override di una directory

Se il secret viene montato come volume in Cloud Run e l'ultima directory nel percorso di montaggio del volume esiste già, tutti i file o le cartelle nella directory esistente diventeranno inaccessibili.

Ad esempio, se un secret chiamato my-secret viene montato nel percorso /etc/app_data, tutti i contenuti all'interno della directory app_data verranno sovrascritti. Per evitare di sovrascrivere una directory esistente, fornisci un percorso che crei una nuova directory, ad esempio /etc/app_data/secrets. Verrà creato un percorso di montaggio /etc/app_data/secrets/my-secret che conterrà il secret.