Configurar secrets para jobs

O job pode exigir chaves de API, senhas, certificados ou outras informações sensíveis para as dependências. Para o Cloud Run, o Google recomenda armazenar essas informações sensíveis em um secret criado no Secret Manager.

Disponibilize um secret para seus contêineres de uma das seguintes maneiras:

  • Quando você monta cada secret como um volume, o Cloud Run disponibiliza o secret para o contêiner como arquivos. Ao ler um volume, o Cloud Run sempre busca o valor do secret no Secret Manager para usar o valor com a versão mais recente. Esse método também funciona bem com a rotação de secrets.
  • Transmita um secret usando variáveis de ambiente. As variáveis de ambiente são resolvidas no momento da inicialização da instância. Portanto, se você usar esse método, o Google recomenda que você fixe o secret em uma versão específica em vez de usar latest como a versão.

Para mais informações, consulte as práticas recomendadas do Secret Manager.

Como os secrets são verificados na implantação e no ambiente de execução

Durante a criação do job, o Cloud Run verifica todos os secrets que você usa. A verificação garante que a conta de serviço que executa o contêiner tenha permissão para acessar esses secrets.

Durante o tempo de execução, quando as instâncias são iniciadas:

  • Se o secret for uma variável de ambiente, o Cloud Run vai recuperar o valor dele antes de iniciar a instância. Se o processo de recuperação de secrets falhar, a instância não será iniciada.
  • Se você ativar o secret como um volume, o Cloud Run não vai realizar nenhuma verificação durante a inicialização da instância. No entanto, durante o tempo de execução, se um secret estiver inacessível, as tentativas de ler o volume montado vão falhar.

Propriedade do volume

A propriedade de um volume de secret do Cloud Run varia de acordo com o ambiente de execução e o tipo de implantação.

Quando você monta um volume de secret usando o ambiente de execução de segunda geração, que é sempre o caso de jobs, a raiz é proprietária do volume.

Antes de começar

  1. Enable the Secret Manager API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  2. Use um secret atual ou crie um no Secret Manager, conforme descrito em Criar secret.

Funções exigidas

Para receber as permissões necessárias para configurar secrets, peça ao administrador para conceder a você os papéis do IAM a seguir:

Para permitir que o Cloud Run acesse o secret, a identidade do serviço precisa ter o seguinte papel:

Para instruções sobre como adicionar o principal de identidade de serviço ao papel Acessador de Secrets do Secret Manager, consulte Gerenciar o acesso aos secrets.

Para uma lista de papéis e permissões do IAM associados ao Cloud Run, consulte Papéis do IAM do Cloud Run e Permissões do IAM do Cloud Run. Se o job do Cloud Run interagir com APIs doGoogle Cloud , como as bibliotecas de cliente do Cloud, consulte o guia de configuração de identidade de serviço. Para mais informações sobre como conceder papéis, consulte permissões de implantação e gerenciar acesso.

Tornar um secret acessível ao Cloud Run

É possível tornar um secret acessível ao job usando o console Google Cloud , a CLI do Google Cloud ou o YAML:

Console

  1. No console do Google Cloud , acesse a página de jobs do Cloud Run:

    Acessar o Cloud Run

  2. Selecione Jobs no menu e clique em Implantar contêiner para preencher a página inicial de configurações do job. Se você estiver configurando um job, selecione-o e clique em Ver e editar a configuração do job.

  3. Clique em Contêineres, Volumes, Conexões, Segurança para expandir a página de propriedades do job.

  4. Clique na guia Variáveis e secrets.

    imagem

    • Na guia "Variáveis e secrets":

      • Para expor o secret como uma variável de ambiente:

        1. Clique na guia Contêineres.
        2. Na guia Variáveis e secrets, clique em Referenciar um secret.
        3. No campo Nome 1, insira o nome da variável de ambiente.
        4. Na lista Secret, selecione o secret que você quer usar.
        5. Na lista Versão 1, selecione a versão do secret a ser referenciada.
        6. Clique em Concluído.
        7. Clique em Criar ou Implantar.
      • Para ativar o secret como um volume:

        1. Clique na guia Volumes e selecione Adicionar volume.
        2. Na lista Tipo de volume, selecione Secret.
        3. No campo Nome do volume, digite um nome ou aceite o nome padrão.
        4. Na lista Secret, selecione o secret que você quer usar.
        5. No campo Caminho 1, digite o nome do arquivo a ser ativado.
        6. Na lista Versão 1, selecione a versão do secret a ser referenciada. Por padrão, a versão mais recente é selecionada. É possível selecionar uma versão específica.
        7. Clique em Concluído.
        8. Acesse a guia Contêiner(es) para ativar o secret no contêiner.
        9. Na guia Ativações de volume, clique em Ativar volume.
        10. Na lista Nome 1, selecione o nome do volume.
        11. No campo Caminho de ativação 1, insira o caminho de ativação do secret. Esse é o diretório em que todas as versões do secret são colocadas.
        12. Clique em Concluído.
        13. Clique em Criar ou Implantar.
  5. Clique em Criar ou Atualizar.

