Resolva problemas de funções do Cloud Run (1.ª geração)

Este documento mostra como resolver problemas de mensagens de erro e resolver problemas quando usa funções do Cloud Run (1.ª geração).

Implementação

Esta secção apresenta problemas que pode encontrar com a implementação e sugestões sobre como corrigir cada um deles. Muitos dos problemas que pode encontrar durante a implementação estão relacionados com funções e autorizações ou uma configuração incorreta.

A conta de serviço de implementação não tem autorizações do Pub/Sub quando implementa uma função orientada por eventos

O serviço Cloud Functions usa a conta de serviço do agente de serviço do Cloud Functions (service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com) para realizar ações administrativas. Por predefinição, esta conta tem a função cloudfunctions.serviceAgent do Cloud Functions atribuída. Para implementar funções orientadas por eventos, o serviço Cloud Functions tem de aceder ao Pub/Sub para configurar tópicos e subscrições. Se a função atribuída à conta de serviço for alterada e as autorizações adequadas não forem atualizadas, o serviço Funções da nuvem não pode aceder ao Pub/Sub e a implementação falha.

A mensagem de erro

Consola

Failed to configure trigger PubSub projects/PROJECT_ID/topics/FUNCTION_NAME

gcloud

ERROR: (gcloud.functions.deploy) OperationError: code=13, message=Failed to configure trigger PubSub projects/PROJECT_ID/topics/FUNCTION_NAME

A solução

Pode repor a sua conta de serviço para a função cloudfunctions.serviceAgent predefinida.

A conta de serviço de tempo de execução predefinida não existe

Quando não é especificada uma conta de serviço gerida pelo utilizador, as funções do Cloud Run (1.ª geração) usam a conta de serviço do App Engine por predefinição. As implementações falham se eliminar a conta predefinida sem especificar uma conta de serviço gerida pelo utilizador.

A mensagem de erro

gcloud

