Usar autenticação com destinos HTTP

O Cloud Scheduler poderá chamar destinos HTTP que exigem autenticação se você tiver configurado uma conta de serviço associada que tenha as credenciais apropriadas.

Configurar a conta de serviço

  1. Se você ainda não tiver uma conta de serviço que queira usar para jobs do Cloud Scheduler com destinos HTTP, crie uma nova conta de serviço. Observações:

    • A conta de serviço precisa pertencer ao projeto em que o job do Cloud Scheduler foi criado.

    • Não use o agente de serviço do Cloud Scheduler (service-YOUR_PROJECT_NUMBER@gcp-sa-cloudscheduler.iam.gserviceaccount.com). Ele não pode ser usado para essa finalidade.

    • Não revogue o papel de agente de serviço do Cloud Scheduler (roles/cloudscheduler.serviceAgent) do agente de serviço do Cloud Scheduler no projeto. Isso resulta em respostas 403 aos endpoints que exigem autenticação, mesmo que a conta de serviço do job tenha o papel apropriado.

  2. Se o destino estiver dentro do Google Cloud, conceda os papéis do IAM necessários à conta de serviço. Cada serviço no Google Cloud requer um papel específico, e o serviço de recebimento verifica automaticamente o token gerado. Por exemplo, para funções do Cloud Run e do Cloud Functions de segunda geração, é preciso adicionar o papel Cloud Run Invoker.

    Para implantar um recurso com uma conta de serviço gerenciado pelo usuário, o implantador precisa ter a permissão iam.serviceAccounts.actAs para essa conta de serviço. Se você criou a conta de serviço, receberá automaticamente essa permissão. Caso contrário, alguém que tenha as permissões corretas precisará conceder essa permissão na conta de serviço.

    Prática recomendada: na etapa anterior, se você criou uma conta de serviço especificamente para invocar o serviço a que o job do Cloud Scheduler se destina, considere seguir o princípio de privilégio mínimo (prática recomendada de segurança) vinculando a conta e a permissão do invocador ao serviço de destino. É possível fazer isso usando o console do Google Cloud ou a CLI gcloud:

    Console

    1. Abra o console do Google Cloud.

    Acesse o console

    2. Selecione o projeto.

    3. Navegue até a página do tipo de recurso que você está chamando. Por exemplo, se você estiver invocando um serviço do Cloud Run, acesse a página que lista os serviços do Cloud Run.

    4. Marque a caixa de seleção à esquerda do serviço que você quer invocar. (Não clique no próprio serviço.)

    5. Clique na guia Permissões. Se o painel de informações não estiver visível, clique em Mostrar painel de informações e, em seguida, clique em Permissões.

    6. Clique em Adicionar principal.

    7. Em Adicionar principais, insira o endereço de e-mail da conta de serviço que você criou.

    8. Em Atribuir papéis, selecione um papel para conceder na lista suspensa. Siga o princípio de privilégio mínimo escolhendo o papel que inclui apenas as permissões necessárias ao principal.

    9. Clique em Salvar.

    gcloud

    Execute o comando add-iam-policy-binding:

    gcloud RESOURCE_TYPE add-iam-policy-binding RESOURCE_ID \
    --member=PRINCIPAL --role=ROLE
    

    Substitua:

    • RESOURCE_TYPE: o tipo de recurso do destino. Por exemplo, run para um destino do Cloud Run.
    • RESOURCE_ID: o identificador do destino. Por exemplo, o nome do serviço de um destino do Cloud Run.
    • PRINCIPAL: o identificador da conta de serviço. Ele tem o seguinte formato: serviceAccount:SERVICE_ACCOUNT_EMAIL_ADDRESS. Por exemplo, serviceAccount:my-service-account@my-project.iam.gserviceaccount.com.
    • ROLE: o nome do papel que o serviço de destino requer para invocação. Por exemplo, roles/run.invoker para um destino do Cloud Run ou de segunda geração do Cloud Functions.

    Exemplos:

    • Destino do Cloud Run: o comando a seguir concede o papel Invocador do Cloud Run à conta de serviço my-service-account@my-project.iam.gserviceaccount.com para o serviço my-service do Cloud Run:

      gcloud run add-iam-policy-binding my-service \
       --member=serviceAccount:my-service-account@my-project.iam.gserviceaccount.com \
       --role=roles/run.invoker
      
    • Destino do Cloud Functions: o comando a seguir concede o papel Invocador do Cloud Run exigido pelas funções do Cloud Functions de segunda geração à conta de serviço my-service-account@my-project.iam.gserviceaccount.com para a função my-gen2-function de segunda geração do Cloud Functions:

      gcloud functions add-iam-policy-binding my-gen2-function \
       --member=serviceAccount:my-service-account@my-project.iam.gserviceaccount.com \
       --role=roles/run.invoker --gen2
      
  3. Se o destino estiver fora do Google Cloud, o serviço de recebimento precisará verificar o token manualmente.

  4. A conta de serviço padrão do Cloud Scheduler é configurada automaticamente quando você ativa a API Cloud Scheduler, a menos que você a tenha ativado antes de 19 de março de 2019. Nesse caso, é necessário adicionar o papel Cloud Scheduler Service Agent manualmente. Dessa forma, ele pode gerar tokens de cabeçalho em nome da conta de serviço do cliente para autenticar no destino.

    É possível verificar se a conta de serviço padrão do Cloud Scheduler está configurada no projeto e se ela tem o papel Cloud Scheduler Service Agent concedido a ela visualizando o acesso atual do projeto. Se você usa o console do Google Cloud para ver o acesso do seu projeto, marque a caixa de seleção Incluir concessões de papel fornecidas pelo Google.