gcloud

  • Para especificar o secret em uma variável de ambiente ao criar um novo job:

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

    Substitua:

    • JOB_NAME: o nome do job.
    • ENV_VAR_NAME: o nome da variável de ambiente a ser usada para o secret.
    • SECRET_NAME: o nome do secret no mesmo projeto. Por exemplo, mysecret.
    • VERSION: a versão do secret. Use latest para a versão mais recente ou um número, por exemplo, 2.
    • IMAGE_URL: uma referência à imagem de contêiner. Por exemplo, us-docker.pkg.dev/cloudrun/container/job:latest.

    É possível especificar vários pares de variáveis/secrets do ambiente usando uma lista separada por vírgulas.

  • Para especificar o secret em uma variável de ambiente ao atualizar um job:

    gcloud run jobs update JOB_NAME \
    --set-secrets ENV_VAR_NAME=SECRET_NAME:VERSION
  • Para montar o secret como um volume ao criar um job:

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

    Substitua:

    • JOB_NAME: o nome do job.
    • IMAGE_URL: uma referência à imagem de contêiner. Por exemplo, us-docker.pkg.dev/cloudrun/container/job:latest.
    • PATH: o caminho de ativação do volume e o nome de arquivo do secret. Ele precisa começar com uma barra inicial, por exemplo, /etc/secrets/dbconfig/password, em que /etc/secrets/dbconfig/ é o caminho de ativação do volume e password é o nome do arquivo do secret.
    • SECRET_NAME: o nome do secret no mesmo projeto. Por exemplo, mysecret.
    • VERSION: a versão do secret. Use latest para a versão mais recente ou um número, por exemplo, 2.
  • Para atualizar um secret em um job atual, siga estas etapas:

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

YAML

Devido a restrições na compatibilidade da API, os locais do secret precisam ser armazenados em uma anotação.

  1. Se você estiver criando um novo serviço, pule esta etapa. Se você estiver atualizando um serviço existente, faça o download da configuração YAML correspondente:

    gcloud run jobs describe JOB_NAME --format export > job.yaml
  2. Para secrets expostos como variáveis de ambiente:

    apiVersion: run.googleapis.com/v1
    kind: Job
    metadata:
      name: JOB
    spec:
      template:
        spec:
          template:
            spec:
              containers:
              - env:
                - name: SECRET_NAME
                  valueFrom:
                    secretKeyRef:
                      key: VERSION
                      name: SECRET_LOOKUP_NAME
                image: IMAGE_URL 

    Substitua:

    • JOB: o nome do job.
    • IMAGE_URL: uma referência à imagem de contêiner. Por exemplo, us-docker.pkg.dev/cloudrun/container/job:latest.
    • SECRET_NAME: o nome do secret. Por exemplo, mysecret.
    • VERSION: a versão do secret. Use latest para a versão mais recente ou um número, por exemplo, 2.
    • SECRET_LOOKUP_NAME: qualquer nome que tenha uma sintaxe válida de nome de secret. Por exemplo, my-secret. Pode ser o mesmo que SECRET_NAME.
  3. Para secrets montados como caminhos de arquivo:

    apiVersion: run.googleapis.com/v1
    kind: Job
    metadata:
      name: JOB_NAME
    spec:
      template:
        spec:
          template:
            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

    Substitua:

    • JOB_NAME: o nome do job.
    • IMAGE_URL: uma referência à imagem de contêiner. Por exemplo, us-docker.pkg.dev/cloudrun/container/job:latest.
    • PATH: o caminho de ativação do volume e o nome de arquivo do secret. Ele precisa começar com uma barra inicial, por exemplo, /etc/secrets/dbconfig/password, em que /etc/secrets/dbconfig/ é o caminho de ativação do volume e password é o nome do arquivo do secret.
    • PROJECT_NUMBER: o número do projeto em que o secret foi criado.
    • SECRET_NAME: o nome do secret. Por exemplo, mysecret.
    • VERSION: a versão do secret. Use latest para a versão mais recente ou um número, por exemplo, 2.
    • SECRET_LOOKUP_NAME: qualquer nome que tenha uma sintaxe válida de nome de secret. Por exemplo, my-secret. Pode ser o mesmo que SECRET_NAME.
    • VOLUME_NAME: qualquer nome, por exemplo, my-volume. Ele pode ser igual a SECRET_NAME.

