Controle de acesso com o IAM

Você (ou seja, o usuário ou a conta de serviço que implanta a função) pode definir o controle de acesso usando papéis no nível do projeto. Conceda um papel a um membro do projeto ou a uma conta de serviço para determinar o nível de acesso ao projeto do Google Cloud e os recursos dele. Por padrão, todos os projetos do Google Cloud vêm com um único usuário: o criador do projeto original. Ninguém mais tem acesso ao projeto e, como consequência, acesso às funções até que um usuário seja adicionado como integrante da equipe do projeto.

Controle de acesso para usuários

Adicione usuários à equipe do projeto e atribua papéis a eles usando o Identity and Access Management (IAM).

O Cloud Functions oferece suporte aos papéis básicos de Editor, Proprietário e Visualizador, que dão as seguintes permissões:

  • Editor e Proprietário: acesso de leitura e gravação a todos os recursos relacionados a funções. Permite que os usuários implantem, atualizem e excluam funções. Acesso extra a outros recursos no projeto.
  • Leitor: acesso somente leitura a funções e locais. Permite que os usuários listem funções e vejam os detalhes, mas não o código-fonte. Acesso extra a outros recursos no projeto.

O Cloud Functions também aceita os papéis predefinidos Desenvolvedor e Visualizador do Cloud Functions, que dão as seguintes permissões:

  • Desenvolvedor: acesso de leitura e gravação a todos os recursos relacionados a funções. Permite que os usuários implantem, atualizem e excluam funções. Não há acesso a outros recursos no projeto.
  • Leitor: acesso somente leitura a funções e locais. Permite que os usuários listem funções e vejam os detalhes, mas não o código-fonte. Não há acesso a outros recursos no projeto.

Controle de acesso para contas de serviço

Uma conta de serviço é um tipo especial de Conta do Google que atua como identidade para um usuário não humano que precisa ser autenticado e autorizado para acessar dados e executar várias ações. Algumas dessas contas são criadas e gerenciadas pelo próprio Google e são conhecidas como agentes de serviços.

As contas de serviço a seguir são usadas para o Cloud Functions:

Nome ID do membro Papel
Conta de serviço padrão do App Engine (somente 1ª geração) PROJECT_ID@appspot.gserviceaccount.com Editor
Conta de serviço padrão do Compute Engine (somente 2ª geração) PROJECT_NUMBER-compute@developer.gserviceaccount.com Editor
Agente de serviços do Google Cloud Functions service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com Agente do serviço do Cloud Functions
PROJECT_NUMBER@cloudbuild.gserviceaccount.com Conta de serviço do Cloud Build
Conta de serviço do Cloud Build service-PROJECT_NUMBER@gcp-sa-cloudbuild.iam.gserviceaccount.com Agente de serviço do Cloud Build
Agente de serviço do Google Container Registry service-PROJECT_NUMBER@containerregistry.iam.gserviceaccount.com Agente de serviço do Container Registry
Agente de serviço do Artifact Registry service-PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com Agente de serviço do Artifact Registry

Contas de serviço do ambiente de execução

No ambiente de execução, o Cloud Functions (1ª geração) usa a conta de serviço padrão do App Engine (PROJECT_ID@appspot.gserviceaccount.com), que tem o papel de Editor no projeto. O Cloud Functions (2ª geração) usa a conta de serviço padrão do Compute Engine (PROJECT_NUMBER-compute@developer.gserviceaccount.com), que também tem o papel de Editor no projeto. É possível alterar os papéis dessas contas de serviço para limitar ou estender as permissões para as funções em execução. Além disso, também é possível alterar a conta de serviço usada ao fornecer uma conta de serviço individual não padrão.

Para saber mais sobre contas de serviço, consulte a documentação de contas de serviço.

Contas de serviço administrativas

Para realizar ações administrativas no seu projeto durante a criação, atualização ou exclusão de funções, todos os projetos no Cloud Functions exigem a conta de serviço do agente de serviço do Google Cloud Functions (service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com).

Além disso, todos os ambientes de execução criam e armazenam imagens de contêiner no projeto. Para isso, também é preciso provisionar o seguinte:

