Resolver problemas nas funções do Cloud Run (1ª geração)

Este documento mostra como resolver mensagens de erro e problemas ao usar o Cloud Run functions (1ª geração).

Implantação

Nesta seção, listamos problemas de implantação que você pode encontrar e fornecemos sugestões de como corrigir cada um deles. Muitos dos problemas que podem ser encontrados durante a implantação estão relacionados a papéis e permissões ou configuração incorreta..

A conta de serviço de implantação não tem permissões do Pub/Sub ao implantar uma função orientada a 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) ao executar ações administrativas. Por padrão, essa conta recebe o papel cloudfunctions.serviceAgent do Cloud Functions. Para implantar funções orientadas a eventos, é necessário que o serviço Cloud Functions acesse o Pub/Sub para configurar tópicos e assinaturas. Se o papel atribuído à conta de serviço mudar e as permissões apropriadas não forem atualizadas, o serviço Cloud Functions não poderá acessar o Pub/Sub, e a implantação falhará.

A mensagem de erro

Console

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

É possível redefinir a conta de serviço para o papel cloudfunctions.serviceAgent padrão.

A conta de serviço padrão do ambiente de execução não existe

Quando uma conta de serviço gerenciada pelo usuário não é especificada, as funções do Cloud Run (1ª geração) usam a conta de serviço do App Engine por padrão. As implantações vão falhar se você excluir a conta padrão sem especificar uma conta de serviço gerenciada pelo usuário.

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 esse problema, siga uma destas soluções:

Usuário sem permissões da conta de serviço do ambiente de execução ao implantar uma função

Cada função é associada a uma conta de serviço que serve como identidade quando a função acessa outros recursos. Essa conta de serviço de ambiente de execução pode ser a conta de serviço padrão ou uma conta de serviço gerenciada pelo usuário. Para que o Cloud Functions use uma conta de serviço do ambiente de execução, o implantador precisa ter a permissão iam.serviceAccounts.actAs nessa conta de serviço. Um usuário que cria uma conta de serviço no ambiente de execução não padrão recebe automaticamente essa permissão, mas outros implantadores precisam que um usuário com as permissões corretas conceda essa permissão.

Um usuário com o papel de leitor do projeto, desenvolvedor do Cloud Functions ou administrador do Cloud Functions também precisa ter a permissão iam.serviceAccounts.actAs na conta de serviço do ambiente de execução.

A mensagem de erro

Console

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

O seguinte erro ocorre na conta de serviço padrão:

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:'.

O seguinte erro ocorre na conta de serviço não padrão:

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 o papel roles/iam.serviceAccountUser ao usuário na conta de serviço padrão ou gerenciada pelo usuário. Esse papel inclui a permissão iam.serviceAccounts.actAs.

A conta de serviço do agente de serviço do Cloud Run functions não tem permissões de bucket de projeto ao implantar uma função

O Cloud Run functions só pode ser acionado por eventos dos buckets do Cloud Storage no mesmo projeto do Google Cloud. 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 do papel cloudfunctions.serviceAgent no projeto.

A mensagem de erro

Console

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 esse erro, redefina a conta de serviço do agente de serviço para o papel padrão.

O usuário com papel de "Editor do projeto" não pode tornar a função pública

O papel de editor do projeto tem permissões amplas para gerenciar recursos em um projeto, mas não concede a capacidade de tornar as funções do Cloud Run públicas. É necessário conceder a permissão cloudfunctions.functions.setIamPolicy ao usuário ou ao serviço que implanta 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 esse erro, siga uma destas soluções:

A implantação da função falha ao usar a política da organização de restrição de locais de recursos

Se a organização usar uma política de Restrição de local de recursos, ela vai restringir a implantação da função nas regiões restritas pela política. No console do Google Cloud, a região restrita não estará disponível no menu suspenso de regiões durante a implantaçã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 locais das listas allowed_values ou denied_values da restrição de locais do recurso para uma implantação bem-sucedida.

A implantação da função falha ao executar o escopo global da função

Esse erro indica que houve um problema com o código. O pipeline de implantação terminou de implantar a função, mas falhou na última etapa: enviar uma verificação de integridade à função. Essa verificação de integridade visa executar o escopo global de uma função, que pode gerar exceções, falhas ou tempos limite. O escopo global é onde você normalmente carrega em bibliotecas e inicializa clientes.

A mensagem de erro