Terraform

Para saber como aplicar ou remover uma configuração do Terraform, consulte Comandos básicos do Terraform.

Adicione o seguinte a um recurso google_cloud_run_v2_job na configuração do Terraform:

Para secrets expostos como variáveis de ambiente:

resource "google_cloud_run_v2_job" "default" {
  name     = "JOB_NAME"
  location = "REGION"

  template {
    template {
      containers {
        image = "IMAGE_URL"

        env {
          name = "SECRET_NAME"

          value_source {
            secret_key_ref {
              secret = "SECRET_NAME"
              version = "VERSION"
            }
          }
        }
      }
    }
  }
}

Substitua:

  • JOB_NAME: o nome do seu job do Cloud Run;
  • REGION: a Google Cloud região. Por exemplo, europe-west1.
  • IMAGE_URL: uma referência à imagem de contêiner. Por exemplo, us-docker.pkg.dev/cloudrun/container/job:latest.
  • SECRET_NAME: o nome do secret. Por exemplo, mysecret.
  • VERSION: a versão do secret. Use latest para a versão mais recente ou um número, por exemplo, 2.

Para secrets montados como caminhos de arquivo:

resource "google_cloud_run_v2_job" "default" {
  name     = "JOB_NAME"
  location = "REGION"

  template {
    template {
      containers {
        image = "IMAGE_URL"

        volume_mounts {
          name       = "VOLUME_NAME"
          mount_path = "MOUNT_PATH"
        }
      }

      volumes {
        name = "VOLUME_NAME"
        secret {
          secret = "SECRET_NAME"
        }
      }
    }
  }
}

Substitua:

  • JOB_NAME: o nome do seu job do Cloud Run;
  • REGION: a Google Cloud região. Por exemplo, europe-west1.
  • IMAGE_URL: uma referência à imagem de contêiner. Por exemplo, us-docker.pkg.dev/cloudrun/container/job:latest.
  • VOLUME_NAME: qualquer nome, por exemplo, my-volume. Pode ser igual a SECRET_NAME.
  • MOUNT_PATH: o caminho de ativação do volume e o nome de arquivo do secret. Ele precisa começar com uma barra inicial, por exemplo, /etc/secrets/dbconfig/password, em que /etc/secrets/dbconfig/ é o caminho de ativação do volume e password é o nome do arquivo do secret.
  • SECRET_NAME: o nome do secret. Por exemplo, mysecret.

Como fazer referência a secrets de outros projetos

É possível referenciar um secret de outro projeto, se a conta de serviço do seu projeto tiver permissão para acessar o secret.

Console

  1. No console do Google Cloud , acesse a página de jobs do Cloud Run:

    Acessar o Cloud Run

  2. Selecione Jobs no menu e clique em Implantar contêiner para preencher a página inicial de configurações do job. Se você estiver configurando um job, selecione-o e clique em Ver e editar a configuração do job.

  3. Clique em Contêineres, Volumes, Conexões, Segurança para expandir a página de propriedades do job.

  4. Clique na guia Variáveis e secrets.

    imagem

    • Na guia "Variáveis e secrets":

      • Para expor o secret como uma variável de ambiente:

        1. Clique na guia Contêineres.
        2. Na guia Variáveis e secrets, clique em Referenciar um secret.
        3. No campo Nome 1, insira o nome da variável de ambiente.
        4. Na lista Secret, clique em Inserir secret manualmente.
        5. Insira o ID do recurso do secret no seguinte formato:

          projects/PROJECT_NUMBER/secrets/SECRET_NAME
          

          Substitua:

          • PROJECT_NUMBER pelo número do projeto Google Cloud . Para instruções detalhadas sobre como encontrar o número do projeto, consulte Criar e gerenciar projetos.

          • SECRET_NAME: o nome do secret no Secret Manager.

        6. Na lista Versão 1, selecione a versão do secret a ser referenciada.

        7. Clique em Concluído.

        8. Clique em Criar ou Implantar.

      • Para ativar o secret como um volume:

        1. Clique na guia Volumes e selecione Adicionar volume.
        2. Na lista Tipo de volume, selecione Secret.
        3. No campo Nome do volume, digite um nome ou aceite o nome padrão.
        4. Na lista Secret, clique em Inserir secret manualmente.
        5. Insira o ID do recurso do secret no seguinte formato:

          projects/PROJECT_NUMBER/secrets/SECRET_NAME
          

          Substitua:

          • PROJECT_NUMBER pelo número do projeto Google Cloud . Para instruções detalhadas sobre como encontrar o número do projeto, consulte Criar e gerenciar projetos.

          • SECRET_NAME: o nome do secret no Secret Manager.

        6. No campo Caminho 1, digite o nome do arquivo a ser ativado.

        7. Na lista Versão 1, selecione a versão do secret a ser referenciada. Por padrão, a versão mais recente é selecionada. É possível selecionar uma versão específica.

        8. Clique em Concluído.

        9. Acesse a guia Contêiner(es) para ativar o secret no contêiner.

        10. Na guia Ativações de volume, clique em Ativar volume.

        11. Na lista Nome 1, selecione o nome do volume.

        12. No campo Caminho de ativação 1, insira o caminho de ativação do secret. Esse é o diretório em que todas as versões do secret são colocadas.

        13. Clique em Concluído.

        14. Clique em Criar ou Implantar.

  5. Clique em Criar ou Atualizar.