Criar um job do programador com autenticação

Para criar um job que usa autenticação, você precisa adicionar o tipo de token e o endereço de e-mail que identifica a conta de serviço do cliente à solicitação create-job:

Console

  1. Especifique a frequência como sempre.
  2. Especifique HTTP como o tipo de destino.
  3. Adicione o URL e o método HTTP como sempre.
  4. Na lista Auth header, selecione o tipo de token. Geralmente, o OIDC (token de ID) é usado exceto para APIs do Google hospedadas em *.googleapis.com, já que essas APIs esperam um token de acesso OAuth.
  5. Em Conta de serviço, especifique o e-mail da conta de serviço do cliente.
  6. Audience é opcional e limita os destinatários do token OIDC. Normalmente, o URL de destino do job (sem parâmetros de URL). Se não for especificado, por padrão, o URL inteiro será usado como público-alvo, incluindo os parâmetros de solicitação.

gcloud

gcloud scheduler jobs create http JOB_ID \
  --schedule="FREQUENCY" --uri=URI \
  --oidc-service-account-email=CLIENT_SERVICE_ACCOUNT_EMAIL

Substitua:

  • JOB_ID: um nome para o job. Ele precisa ser exclusivo no projeto. Não é possível reutilizar o nome de um job em um projeto, mesmo se você excluir o job associado.
  • FREQUENCY: o intervalo do job é a frequência de execução do job, por exemplo, every 3 hours ou every 10 mins. É possível usar aqui qualquer string compatível com o formato crontab. Embora não seja mais recomendado usá-lo, a sintaxe cron do App Engine legada ainda é compatível com os jobs atuais.
  • URI: o URL totalmente qualificado do endpoint.
  • --oidc-service-account-email ou --oauth-service-account-email: define o tipo de token. O OIDC geralmente é usado exceto para APIs do Google hospedadas em *.googleapis.com, já que essas APIs esperam um token OAuth.
  • CLIENT_SERVICE_ACCOUNT_EMAIL: o e-mail da conta de serviço do cliente.
  • Outros parâmetros opcionais estão disponíveis e são descritos na referência da linha de comando do gcloud.

Escolher tipos de token

Para autenticar entre o Cloud Scheduler e um destino HTTP, o Cloud Scheduler cria um token de cabeçalho com base na sua conta de serviço do cliente, identificada por seu e-mail, e o envia, usando HTTPS, para o destino. É possível usar um token de ID (OIDC) ou OAuth (de acesso). O OIDC geralmente é usado, exceto para APIs do Google hospedadas em *.googleapis.com, porque essas APIs esperam um token OAuth.

Adicionar manualmente o papel de agente de serviço do Cloud Scheduler à conta de serviço do Cloud Scheduler

Isso será necessário somente se uma das seguintes condições for verdadeira:

  • Você ativou a API Cloud Scheduler antes de 19 de março de 2019
  • Você removeu o papel Agente de serviço do Cloud Scheduler da sua conta de serviço

A conta de serviço do Cloud Scheduler requer o papel de agente de serviço do Cloud Scheduler. Sem esse papel, os jobs do Cloud Scheduler falham. É possível adicionar o papel de agente de serviço do Cloud Scheduler à conta de serviço do Cloud Scheduler no console do Google Cloud ou usando a CLI gcloud:

Console

  1. No console do Google Cloud, acesse a página API Cloud Scheduler.

    Acessar a API Cloud Scheduler

    Se houver um campo Status e o status estiver listado como Ativado, prossiga. Caso contrário, clique em Ativar.

  2. No console do Google Cloud, acesse a página Configurações.

    Acesse configurações

  3. Encontre e copie o número do projeto.

  4. No console do Google Cloud, acesse a página IAM.

    Acessar IAM

  5. Clique em Conceder acesso. O painel Conceder acesso é aberto.

  6. No campo Novos principais, adicione um endereço de e-mail com o formato:

    service-PROJECT_NUMBER@gcp-sa-cloudscheduler.iam.gserviceaccount.com
    

    Substitua PROJECT_NUMBER pelo número do projeto do Google Cloud.

  7. Na lista Selecionar papel, pesquise e selecione Agente de serviço do Cloud Scheduler.

  8. Clique em Salvar.

gcloud

  1. Confirme se a API Cloud Scheduler está ativada para seu projeto:

    gcloud services list --enabled \
     --filter=cloudscheduler.googleapis.com
    
    • Se a seguinte saída for exibida, isso significa que a API está ativada:

      NAME: cloudscheduler.googleapis.com
      TITLE: Cloud Scheduler API
      
    • Caso contrário (por exemplo, se você vir Listed 0 items.), ative a API:

      gcloud services enable cloudscheduler.googleapis.com
      
  2. Encontre seu número do projeto:

    gcloud projects describe PROJECT_ID --format='table(projectNumber)'
    

    Substitua PROJECT_ID pela ID do seu projeto.

  3. Copie o número.

  4. Conceda o papel Cloud Scheduler Service Agent à conta de serviço do Cloud Scheduler:

    gcloud projects add-iam-policy-binding PROJECT_ID \
       --member serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudscheduler.iam.gserviceaccount.com \
       --role roles/cloudscheduler.serviceAgent
    

    Substitua:

    • PROJECT_ID: ID do projeto
    • PROJECT_NUMBER: o número do projeto que você copiou anteriormente.