ERROR: (gcloud.functions.deploy) ResponseError: status=[400], code=[Ok], message=[Default service account 'test-project-356312@appspot.gserviceaccount.com' doesn't exist. Please recreate this account or specify a different account. Please visit https://cloud.google.com/functions/docs/troubleshooting for in-depth troubleshooting documentation.]

A solução

Para resolver este problema, siga qualquer uma destas soluções:

O utilizador não tem autorizações para a conta de serviço de tempo de execução durante a implementação de uma função

Cada função está associada a uma conta de serviço que serve como identidade quando a função acede a outros recursos. Esta conta de serviço de tempo de execução pode ser a conta de serviço predefinida ou uma conta de serviço gerida pelo utilizador. Para que as Cloud Functions usem uma conta de serviço de tempo de execução, o implementador tem de ter a autorização iam.serviceAccounts.actAs nessa conta de serviço. Um utilizador que cria uma conta de serviço de tempo de execução não predefinida recebe automaticamente esta autorização, mas outros implementadores têm de receber esta autorização por parte de um utilizador com as autorizações corretas.

Um utilizador ao qual tenha sido atribuída a função Leitor do projeto, Programador do Cloud Functions ou Administrador do Cloud Functions tem de ter também a autorização iam.serviceAccounts.actAs na conta de serviço de tempo de execução.

A mensagem de erro

Consola

You must have the iam.serviceAccounts.actAs permission on the selected service account. To obtain this permission, you can grant a role that includes it like the Service Account User role, on the project.

gcloud

Ocorre o seguinte erro para a conta de serviço predefinida:

ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Caller USER is missing permission 'iam.serviceaccounts.actAs' on service account PROJECT_ID@appspot.gserviceaccount.com. Grant the role 'roles/iam.serviceAccountUser' to the caller on the service account PROJECT_ID@appspot.gserviceaccount.com. You can do that by running 'gcloud iam service-accounts add-iam-policy-binding
PROJECT_ID@appspot.gserviceaccount.com --member MEMBER --role roles/iam.serviceAccountUser' where MEMBER has a prefix like 'user:' or 'serviceAccount:'.

Ocorre o seguinte erro para a conta de serviço não predefinida:

ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Caller USER is missing permission 'iam.serviceaccounts.actAs' on service account SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com. Grant the role 'roles/iam.serviceAccountUser' to the caller on the service account SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com. You can do that by running 'gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com --member MEMBER --role roles/iam.serviceAccountUser' where MEMBER has a prefix like 'user:' or 'serviceAccount:'.

A solução

Atribua a função roles/iam.serviceAccountUser ao utilizador na conta de serviço predefinida ou gerida pelo utilizador. Esta função inclui a autorização iam.serviceAccounts.actAs.

A conta de serviço do agente do serviço das funções do Cloud Run não tem autorizações do contentor do projeto durante a implementação de uma função

As funções do Cloud Run só podem ser acionadas por eventos de contentores do Cloud Storage no mesmo Google Cloud projeto. Além disso, a conta de serviço do agente de serviço do Cloud Functions (service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com) precisa da função cloudfunctions.serviceAgent no seu projeto.

A mensagem de erro

Consola

Deployment failure: Insufficient permissions to (re)configure a trigger
(permission denied for bucket BUCKET_ID). Please, give owner permissions
to the editor role of the bucket and try again.

gcloud

ERROR: (gcloud.functions.deploy) OperationError: code=7, message=Insufficient
permissions to (re)configure a trigger (permission denied for bucket BUCKET_ID).
Please, give owner permissions to the editor role of the bucket and try again.

A solução

Para resolver este erro, reponha a conta de serviço do agente do serviço para a função predefinida.

O utilizador com a função de Editor de projetos não pode tornar uma função pública

A função de editor de projeto tem autorizações amplas para gerir recursos num projeto, mas não concede inerentemente a capacidade de tornar as funções do Cloud Run públicas. Tem de conceder a autorização cloudfunctions.functions.setIamPolicy ao utilizador ou ao serviço que implementa a função.

A mensagem de erro

gcloud

 ERROR: (gcloud.functions.add-iam-policy-binding) ResponseError: status=[403], code=[Forbidden], message=[Permission 'cloudfunctions.functions.setIamPolicy' denied on resource 'projects/PROJECT_ID/locations/LOCATION/functions/FUNCTION_NAME (or resource may not exist).]

A solução

Para resolver este erro, siga qualquer uma destas soluções:

A implementação de funções falha quando usa a política da organização de restrição da localização de recursos

Se a sua organização usar uma política de restrição de localização de recursos, a implementação de funções é restrita nas regiões restritas pela política. Na Google Cloud consola, a região restrita não está disponível no menu pendente de regiões durante a implementação de uma função.

A mensagem de erro

gcloud

  ERROR: (gcloud.functions.deploy) ResponseError: status=[400], code=[Ok], message=[The request has violated one or more Org Policies. Please refer to the respective violations for more information. violations {
    type: "constraints/gcp.resourceLocations"
    subject: "orgpolicy:projects/PROJECT_ID"
    description: "Constraint constraints/gcp.resourceLocations violated for projects/PROJECT_ID attempting GenerateUploadUrlActionV1 with location set to RESTRICTED_LOCATION. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information."
  }

A solução

Adicione ou remova localizações das listas allowed_values ou denied_values da restrição de localizações de recursos para uma implementação bem-sucedida.

A implementação da função falha durante a execução do âmbito global da função

Este erro indica que ocorreu um problema com o seu código. O pipeline de implementação terminou a implementação da função, mas falhou no último passo: o envio de uma verificação de estado para a função. Esta verificação de funcionamento destina-se a executar o âmbito global de uma função, o que pode gerar uma exceção, falhar ou exceder o limite de tempo. O âmbito global é onde carrega normalmente as bibliotecas e inicializa os clientes.

A mensagem de erro

Consola

Deployment failure: Function failed on loading user code. This is likely due to a bug in the user code.

gcloud

ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Function
failed on loading user code. This is likely due to a bug in the user code.

Nos registos do Cloud Logging:

  "Function failed on loading user code. This is likely due to a bug in the user code."

A solução

Para resolver este problema, siga qualquer uma destas soluções:

  • Para uma mensagem de erro mais detalhada, reveja os registos de compilação da sua função.

  • Se não for claro por que motivo a sua função não executou o respetivo âmbito global, considere mover temporariamente o código para a invocação do pedido, usando a inicialização tardia das variáveis globais. Isto permite-lhe adicionar declarações de registo adicionais em torno das suas bibliotecas cliente, que podem estar a expirar na respetiva instanciação (especialmente se estiverem a chamar outros serviços) ou a falhar ou a gerar exceções por completo.

  • Aumente o tempo limite da função.

  • O código-fonte tem de conter uma função de ponto de entrada que tenha sido especificada corretamente na implementação, através da consola ou do gcloud.

O utilizador com a função Leitor não pode implementar uma função

Os utilizadores com a função Project Viewer ou Cloud Functions Viewer têm acesso de só de leitura às funções e aos detalhes das funções, e não podem implementar novas funções. A funcionalidade Criar função está esbatida na Google Cloud consola com o seguinte erro:

A mensagem de erro

gcloud

ERROR: (gcloud.functions.deploy) PERMISSION_DENIED: Permission
'cloudfunctions.functions.sourceCodeSet' denied on resource
'projects/PROJECT_ID/locations/LOCATION` (or resource may not exist)

A solução

Atribua ao utilizador a função de Programador das Funções do Google Cloud.

A conta de serviço de compilação tem autorizações em falta

A mensagem de erro

No erro de implementação da função ou nos registos de compilação, pode ver um dos seguintes erros:

The service account running this build does not have permission to write logs.
To fix this, grant the Logs Writer (roles/logging.logWriter) role to the service
account.
Step #0 - "fetch": failed to Fetch: failed to download archive gs://gcf-sources-PROJECT_NUMBER-LOCATION/FUNCTION_NAME/version-VERSION_NUMBER/function-source.zip: Access to bucket gcf-sources-PROJECT_NUMBER-LOCATION denied. You must grant Storage Object Viewer permission to PROJECT_NUMBER-compute@developer.gserviceaccount.com.
Step #2 - "build": ERROR: failed to create image cache: accessing cache image "LOCATION-docker.pkg.dev/PROJECT/gcf-artifacts/FUNCTION_NAME/cache:latest": connect to repo store "LOCATION-docker.pkg.dev/PROJECT/gcf-artifacts/FUNCTION_NAME/cache:latest": GET https://LOCATION-docker.pkg.dev/v2/token?scope=repository%3APROJECT%2Fgcf-artifacts%2FFUNCTION_NAME%2Fcache%3Apull&service=: DENIED: Permission "artifactregistry.repositories.downloadArtifacts" denied on resource "projects/PROJECT/locations/LOCATION/repositories/gcf-artifacts" (or it may not exist)
Could not build the function due to a missing permission on the build service account. If  you didn't revoke that permission explicitly, this could be caused by a change in the organization policies.

A solução

A conta de serviço de compilação precisa de autorização para ler a partir do contentor de origem e autorizações de leitura e escrita para o repositório de implementação de artefactos. Pode encontrar este erro devido a uma alteração no comportamento predefinido de como o Cloud Build usa contas de serviço, detalhado no artigo Alteração da conta de serviço do Cloud Build.

Para resolver este problema, use qualquer uma destas soluções:

Conta de serviço de compilação desativada

A mensagem de erro

Could not build the function due to disabled service account used by Cloud Build. Please make sure that the service account is active.

A solução

A conta de serviço de compilação tem de estar ativada para implementar uma função. Pode encontrar este erro devido a uma alteração no comportamento predefinido de como o Cloud Build usa as contas de serviço, detalhado no artigo Alteração da conta de serviço do Cloud Build.

Para resolver este problema, use qualquer uma destas soluções:

a servir

Esta secção apresenta problemas de publicação que pode encontrar e fornece sugestões sobre como corrigir cada um deles.

Erro de autorização de publicação devido à função que requer autenticação

As funções HTTP sem a opção Permitir invocações não autenticadas ativada restringem o acesso aos utilizadores finais e às contas de serviço que não têm as autorizações adequadas.

A visita ao URL das funções do Cloud Run num navegador não adiciona automaticamente um cabeçalho de autenticação.

A mensagem de erro

Código de resposta de erro HTTP: 403 Proibido

Corpo da resposta de erro de HTTP:

Error: Forbidden Your client does not have permission
to get URL /FUNCTION_NAME from this server.

A solução

Para resolver este erro, siga uma destas soluções:

Erro de autorização de publicação devido à configuração do allow internal traffic only

As definições de entrada restringem se uma função HTTP pode ser invocada por recursos fora do seu Google Cloud projeto ou perímetro de serviço do VPC Service Controls. Quando configura a definição Permitir apenas tráfego interno para a rede de entrada, esta mensagem de erro indica que apenas são permitidos pedidos de redes da VPC no mesmo projeto ou perímetro dos VPC Service Controls.

A mensagem de erro

Código de resposta de erro HTTP: 404 NOT FOUND

Corpo da resposta de erro de HTTP:

404 Page not found

A solução

Para resolver este erro, siga uma destas soluções:

  • Certifique-se de que o pedido é proveniente do seu projeto Google Cloud ou perímetro de serviço dos VPC Service Controls.

  • Altere as definições de entrada para permitir todo o tráfego para a função.

  • O código fonte das funções do Cloud Run pode resultar num erro 404 devido a um URL de função, métodos HTTP ou erros de lógica incorretos.

A invocação da função não tem credenciais de autenticação válidas

As funções configuradas com acesso restrito requerem um token de ID. A invocação de funções falha se usar chaves de acesso ou chaves de atualização.

A mensagem de erro

Código de resposta de erro HTTP: 401 não autorizado

Corpo da resposta de erro de HTTP:

Your client does not have permission to the requested URL </FUNCTION_NAME>

A solução

Para resolver este erro, siga uma destas soluções:

A função para a meio da execução ou continua a ser executada depois de o código terminar

Alguns tempos de execução de funções do Cloud Run permitem que os utilizadores executem tarefas assíncronas. Se a sua função criar essas tarefas, também tem de aguardar explicitamente que estas sejam concluídas. Caso contrário, a função pode deixar de ser executada no momento errado.

O comportamento do erro

A sua função apresenta um dos seguintes comportamentos:

  • A sua função termina enquanto as tarefas assíncronas ainda estão em execução, mas antes de o período de tempo limite especificado ter decorrido.
  • A sua função não para de ser executada quando estas tarefas terminam e continua a ser executada até o período de limite de tempo expirar.

A solução

Se a sua função terminar antecipadamente, deve certificar-se de que todas as tarefas assíncronas da função estão concluídas antes de a função realizar qualquer uma das seguintes ações:

  • Devolver um valor
  • Resolver ou rejeitar um objeto Promise devolvido (apenas funções do Node.js)
  • Acionar exceções e erros não detetados
  • Enviar uma resposta HTTP
  • Chamar uma função de chamada de retorno

Se a sua função não terminar após a conclusão das tarefas assíncronas, deve verificar se a função está a sinalizar corretamente as funções do Cloud Run após a conclusão. Em particular, certifique-se de que executa uma das operações indicadas na lista anterior assim que a sua função terminar as tarefas assíncronas.

Erro de tempo de execução ao aceder a recursos protegidos pelos VPC Service Controls

Por predefinição, as funções do Cloud Run usam endereços IP públicos para fazer pedidos de saída a outros serviços. As funções que não estão dentro do perímetro dos VPC Service Controls podem receber respostas HTTP 403 ao tentar aceder a serviços protegidos pelos VPC Service Controls, devido a negações do perímetro de serviço. Google Cloud

A mensagem de erro

Nos registos de recursos auditados, uma entrada semelhante à seguinte:

"protoPayload": {
  "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
  "status": {
    "code": 7,
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.PreconditionFailure",
        "violations": [
          {
            "type": "VPC_SERVICE_CONTROLS",
  ...
  "authenticationInfo": {
    "principalEmail": "CLOUD_FUNCTION_RUNTIME_SERVICE_ACCOUNT",
  ...
  "metadata": {
    "violationReason": "NO_MATCHING_ACCESS_LEVEL",
    "securityPolicyInfo": {
      "organizationId": "ORGANIZATION_ID",
      "servicePerimeterName": "accessPolicies/NUMBER/servicePerimeters/SERVICE_PERIMETER_NAME"
  ...

A solução

Para resolver este erro, siga uma destas soluções:

Escalabilidade

Esta secção enumera os problemas de escalabilidade e fornece sugestões sobre como corrigir cada um deles.

Erros do Cloud Logging relacionados com anulações de pedidos de filas pendentes

As seguintes condições podem estar associadas a falhas de escalabilidade.

  • Um aumento súbito e enorme no tráfego.
  • Tempo de início a frio longo.
  • Tempo de processamento de pedidos longo.
  • Taxa de erros de função elevada.
  • Atingir o limite máximo de instâncias.
  • Fatores transitórios atribuídos ao serviço de funções do Cloud Run.

Em cada caso, as funções do Cloud Run podem não ser dimensionadas rapidamente o suficiente para gerir o tráfego.

A mensagem de erro

 The request was aborted because there was no available instance.

As funções do Cloud Run têm os seguintes níveis de gravidade:

* `severity=WARNING` ( Response code: 429 ) Cloud Run functions cannot scale due
  to the [`max-instances`](/functions/docs/configuring/max-instances) limit you set
  during configuration.
* `severity=ERROR` ( Response code: 500 ) Cloud Run functions intrinsically
  cannot manage the rate of traffic.

A solução

Registo

A secção seguinte aborda problemas com o registo e como os corrigir.

As entradas dos registos não têm níveis de gravidade do registo ou têm níveis incorretos

As funções do Cloud Run incluem o registo em tempo de execução por predefinição. Os registos escritos em stdout ou stderr aparecem automaticamente na Google Cloud consola. No entanto, estas entradas de registo contêm apenas mensagens de texto por predefinição.

A solução

Para incluir gravidades dos registos, tem de enviar uma entrada de registo estruturada.

Processar ou registar exceções de forma diferente em caso de falha

Pode querer personalizar a forma como gere e regista as informações de falhas do sistema.

A solução

Inclua a função num bloco try para personalizar o processamento de exceções e registar rastreios de pilha.

A adição de um bloco try pode resultar num efeito secundário não intencional em funções orientadas por eventos com a configuração retry on failure. A repetição de eventos com falhas pode falhar.

Exemplo

import logging
import traceback
def try_catch_log(wrapped_func):
  def wrapper(*args, **kwargs):
    try:
      response = wrapped_func(*args, **kwargs)
    except Exception:
      # Replace new lines with spaces so as to prevent several entries which
      # would trigger several errors.
      error_message = traceback.format_exc().replace('\n', '  ')
      logging.error(error_message)
      return 'Error';
    return response;
  return wrapper;

#Example hello world function

@try_catch_log
def python_hello_world(request):
  request_args = request.args

  if request_args and 'name' in request_args:
    1 + 's'
  return 'Hello World!'

Registos demasiado grandes no Node.js 10+, Python 3.8, Go 1.13 e Java 11

O tamanho máximo de uma entrada de registo normal nestes tempos de execução é de 105 KiB.

A solução

Envie entradas de registo inferiores a este limite.

Faltam registos, apesar de as funções do Cloud Run devolverem erros

As funções do Cloud Run transmitem os registos das funções do Cloud Run para um contentor predefinido. Quando cria um projeto, o Cloud Run Functions cria e ativa o contentor predefinido. Se o contentor predefinido estiver desativado ou se os registos da função do Cloud Run estiverem no filtro de exclusão, os registos não aparecem no Explorador de registos.

A solução

Ative os registos predefinidos e certifique-se de que não está definido nenhum filtro de exclusão.

Os registos das funções do Cloud Run não são apresentados no Explorador de registos

Algumas bibliotecas cliente do Cloud Logging usam um processo assíncrono para escrever entradas de registo. Se uma função falhar ou terminar de outra forma, é possível que algumas entradas de registo ainda não tenham sido escritas e possam aparecer mais tarde. Também é possível que alguns registos sejam perdidos e não possam ser vistos no Explorador de registos.

A solução

Use a interface da biblioteca cliente para limpar as entradas de registo em buffer antes de sair da função ou use a biblioteca para escrever entradas de registo de forma síncrona. Também pode escrever registos de forma síncrona diretamente no stdout ou no stderr.

Os registos das funções do Cloud Run não estão a ser apresentados através do destino do Log Router

Os destinos do Log Router encaminham as entradas de registo para vários destinos.

Captura de ecrã do Console Log Router com os detalhes do destino de visualização realçados

As definições incluem filtros de exclusão, que definem entradas que podem ser rejeitadas.

Captura de ecrã da caixa de diálogo Detalhes do destino do router de registo da consola a mostrar o filtro de exclusão

A solução

Remova o filtro definido de exclusão para resource.type="cloud_functions".

Ligações da base de dados

Muitos erros de base de dados estão associados à ultrapassagem dos limites de ligação ou ao tempo limite excedido. Se vir um aviso do Cloud SQL nos seus registos, por exemplo, Context deadline exceeded, pode ter de ajustar a configuração da ligação. Para mais informações, consulte as práticas recomendadas do Cloud SQL.

Trabalhar em rede

Esta secção lista problemas de rede e fornece sugestões sobre como corrigir cada um deles.

Conetividade de rede

Se todos os pedidos de saída de uma função do Cloud Run falharem mesmo depois de configurar as definições de saída, pode executar testes de conetividade para identificar problemas de conetividade de rede subjacentes. Para mais informações, consulte o artigo Crie e execute testes de conetividade.

O conetor do Acesso a VPC sem servidor não está pronto ou não existe

Se um conetor de acesso à VPC sem servidor falhar, pode não estar a usar uma máscara de sub-rede /28dedicada ao conetor, conforme necessário.

A mensagem de erro

VPC connector projects/xxxxx/locations/REGION/connectors/xxxx
is not ready yet or does not exist.

Quando as funções do Cloud Run são implementadas com um conector num estado incorreto devido à falta de autorização na conta de serviço do agente de serviço das APIs Google PROJECT_NUMBER@cloudservices.gserviceaccount.com, é apresentado o seguinte erro:

A mensagem de erro

Failed to prepare VPC connector. Please try again later.

A solução

Liste as suas sub-redes para verificar se o conector usa uma máscara de sub-rede /28. Se o seu conetor não usar a máscara de sub-rede /28, recrie ou crie um novo conetor.

Para resolver este problema, siga qualquer uma destas soluções:

  • Se recriar o conector, não tem de voltar a implementar outras funções. Pode ocorrer uma interrupção da rede enquanto o conector é recriado.

  • Se criar um novo conetor alternativo, volte a implementar as funções para usar o novo conetor e, em seguida, elimine o conetor original. Este método evita a interrupção da rede.

  • Certifique-se de que as funções do Cloud Run e o conector associado estão implementados na mesma região.

  • Para a configuração da VPC partilhada :

    • Certifique-se de que as contas de serviço SERVICE_PROJECT_NUMBER@cloudservices.gserviceaccount.com e service-SERVICE_PROJECT_NUMBER@gcp-sa-vpcaccess.iam.gserviceaccount.com usadas pelo conector de VPC para aprovisionar recursos no projeto não têm autorizações em falta. Estas contas de serviço devem ter a função roles/compute.networkUser no projeto anfitrião da configuração de VPC partilhada quando o conector está no projeto de serviço. Caso contrário, o campo roles/compute.networkAdmin é obrigatório.

    • Se o conetor for criado no projeto anfitrião, certifique-se de que a função Serverless VPC Access User é concedida em Cloud Run functions Service Agent no projeto anfitrião.

    • Se o estado do conector apresentar um erro Connector is in a bad state, manual deletion recommended e o agente do serviço das APIs Google não tiver as autorizações necessárias para aprovisionar recursos de computação no projeto do conector, conceda roles/compute.admin à conta de serviço PROJECT_NUMBER@cloudservices.gserviceaccount.com. Em alguns casos, pode ter de recriar o conector após atualizar as autorizações.

O tráfego SMTP para endereços IP de destino externos através da porta TCP 25 é bloqueado

Para maior segurança, Google Cloud bloqueia as ligações à porta de destino TCP 25 ao enviar emails a partir de funções do Cloud Run.

A solução

Para desbloquear estas ligações, escolha uma das seguintes opções:

Outro

Esta secção descreve quaisquer problemas adicionais que não se enquadram noutras categorias e oferece soluções para cada um.

Erro do VPC Service Controls no método google.storage.buckets.testIamPermissions nos registos de auditoria do Google Cloud

Quando abre a página Detalhes da função na Google Cloud consola, as funções do Cloud Run verificam se pode modificar o repositório de armazenamento da imagem do contentor e aceder ao mesmo publicamente. Para validar, as funções do Cloud Run enviam um pedido para o contentor do Container Registry através do método google.storage.buckets.testIamPermissions com o seguinte formato: [REGION].artifacts.[PROJECT_ID].appspot.com. A única diferença entre as verificações é que uma é executada com autenticação para validar as autorizações do utilizador para modificar o contentor, enquanto a outra verificação é executada sem autenticação para verificar se o contentor está acessível publicamente.

Se o perímetro do VPC Service Controls restringir a API storage.googleapis.com, a Google Cloud consola apresenta um erro no método google.storage.buckets.testIamPermissions nos registos de auditoria do Google Cloud.

A mensagem de erro

Para a verificação de acesso público sem informações de autenticação, os registos de auditoria da política de recusa da VPC SC mostram uma entrada semelhante à seguinte:

"protoPayload": {
  "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
  "status": {
    "code": 7,
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.PreconditionFailure",
        "violations": [
          {
            "type": "VPC_SERVICE_CONTROLS",
  ...
  "authenticationInfo": {},
  "requestMetadata": {
    "callerIp": "END_USER_IP"
  },
  "serviceName": "storage.googleapis.com",
  "methodName": "google.storage.buckets.testIamPermissions",
  "resourceName": "projects/PROJECT_NUMBER",
  "metadata": {
    "ingressViolations": [
      {
        "servicePerimeter": "accessPolicies/ACCESS_POLICY_ID/servicePerimeters/VPC_SC_PERIMETER_NAME",
        "targetResource": "projects/PROJECT_NUMBER"
      }
    ],
    "resourceNames": [
      "projects/_/buckets/REGION.artifacts.PROJECT_ID.appspot.com"
    ],
    "securityPolicyInfo": {
      "servicePerimeterName": "accessPolicies/ACCESS_POLICY_ID/servicePerimeters/VPC_SC_PERIMETER_NAME",
      "organizationId": "ORG_ID"
    },
    "violationReason": "NO_MATCHING_ACCESS_LEVEL",
  ...

Para a verificação de acesso público com informações de autenticação, os registos de auditoria da Política de negação do VPC SC mostram uma entrada que permite ao utilizador modificar as definições do contentor de forma semelhante ao seguinte exemplo:

"protoPayload": {
  "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
  "status": {
    "code": 7,
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.PreconditionFailure",
        "violations": [
          {
            "type": "VPC_SERVICE_CONTROLS",
  ...
  "authenticationInfo": {
    "principalEmail": "END_USER_EMAIL"
  },
  "requestMetadata": {
    "callerIp": "END_USER_IP",
    "requestAttributes": {},
    "destinationAttributes": {}
  },
  "serviceName": "storage.googleapis.com",
  "methodName": "google.storage.buckets.testIamPermissions",
  "resourceName": "projects/PROJECT_NUMBER",
  "metadata": {
    "ingressViolations": [
      {
        "servicePerimeter": "accessPolicies/ACCESS_POLICY_ID/servicePerimeters/VPC_SC_PERIMETER_NAME",
        "targetResource": "projects/PROJECT_NUMBER"
      }
    ],
    "resourceNames": [
      "projects/_/buckets/REGION.artifacts.PROJECT_ID.appspot.com"
    ],
    "securityPolicyInfo": {
      "servicePerimeterName": "accessPolicies/ACCESS_POLICY_ID/servicePerimeters/VPC_SC_PERIMETER_NAME",
      "organizationId": "ORG_ID"
    },
    "violationReason": "NO_MATCHING_ACCESS_LEVEL",
  ...

A solução

Se o contentor do Container Registry não estiver acessível publicamente, pode ignorar os erros do VPC Service Controls.

Em alternativa, pode adicionar uma regra de entrada do VPC Service Controls para permitir o método google.storage.buckets.testIamPermissions, conforme mostrado no exemplo seguinte:

ingress_from {
  sources {
    access_level: "*"
  }
  identity_type: ANY_IDENTITY
}
ingress_to {
  operations {
    service_name: "storage.googleapis.com"
    method_selectors {
      method: "google.storage.buckets.testIamPermissions"
    }
  }
  resources: "projects/PROJECT_NUMBER"
}

Sempre que possível, pode refinar ainda mais a regra de entrada definindo o nível de acesso com endereços IP de utilizadores.