gcloud

  • Para montar um secret como um volume ao atualizar um job:

    gcloud run jobs update JOB_NAME \
    --image IMAGE_URL \
    --update-secrets=PATH=projects/PROJECT_NUMBER/secrets/SECRET_NAME:VERSION
    • JOB_NAME: o nome do job.
    • IMAGE_URL: uma referência à imagem de contêiner. Por exemplo, us-docker.pkg.dev/cloudrun/container/job:latest.
    • PATH: o caminho de ativação do volume e o nome de arquivo do secret. Ele precisa começar com uma barra inicial, por exemplo, /etc/secrets/dbconfig/password, em que /etc/secrets/dbconfig/ é o caminho de ativação do volume e password é o nome do arquivo do secret.
    • PROJECT_NUMBER: o número do projeto em que o secret foi criado.
    • SECRET_NAME: o nome do secret, por exemplo, mysecret.
    • VERSION: a versão do secret. Use latest para a versão mais recente ou um número, por exemplo, 2.

YAML

  1. Se você estiver criando um novo serviço, pule esta etapa. Se você estiver atualizando um serviço existente, faça o download da configuração YAML correspondente:

    gcloud run jobs describe JOB_NAME --format export > job.yaml

Devido a restrições na compatibilidade da API, os locais do secret precisam ser armazenados em uma anotação.

  1. Para secrets expostos como variáveis de ambiente:

    apiVersion: run.googleapis.com/v1
    kind: Job
    metadata:
      name: JOB
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/secrets: SECRET_LOOKUP_NAME:projects/PROJECT_NUMBER/secrets/SECRET_NAME
        spec:
          template:
            spec:
              containers:
              - env:
                - name: SECRET_NAME
                  valueFrom:
                    secretKeyRef:
                      key: VERSION
                      name: SECRET_LOOKUP_NAME
                image: IMAGE_URL 

    Substitua:

    • JOB: o nome do job.
    • IMAGE_URL: uma referência à imagem de contêiner. Por exemplo, us-docker.pkg.dev/cloudrun/container/job:latest.
    • SECRET_NAME: o nome do secret, por exemplo, mysecret.
    • VERSION: a versão do secret. Use latest para a versão mais recente ou um número, por exemplo, 2.
    • PROJECT_NUMBER: o número do projeto em que o secret foi criado.
    • SECRET_LOOKUP_NAME: qualquer nome que tenha uma sintaxe válida de nome de secret. Por exemplo, my-secret. Pode ser o mesmo que SECRET_NAME.
  2. Para secrets montados como caminhos de arquivo:

    apiVersion: run.googleapis.com/v1
    kind: Job
    metadata:
      name: JOB_NAME
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/secrets: SECRET_LOOKUP_NAME:projects/PROJECT_NUMBER/secrets/SECRET_NAME
        spec:
          template:
            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

    Substitua:

    • JOB_NAME: o nome do job.
    • IMAGE_URL: uma referência à imagem de contêiner. Por exemplo, us-docker.pkg.dev/cloudrun/container/job:latest.
    • PATH: o caminho de ativação do volume e o nome de arquivo do secret. Ele precisa começar com uma barra inicial, por exemplo, /etc/secrets/dbconfig/password, em que /etc/secrets/dbconfig/ é o caminho de ativação do volume e password é o nome do arquivo do secret.
    • PROJECT_NUMBER: o número do projeto em que o secret foi criado.
    • SECRET_NAME: o nome do secret. Por exemplo, mysecret.
    • VERSION: a versão do secret. Use latest para a versão mais recente ou um número, por exemplo, 2.
    • SECRET_LOOKUP_NAME: qualquer nome que tenha uma sintaxe válida de nome de secret, por exemplo, my-secret, pode ser igual a SECRET_NAME.
    • VOLUME_NAME: qualquer nome, por exemplo, my-volume. Ele pode ser igual a SECRET_NAME.

