Conta de serviço personalizada para o Cloud Build (1.ª geração)

As funções do Cloud Run tiram partido do Cloud Build quando criam e implementam a sua função do Cloud Run. Por predefinição, as funções do Cloud Run usam a conta de serviço do Cloud Build predefinida como principal quando executam a compilação. A partir de julho de 2024, o Cloud Build alterou o comportamento predefinido da forma como o Cloud Build usa as contas de serviço em novos projetos. Esta alteração está detalhada no artigo Alteração da conta de serviço do Cloud Build. Como resultado desta alteração, os novos projetos que implementam funções pela primeira vez podem estar a usar uma conta de serviço do Cloud Build predefinida com autorizações insuficientes para criar uma função. Se for afetado por esta alteração, pode fazer uma das seguintes ações:

  • Reveja as orientações do Cloud Build sobre as alterações à conta de serviço predefinida e desative estas alterações.

  • Adicione a função de conta do Cloud Build (roles/cloudbuild.builds.builder) à conta de serviço predefinida do Compute Engine.

  • Crie uma conta de serviço do Cloud Build personalizada para implementações de funções.

Este documento descreve como transmitir uma conta de serviço criada pelo utilizador para ser usada pelo Cloud Build quando implementar a sua função.

Pode implementar funções com contas de serviço personalizadas através da CLI do Google Cloud, Google Cloud da consola ou da API Cloud Run Functions.

Seguem-se alguns cenários em que pode querer fornecer uma conta de serviço diferente para ser usada quando o Cloud Build compila a sua função:

  • Quer ter mais controlo sobre as contas de serviço a adicionar ao perímetro do VPC-SC.

  • Quer que o Cloud Build seja executado com autorizações diferentes das que a conta de serviço predefinida tem, sem ter de revogar cada autorização individualmente.

  • Quer definir autorizações detalhadas do Cloud Build especificamente para as suas funções e não partilhar uma conta de serviço do Cloud Build otimizada para outros fins.

  • A sua organização desativou a utilização da conta de serviço predefinida.

Ativar APIs

Esta funcionalidade requer que a API IAM esteja ativada.

Use a CLI Google Cloud para ativar as APIs necessárias para implementar uma função do Cloud Run ou use a Google Cloud consola:

gcloud services enable iam.googleapis.com

Configure a conta de serviço

Este documento descreve como criar uma nova conta de serviço e conceder as autorizações necessárias. Se quiser usar uma conta de serviço existente, precisa do endereço de email da conta de serviço que planeia usar. Consulte o artigo sobre a configuração de contas de serviço especificadas pelo utilizador para ver detalhes.

Pode ver as suas contas de serviço existentes da seguinte forma ou usar aGoogle Cloud consola:

gcloud iam service-accounts list

Criar conta de serviço

Use a CLI Google Cloud para criar a sua conta de serviço ou use a Google Cloud consola:

gcloud iam service-accounts create SA_EMAIL

Substitua SA_EMAIL pelo endereço de email da sua conta de serviço.

Conceder Permissões

A conta de serviço que usa precisa das seguintes funções:

  • roles/logging.logWriter— Necessário para armazenar registos de compilação no Cloud Logging.
  • roles/artifactregistry.writer: necessário para armazenar imagens de compilação no Artifact Registry. Para o comportamento predefinido, a conta de serviço precisa de acesso a repositórios denominados "gcf-artifacts" e "cloud-run-source-deploy". O acesso aos repositórios pode ser definido na política IAM do repositório. Em alternativa, pode fornecer o seu próprio repositório de artefactos através do campo dockerRepository.
  • roles/storage.objectViewer— Necessário para obter a origem da função do contentor do Cloud Storage e para armazenar imagens de compilação no Container Registry. Para o comportamento predefinido, a conta de serviço precisa de acesso a contentores com o nome "gcf-sources-*". Isto pode ser feito adicionando uma condição de IAM à concessão de funções, como: (resource.type == "storage.googleapis.com/Object" && (resource.name.startsWith("gcf-sources-")))

  • roles/storage.objectAdmin: obrigatório para o registo de contentores (agora descontinuado). É necessário acesso a contentores com o nome *.artifacts.PROJECT_ID.appspot.com para aceder ao registo de contentores.

Conceda as seguintes funções através da CLI do Google Cloud ou use a Google Cloud consola.

gcloud projects add-iam-policy-binding PROJECT_ID \
--member=serviceAccount:SA_EMAIL \
    --role=roles/logging.logWriter

gcloud projects add-iam-policy-binding PROJECT_ID \
--member=serviceAccount:SA_EMAIL \
--role=roles/artifactregistry.writer

gcloud projects add-iam-policy-binding PROJECT_ID \
--member=serviceAccount:SA_EMAIL \
--role=roles/storage.objectViewer

gcloud projects add-iam-policy-binding PROJECT_ID \
--member=serviceAccount:SA_EMAIL \
--role=roles/storage.objectAdmin

Substitua o seguinte:

Considerações sobre os VPC Service Controls

Se tiver um perímetro dos VPC Service Controls a proteger o seu projeto e a API Cloud Run Functions, e se estiver a usar a conta de serviço predefinida do Compute Engine como a função Conta de serviço do Cloud Build para as Cloud Run Functions, tem de criar as seguintes regras de entrada:

  • Permita a entrada da conta de serviço predefinida do Compute Engine em todos os métodos nas APIs Cloud Storage e Cloud Logging.
  • Permita a entrada da conta de serviço service-[PROJECT_NUMBER]@gcf-admin-robot.iam.gserviceaccount.com em todos os métodos nas APIs Cloud Storage e Cloud Logging.

Implemente uma função com uma conta de serviço personalizada

Pode usar a CLI do Google Cloud para implementar uma função que usa uma conta de serviço personalizada para o Cloud Build:

  • A flag --build-service-account especifica uma conta de serviço da IAM cujas credenciais vão ser usadas para a etapa de compilação. Se não for fornecida uma conta de serviço personalizada, a função usa a conta de serviço predefinida do projeto para o Cloud Build.
  • Opcionalmente, pode usar um conjunto privado, que especifica através da flag --build-worker-pool.

gcloud functions deploy FUNCTION_NAME \
   --no-gen2 \
   --region=REGION \
   --project=PROJECT_ID \
   --runtime=RUNTIME \
   --entry-point=CODE_ENTRYPOINT \
   --build-service-account=projects/PROJECT_ID/serviceAccounts/SA_EMAIL \
   --memory=256Mi \
   --trigger-http \
   --source=.

Substitua o seguinte: