Usar autenticação com destinos HTTP

O Cloud Scheduler pode chamar destinos HTTP que exigem autenticação se você tiver configurado uma conta de serviço associada com 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 a conta de serviço padrão do Cloud Scheduler (service-YOUR_PROJECT_NUMBER@gcp-sa-cloudscheduler.iam.gserviceaccount.com). Essa conta de serviço gerenciado pelo Google, também conhecida como agente de serviço, não pode ser usada para essa finalidade.

    • Não remova a conta de serviço padrão do Cloud Scheduler do projeto nem o papel Cloud Scheduler Service Agent (roles/cloudscheduler.serviceAgent) dela. Isso resulta em respostas 403 para os endpoints que exigem autenticação, mesmo que a conta de serviço do job tenha o papel apropriado.

  2. Se o destino estiver no Google Cloud, conceda os papéis do IAM necessários à sua conta de serviço. Cada serviço do Google Cloud exige um papel específico, e o serviço de recebimento verifica automaticamente o token gerado. Por exemplo, para o Cloud Run e funções de segunda geração do Cloud Functions, adicione 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, recebe essa permissão automaticamente. Caso contrário, alguém com as permissões corretas precisará conceder a você essa permissão na conta de serviço.

    Prática recomendada: na etapa anterior, se você tiver criado uma conta de serviço especificamente para invocar o serviço que o job do Cloud Scheduler direciona, siga o princípio de privilégio mínimo (prática recomendada de segurança) vinculando a conta e a permissão de 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á invocando. Por exemplo, se você estiver invocando um serviço do Cloud Run, navegue até 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, talvez seja necessário clicar em Mostrar painel de informações e, em seguida, 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 uma função na lista suspensa. Siga o princípio de privilégio mínimo escolhendo o papel que inclui apenas as permissões de que o principal precisa.

    9. Clique em Save.

    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 da segmentação. 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 exige 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=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 segunda geração da função do Cloud Functions my-gen2-function:

      gcloud functions add-iam-policy-binding my-gen2-function \
      --member=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 manualmente o token.

  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, você precisa 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 visualizando o acesso atual do projeto. Se você usar o console do Google Cloud para visualizar o acesso ao 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 use autenticação, adicione 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 Cabeçalho do Auth, selecione o tipo de token. O OIDC (token de ID) geralmente é usado, exceto para APIs do Google hospedadas em *.googleapis.com, porque 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. O Público-alvo é 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 o público-alvo (incluindo 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 que você exclua o job associado.
  • FREQUENCY: o intervalo do job é a frequência com que ele é executado. Por exemplo, every 3 hours ou every 10 mins. É possível usar aqui qualquer string compatível com o formato crontab. A sintaxe cron do App Engine legada ainda é compatível com os jobs atuais, embora não seja mais recomendado usá-la.
  • 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, porque elas 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 pelo e-mail, e o envia para o destino usando HTTPS. É possível usar um token de ID (OIDC) ou um token OAuth (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 de Agente de serviço do Cloud Scheduler da sua conta de serviço

A conta de serviço do Cloud Scheduler exige 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 aparecer como Ativado, continue. 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 do 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 um papel, pesquise e selecione Agente de serviço do Cloud Scheduler.

  8. Clique em Save.

gcloud

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

    gcloud services list --enabled \
     --filter=cloudscheduler.googleapis.com
    
    • Se a saída a seguir aparecer, a API está ativada:

      NAME: cloudscheduler.googleapis.com
      TITLE: Cloud Scheduler API
      
    • Caso contrário (por exemplo, se aparecer 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 à conta de serviço do Cloud Scheduler o papel Cloud Scheduler Service Agent:

    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