Console

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 registros 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 esse problema, siga uma destas soluções:

  • Para uma mensagem de erro mais detalhada, analise os registros da versão e os registros do ambiente de execução da função.

  • Se não estiver claro por que sua função não executou o escopo global, mova temporariamente o código para a invocação de solicitação usando a inicialização lenta das variáveis globais. Isso permite adicionar declarações de registro extras em torno das bibliotecas de cliente, o que pode esgotar a instanciação (principalmente se elas estiverem chamando outros serviços) ou falhar/falhar exceções.

  • Aumente o tempo limite da função.

  • O código-fonte precisa conter uma função de ponto de entrada que foi especificada corretamente na implantação, seja pelo console ou pelo gcloud.

O usuário com o papel de leitor não pode implantar uma função

Os usuários com o papel de leitor do projeto ou leitor do Cloud Functions têm acesso somente leitura a funções e detalhes da função e não podem implantar novas funções. O recurso Criar função fica esmaecido no console do Google Cloud 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 usuário o papel de Desenvolvedor do Cloud Functions.

A conta de serviço do build não tem permissões

A mensagem de erro

No erro de implantação da função ou nos logs de build, talvez você encontre 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 build precisa ter permissão para ler o bucket de origem e permissões de leitura e gravação para o repositório de implantação de artefatos. Você pode encontrar esse erro devido a uma mudança no comportamento padrão de como o Cloud Build usa contas de serviço, detalhada em Alteração da conta de serviço do Cloud Build.

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

Conta de serviço de build 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 do build precisa estar ativada para implantar uma função. Você pode encontrar esse erro devido a uma mudança no comportamento padrão de como o Cloud Build usa contas de serviço, detalhada em Alteração da conta de serviço do Cloud Build.

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

Disponibilização

Nesta seção, listamos problemas de disponibilização que você pode encontrar e fornecemos sugestões de como corrigir cada um deles.

Erro de permissão de disponibilização devido à função que exige autenticação

As funções HTTP sem Permitir invocações não autenticadas ativaram o acesso restrito a usuários finais e contas de serviço que não têm as permissões apropriadas.

O acesso ao URL das funções do Cloud Run em um navegador não adiciona um cabeçalho de autenticação automaticamente.

A mensagem de erro

Código de resposta de erro HTTP: 403 Forbidden

Corpo da resposta de erro HTTP:

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

A solução

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

Erro de permissão de exibição devido à configuração allow internal traffic only

As configurações de entrada restringem se uma função HTTP pode ser invocada por recursos fora do projeto do Google Cloud ou pelo perímetro de serviço do VPC Service Controls. Quando você configura a configuração Permitir somente tráfego interno para a rede de entrada, essa mensagem de erro indica que apenas as solicitações de redes VPC no mesmo projeto ou no perímetro do VPC Service Controls são permitidas.

A mensagem de erro

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

Corpo da resposta de erro HTTP:

404 Page not found

A solução

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

  • verificar se a solicitação é proveniente do projeto do Google Cloud ou do perímetro de serviço do VPC Service Controls.

  • alterar as configurações de entrada para permitir todo o tráfego da função.

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

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

As funções configuradas com acesso restrito precisam de um token de ID. A invocação de função falha se você usar tokens de acesso ou tokens de atualização.

A mensagem de erro

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

Corpo da resposta de erro HTTP:

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

A solução

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

  • Verifique se suas solicitações incluem um cabeçalho Authorization: Bearer ID_TOKEN e se o token é um token de ID, não um token de acesso ou de atualização. Se você gerar esse token manualmente com a chave privada de uma conta de serviço, troque o token JWT autoassinado por um token de identidade assinado pelo Google. Para mais informações, consulte Autenticar para invocação.

  • Invoque sua função HTTP usando credenciais de autenticação no cabeçalho da solicitação. Por exemplo, é possível receber um token de identidade usando o gcloud da seguinte maneira:

    curl  -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
      https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME

    Para mais informações, consulte Como autenticar para invocação.

A função é interrompida no meio da execução ou continua a ser executada após a conclusão do código

Alguns ambientes de execução do Cloud Run functions permitem que os usuários executem tarefas assíncronas. Se a função criar essas tarefas, também precisará esperar explicitamente que elas sejam concluídas. Caso contrário, sua função pode parar de ser executada na hora errada.

O comportamento do erro

Sua função exibe um dos seguintes comportamentos:

  • A função termina enquanto tarefas assíncronas ainda estão em execução, mas antes do tempo limite especificado ter decorrido.
  • A função não para de ser executada quando essas tarefas terminam e continua a ser executada até que o tempo limite tenha decorrido.