Essas contas de serviço devem ter os papéis listados na tabela anterior.

Conta de serviço do agente de serviço do Google Cloud Functions

Por padrão, a conta de serviço do agente de serviço do Google Cloud Functions (service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com) tem o papel cloudfunctions.serviceAgent no projeto. A criação, a atualização e a exclusão de funções podem não funcionar se você alterar as permissões dessa conta.

Veja algumas das permissões importantes que cloudfunctions.serviceAgent usa:

Permissão Descrição
roles/artifactregistry.admin Gerencia repositórios e armazena imagens de builds no Artifact Registry.
roles/cloudbuild.builds.editor Necessário para usar o Cloud Build a fim de executar criações no projeto do usuário.
roles/cloudbuild.customworkers.builder Crie builds em workers personalizados do Cloud Build.
cloudfunctions.functions.invoke Invoca uma função HTTP da primeira geração protegida pelo IAM.
compute.globalOperations.get,
compute.networks.access,
vpcaccess.connectors.{get, use}
Provisione funções com acesso à VPC de projetos do consumidor.
roles/eventarc.developer Gerencia gatilhos do Eventarc para funções de segunda geração.
firebasedatabase.instances.{get, update} Crie funções acionadas pelo Firebase Realtime Database.
iam.serviceAccounts.{actAs, getAccessToken, signBlob} Capacidade de receber credenciais da conta de serviço do ambiente de execução.
iam.serviceAccounts.getOpenIdToken Necessário para que o agente receba um token OpenID em uma autoridade especificada pelo usuário. O token OpenID é usado para invocar funções ativadas do IAM.
pubsub.subscriptions Gerencie assinaturas no projeto do usuário.
pubsub.topics Gerencia tópicos no projeto do usuário.
roles/run.developer Gerencia o Serviço do Cloud Run para funções de segunda geração.
storage.buckets.{get, update} Configura notificações em um bucket do Cloud Storage que acionam uma função de primeira geração.
storage.buckets.create,
storage.objects.{delete, get, create, list}
Necessário para armazenar o código-fonte no projeto do usuário.

Veja todo o conjunto de permissões nos papéis predefinidos do IAM ou executando este comando:

gcloud iam roles describe roles/cloudfunctions.serviceAgent

Redefina esta conta de serviço para o papel padrão removendo o papel em uso e adicionando o papel agente de serviço do Cloud Functions:

gcloud projects add-iam-policy-binding PROJECT_ID \
  --member serviceAccount:service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com \
  --role roles/cloudfunctions.serviceAgent

Como solucionar problemas de erros de permissão

Caso haja erros de permissão ao implantar, atualizar, excluir ou executar funções no projeto:

  1. Certifique-se de que você tem o papel de Editor ou Proprietário no projeto, ou de que está usando o papel de Desenvolvedor do Cloud Functions.

    Se você estiver usando o papel Desenvolvedor do Cloud Functions para envolvidos no projeto, verifique também se você concedeu ao usuário o papel Usuário da conta de serviço do IAM.

    Atualmente, apenas permissões de execução são permitidas no nível por função.

  2. Verifique se a conta do agente de serviço do Cloud Functions (service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com) tem o papel cloudfunctions.serviceAgent no seu projeto.

    Verifique se a caixa Incluir concessões de papel fornecidas pelo Google na guia Permissões da página IAM do console está marcada para ver essa conta. Também é possível usar gcloud projects add-iam-policy-binding PROJECT_ID.

  3. Verifique se você tem permissões para origens de gatilho, como Pub/Sub ou Cloud Storage.

Se ocorrer um erro de “permissões insuficientes” ou outros problemas de autenticação ao executar as funções, verifique se a conta do serviço do ambiente de execução tem as permissões corretas para acessar os recursos necessários e siga as etapas 2 e 3 acima.

Se o erro de ”serviço indisponível” for exibido durante a implantação, a conta de serviço do ambiente de execução PROJECT_ID@appspot.gserviceaccount.com deve estar no projeto. Para recriar essa conta de serviço, caso tenha sido excluída, consulte Como cancelar a exclusão de uma conta de serviço.

Consulte também: Solução de problemas do Cloud Functions.