Terraform

Para saber como aplicar ou remover uma configuração do Terraform, consulte Comandos básicos do Terraform.

Adicione o seguinte a um recurso google_cloud_run_v2_job na configuração do Terraform:

Para secrets expostos como variáveis de ambiente:

resource "google_cloud_run_v2_job" "default" {
  name     = "JOB_NAME"
  location = "REGION"

  template {
    template {
      containers {
        image = "IMAGE_URL"
        env {
          name = "SECRET_NAME"
          value_source {
            secret_key_ref {
              secret = "projects/PROJECT_ID/secrets/SECRET_NAME"
              version = "VERSION"
            }
          }
        }
      }
    }
  }
}

Substitua:

  • JOB_NAME: o nome do seu job do Cloud Run;
  • REGION: a Google Cloud região. Por exemplo, europe-west1.
  • IMAGE_URL: uma referência à imagem de contêiner. Por exemplo, us-docker.pkg.dev/cloudrun/container/job:latest.
  • SECRET_NAME: o nome do secret. Por exemplo, mysecret.
  • PROJECT_ID: o ID do projeto em que o secret foi criado.
  • VERSION: a versão do secret. Use latest para a versão mais recente ou um número, por exemplo, 2.

Para secrets montados como caminhos de arquivo:

resource "google_cloud_run_v2_job" "default" {
  name     = "JOB_NAME"
  location = "REGION"

  template {
    template {
      containers {
        image = "IMAGE_URL"

        volume_mounts {
          name       = "VOLUME_NAME"
          mount_path = "MOUNT_PATH"
        }
      }

      volumes {
        name = "VOLUME_NAME"
        secret {
          secret = "projects/PROJECT_ID/secrets/SECRET_NAME"
        }
      }
    }
  }
}

Substitua:

  • JOB_NAME: o nome do seu job do Cloud Run;
  • REGION: a região Google Cloud , por exemplo, europe-west1.
  • IMAGE_URL: uma referência à imagem de contêiner. Por exemplo, us-docker.pkg.dev/cloudrun/container/job:latest.
  • VOLUME_NAME: qualquer nome, por exemplo, my-volume. Pode ser o mesmo que SECRET_NAME.
  • MOUNT_PATH: o caminho de ativação do volume e o nome de arquivo do secret. Ele precisa começar com uma barra inicial, por exemplo, /etc/secrets/dbconfig/password, em que /etc/secrets/dbconfig/ é o caminho de ativação do volume e password é o nome do arquivo do secret.
  • PROJECT_ID: o ID do projeto em que o secret foi criado.
  • SECRET_NAME: o nome do secret. Por exemplo, mysecret.

Ver configurações de secrets

Para ver as configurações de secrets atuais do seu job do Cloud Run, faça o seguinte:

Console

  1. No console do Google Cloud , acesse a página de jobs do Cloud Run:

    Acessar jobs do Cloud Run

  2. Clique no job em que você tem interesse para abrir a página Detalhes do job.

  3. Clique em Ler e editar a configuração do job.

  4. Localize a definição dos secrets nos detalhes da configuração.

gcloud

  1. Use o comando a seguir:

    gcloud run jobs describe JOB_NAME
  2. Localize a configuração de secret na configuração retornada.

Caminhos e limitações não permitidos

As seguintes limitações se aplicam à montagem de secrets:

  • O Cloud Run não permite ativar secrets em /dev, /proc e /sys, ou nos subdiretórios.
  • O Cloud Run não permite ativar vários secrets no mesmo caminho porque duas ativações de volume não podem ser montadas no mesmo local.

Substituição de um diretório

Se o secret for montado como um volume no Cloud Run e o último diretório no caminho de montagem do volume já existir, todos os arquivos ou pastas no diretório atual ficarão inacessíveis.

Por exemplo, se um secret chamado my-secret for ativado no caminho /etc/app_data, todo o conteúdo dentro do diretório app_data será substituído, e o único arquivo visível será /etc/app_data/my-secret.

Para evitar a substituição de arquivos em um diretório atual, crie um novo diretório para ativar o secret, por exemplo, /etc/app_data/secrets, de modo que o caminho de ativação do secret seja /etc/app_data/secrets/my-secret.