A solução

Se a função for encerrada com antecedência, verifique se todas as tarefas assíncronas dela foram concluídas antes de:

  • retornar um valor;
  • resolver ou rejeitar um objeto Promise retornado (somente funções do Node.js);
  • gerar exceções e erros não detectados;
  • enviar uma resposta HTTP;
  • chamar uma função de callback.

Se a função não for encerrada após a conclusão de tarefas assíncronas, verifique se ela está sinalizando corretamente as funções do Cloud Run após a conclusão. Verifique se você executou uma das operações listadas na lista anterior assim que a função tiver concluído as tarefas assíncronas.

Erro de execução ao acessar recursos protegidos pelo VPC Service Controls

Por padrão, o Cloud Run functions usa endereços IP públicos para fazer solicitações de saída a outros serviços. As funções que não estão dentro do perímetro do VPC Service Controls podem receber respostas HTTP 403 ao tentar acessar serviços do Google Cloud protegidos pelo VPC Service Controls devido a negações do perímetro de serviço.

A mensagem de erro

Nos registros de Recursos auditados, uma entrada como a 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 esse erro, siga uma destas soluções:

Escalonabilidade

Esta seção lista problemas de escalonabilidade e fornece sugestões de como corrigir cada um deles.

Erros do Cloud Logging relacionados a cancelamentos de solicitações de filas pendentes

As condições a seguir podem ser associadas a falhas de escalonamento.

Em cada caso, o Cloud Run functions pode não escalonar rapidamente o suficiente para gerenciar 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

  • Para funções baseadas em gatilho HTTP, implemente a espera exponencial e tente novamente para solicitações que não podem ser descartadas. Se você estiver acionando o Cloud Run functions do Workflows, use a sintaxe try/retry para fazer isso.
  • Para funções em segundo plano ou orientadas a eventos, o Cloud Run oferece suporte à entrega pelo menos uma vez. Mesmo sem ativar explicitamente a nova tentativa, o evento é reenviado automaticamente, e a execução da função será repetida. Para mais informações, consulte Ativar repetições de funções orientadas a eventos.
  • Quando a causa raiz do problema for um período de erros temporários elevados atribuídos exclusivamente às funções do Cloud Run ou se você precisar de ajuda para resolver o problema, entre em contato com o Cloud Customer Care.

Geração de registros

A seção a seguir aborda problemas com o registro e como corrigi-los.

As entradas de registro têm níveis de gravidade incorretos ou não os têm

O Cloud Run functions inclui por padrão a geração de registros do ambiente de execução. Os registros gravados em stdout ou stderr aparecem automaticamente no console do Google Cloud. Mas essas entradas de registro, por padrão, contêm apenas mensagens de stringles.

A solução

Para incluir a gravidade do registro, é preciso enviar uma entrada de registro estruturada.

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

Convém personalizar a forma como você gerencia e registra as informações de falhas.

A solução

Encapsule a função como try para personalizar exceções de processamento e registrar stack traces.

A adição de um bloco try pode resultar em um efeito colateral não intencional em funções orientadas a eventos com a configuração retry on failure. A repetição de eventos com falha também 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!'

Registros muito grandes no Node.js 10 e versões superiores, Python 3.8, Go 1.13 e Java 11

O tamanho máximo de uma entrada de registro regular nesses ambientes de execução é de 105 KiB.

A solução

Envie entradas de registro menores que esse limite.

Registros ausentes, apesar de as funções do Cloud Run retornarem erros

As funções do Cloud Run transmitem os registros de funções do Cloud Run para um bucket padrão. Quando você cria um projeto, as funções do Cloud Run criam e ativam o bucket padrão. Se o bucket padrão estiver desativado ou se os registros da função do Cloud Run estiverem no filtro de exclusão, eles não vão aparecer na Análise de registros.

A solução

Ative os registros padrão e verifique se nenhum filtro de exclusão está definido.

Os registros de funções do Cloud Run não aparecem na Análise de registros

Algumas bibliotecas de cliente do Cloud Logging usam um processo assíncrono para gravar entradas de registro. Se uma função falhar ou for encerrada de outra forma, é possível que algumas entradas de registro ainda não tenham sido gravadas e apareçam posteriormente. Também é possível que alguns registros sejam perdidos e não sejam vistos na Análise de registros.

A solução

Use a interface da biblioteca de cliente para limpar as entradas de registro em buffer antes de sair da função ou use a biblioteca para gravar entradas de registro de forma síncrona. Também é possível gravar registros de maneira síncrona diretamente em stdout ou stderr.

Os registros de funções do Cloud Run não estão aparecendo ao usar o coletor do roteador de registros

O Log Router encaminha rotas de entradas de registro para vários destinos.

Captura de tela do roteador de registros do console com uma visualização que tem detalhes do coletor destacados

Incluídos nas configurações estão os filtros de exclusão, que definem as entradas que podem ser descartadas.

Captura de tela da caixa de diálogo de detalhes do coletor do roteador de registros no console. A imagem mostra o filtro de exclusão

A solução

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

Conexões de banco de dados

Muitos erros de banco de dados estão associados ao exceder limites de conexão ou ao tempo limite. Se aparecer um aviso do Cloud SQL nos seus registros, como Context deadline exceeded, talvez seja necessário ajustar a configuração de conexão. Para mais informações, consulte Práticas recomendadas do Cloud SQL.

Rede

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

Conectividade de rede

Se todas as solicitações de saída de uma função do Cloud Run falharem após a configuração das configurações de saída, você poderá executar testes de conectividade para identificar qualquer problema de conectividade de rede. Para mais informações, consulte Criar e executar testes de conectividade.

O conector de acesso VPC sem servidor não está pronto ou não existe

Se um conector de acesso VPC sem servidor falhar, talvez ele não esteja usando uma máscara de sub-rede /28 dedicada ao conector 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 implantadas com um conector em um estado inválido devido à falta de permissão na conta de serviço do agente de serviço das APIs do Google PROJECT_NUMBER@cloudservices.gserviceaccount.com, o resultado é o seguinte erro:

A mensagem de erro

Failed to prepare VPC connector. Please try again later.

A solução

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

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

  • Se você recriar o conector, não precisará reimplantar outras funções. Pode haver uma interrupção de rede à medida que o conector é recriado.

  • Se você criar um novo conector alternativo, reimplante suas funções para usar o novo conector e exclua o conector original. Esse método evita a interrupção da rede.

  • Verifique se as funções do Cloud Run e o conector associado estão implantados na mesma região.

  • Para a configuração da VPC compartilhada:

    • Verifique se 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 VPC para provisionar recursos no projeto não têm permissões. Essas contas de serviço precisam ter o papel roles/compute.networkUser no projeto host da configuração da VPC compartilhada quando o conector está no projeto de serviço. Caso contrário, roles/compute.networkAdmin é obrigatório.

    • Se o conector for criado no projeto host, verifique se o papel Serverless VPC Access User foi concedido em Cloud Run functions Service Agent no projeto host.

    • Se o status do conector mostrar um erro Connector is in a bad state, manual deletion recommended e o agente de serviço de APIs do Google não tiver as permissões necessárias para provisionar 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 ser necessário recriar o conector depois de atualizar as permissões.

O tráfego SMTP para endereços IP de destino externos usando a porta TCP 25 está bloqueado

Para maior segurança, o Google Cloud bloqueia conexões com a porta de destino TCP 25 ao enviar e-mails de funções do Cloud Run.

A solução

Para desbloquear essas conexões, escolha uma das seguintes opções:

Outro

Esta seção descreve outros problemas que não se encaixam em outras categorias e oferece soluções para cada um deles.

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

Quando você abre a página Detalhes da função no console do Google Cloud, o Cloud Run functions verifica se é possível modificar o repositório de armazenamento da imagem do contêiner e acessá-lo publicamente. Para verificar, o Cloud Run functions envia uma solicitação para o bucket do Container Registry usando o 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 verificar as permissões do usuário para modificar o bucket, enquanto a outra é executada sem autenticação para verificar se o bucket é acessível publicamente.

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

A mensagem de erro

Para a verificação de acesso público sem informações de autenticação, os registros de auditoria da política de negação do VPC SC mostram uma entrada semelhante a esta:

"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 registros de auditoria da política de negação do VPC SC mostram uma entrada que permite ao usuário modificar as configurações do bucket de maneira semelhante ao exemplo a seguir:

"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 bucket do Container Registry não for acessível publicamente, ignore os erros do VPC Service Controls.

Como alternativa, adicione uma regra de entrada do VPC Service Controls para permitir o método google.storage.buckets.testIamPermissions, conforme mostrado no exemplo abaixo:

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, refine a regra de entrada definindo o nível de acesso com os endereços IP do usuário.