Resolver problemas do Cloud Functions

Este documento mostra alguns dos problemas comuns que podem ser encontrados e como resolvê-los.

Deployment

A fase de implantação é uma fonte frequente de problemas. Muitos dos problemas que podem ser encontrados durante a implantação estão relacionados a papéis e permissões. Outros estão relacionados com a configuração incorreta.

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

Um usuário com o papel de leitor do projeto ou leitor do Cloud Functions tem acesso somente leitura a funções e detalhes da função. Esses papéis não estão autorizados a implantar novas funções.

A mensagem de erro

Console do Cloud

You need permissions for this action. Required permission(s): cloudfunctions.functions.create

SDK do Cloud

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 um papel que tenha o acesso apropriado.

O usuário com papel "Visualizador do projeto" ou "Cloud Function" não pode implantar uma função

Para implantar uma função, um usuário com o papel "Visualizador do projeto", "Desenvolvedor do Cloud Function" ou "Administrador do Cloud Function" precisa ter outro papel.

A mensagem de erro

Console do Cloud

User does not have the iam.serviceAccounts.actAs permission on
<PROJECT_ID>@appspot.gserviceaccount.com required to create function.
You can fix this by running
'gcloud iam service-accounts add-iam-policy-binding <PROJECT_ID>@appspot.gserviceaccount.com --member=user: --role=roles/iam.serviceAccountUser'

SDK do Cloud

ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Forbidden],
message=[Missing necessary permission iam.serviceAccounts.actAs for <USER>
on the service account <PROJECT_ID>@appspot.gserviceaccount.com. Ensure that
service account <PROJECT_ID>@appspot.gserviceaccount.com is a member of the
project <PROJECT_ID>, and then grant <USER> the role 'roles/iam.serviceAccountUser'.
You can do that by running
'gcloud iam service-accounts add-iam-policy-binding <PROJECT_ID>@appspot.gserviceaccount.com --member=<USER> --role=roles/iam.serviceAccountUser'
In case the member is a service account please use the prefix 'serviceAccount:' instead of 'user:'.]

A solução

Atribua ao usuário outro papel, o papel "IAM de usuário da conta de serviço" (roles/iam.serviceAccountUser), na conta de serviço do ambiente de execução do Cloud Functions.

Conta de serviço de implantação sem o papel "Agente de serviço" ao implantar funções

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 no projeto. Por padrão, essa conta recebe o papel cloudfunctions.serviceAgent do Cloud Functions. Esse papel é obrigatório para integrações do Cloud Pub/Sub, do IAM, do Cloud Storage e do Firebase. Se você tiver alterado o papel dessa conta de serviço, a implantação falhará.

A mensagem de erro

Console do Cloud

Missing necessary permission resourcemanager.projects.getIamPolicy for
serviceAccount:service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com on project <PROJECT_ID>.
Please grant serviceAccount:service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com
the roles/cloudfunctions.serviceAgent role. You can do that by running
'gcloud projects add-iam-policy-binding <PROJECT_ID> --member=serviceAccount:service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com --role=roles/cloudfunctions.serviceAgent'

SDK do Cloud

ERROR: (gcloud.functions.deploy) OperationError: code=7,
message=Missing necessary permission resourcemanager.projects.getIamPolicy
for serviceAccount:service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com
on project <PROJECT_ID>. Please grant
serviceAccount:service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com
the roles/cloudfunctions.serviceAgent role. You can do that by running
'gcloud projects add-iam-policy-binding <PROJECT_ID> --member=serviceAccount:service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com --role=roles/cloudfunctions.serviceAgent'

A solução

Redefinir essa conta de serviço para o papel padrão.

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 Cloud Pub/Sub para configurar tópicos e assinaturas. Se o papel atribuído à conta de serviço for alterado e as permissões apropriadas não forem concedidas, o serviço Cloud Functions não poderá acessar o Cloud Pub/Sub, e a implantação falhará.

A mensagem de erro

Console do Cloud

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

SDK do Cloud

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

A solução

É possível:

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

Quando uma conta de serviço de ambiente de execução gerenciada pelo usuário não é especificada, as funções de primeira geração assumem como padrão usar a conta de serviço do App Engine como a conta de serviço do ambiente de execução. Se essa conta padrão tiver sido excluída e nenhuma conta gerenciada pelo usuário for especificada, as implantações vão falhar.

A mensagem de erro

Console do Cloud

Default service account '<PROJECT_ID>@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.

SDK do Cloud

ERROR: (gcloud.functions.deploy) ResponseError: status=[400], code=[Ok], message=[Default service account '<PROJECT_ID>@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

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

Nos ambientes em que várias funções acessam recursos diferentes, é recomendável usar identidades por função, com contas de serviço do ambiente de execução nomeadas, em vez da padrão. (PROJECT_ID@appspot.gserviceaccount.com).

No entanto, para usar uma conta de serviço do ambiente de execução não padrão, o implantador precisa ter a permissão iam.serviceAccounts.actAs nessa conta não padrã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.

A mensagem de erro

SDK do Cloud

ERROR: (gcloud.functions.deploy) ResponseError: status=[400], code=[Bad Request],
message=[Invalid function service account requested: <SERVICE_ACCOUNT_NAME@<PROJECT_ID>.iam.gserviceaccount.com]

A solução

Atribua ao usuário o papel roles/iam.serviceAccountUser na conta de serviço do ambiente de execução <SERVICE_ACCOUNT_NAME> não padrão. Esse papel inclui a permissão iam.serviceAccounts.actAs.

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

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

A mensagem de erro

Console do Cloud

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.

SDK do Cloud

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

É possível:

  • Redefinir essa conta de serviço para o papel padrão.

    ou

  • conceder à conta de serviço do ambiente de execução o papel cloudfunctions.serviceAgent;

    ou

  • conceder à conta de serviço do ambiente de execução as permissões storage.buckets.{get, update} e resourcemanager.projects.get.

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

Para garantir que desenvolvedores não autorizados não modifiquem as configurações de autenticação para invocações de função, o usuário ou serviço que está implantando a função precisa ter a permissão cloudfunctions.functions.setIamPolicy.

A mensagem de erro

SDK do Cloud

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

É possível:

A implantação da função falha porque o Cloud Build não tem compatibilidade com o VPC-SC

O Cloud Functions usa o Cloud Build para criar o código-fonte em um contêiner executável. Para usar o Cloud Functions com o VPC Service Controls, é necessário configurar um nível de acesso para a conta de serviço do Cloud Build no perímetro de serviço.

A mensagem de erro

Console do Cloud

Uma das seguintes opções:

Error in the build environment

OR

Unable to build your function due to VPC Service Controls. The Cloud Build
service account associated with this function needs an appropriate access
level on the service perimeter. Please grant access to the Cloud Build
service account: '{PROJECT_NUMBER}@cloudbuild.gserviceaccount.com' by
following the instructions at
https://cloud.google.com/functions/docs/securing/using-vpc-service-controls#grant-build-access"

SDK do Cloud

Uma das seguintes opções:

ERROR: (gcloud.functions.deploy) OperationError: code=13, message=Error in
the build environment

OR

Unable to build your function due to VPC Service Controls. The Cloud Build
service account associated with this function needs an appropriate access
level on the service perimeter. Please grant access to the Cloud Build
service account: '{PROJECT_NUMBER}@cloudbuild.gserviceaccount.com' by
following the instructions at
https://cloud.google.com/functions/docs/securing/using-vpc-service-controls#grant-build-access"

A solução

Se os registros de recursos auditados do projeto mencionarem "A solicitação é proibida pela política da organização" na seção VPC Service Controls e tiver um rótulo do Cloud Storage, será necessário conceder à conta de serviço do Cloud Build acesso ao perímetro do VPC Service Controls.

A implantação da função falha porque o ponto de entrada foi especificado incorretamente

A implantação do Cloud Functions pode falhar se o ponto de entrada do código, ou seja, o nome da função exportada, não for especificado corretamente.

A mensagem de erro

Console do Cloud

Deployment failure: Function failed on loading user code. Error message:
Error: please examine your function logs to see the error cause:
https://cloud.google.com/functions/docs/monitoring/logging#viewing_logs

SDK do Cloud

ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Function
failed on loading user code. Error message: Please examine your function
logs to see the error cause:
https://cloud.google.com/functions/docs/monitoring/logging#viewing_logs

A solução

O código-fonte precisa conter uma função de ponto de entrada que foi especificada corretamente na implantação, seja por meio do Console do Cloud ou do SDK do Cloud.

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 locais de recursos, você poderá ver esse erro nos registros. Ele indica que o pipeline de implantação não conseguiu criar um bucket de armazenamento multirregional.

A mensagem de erro

Nos registros do Cloud Build:

Token exchange failed for project '<PROJECT_ID>'.
Org Policy Violated: '<REGION>' violates constraint 'constraints/gcp.resourceLocations'

Nos registros do Cloud Storage:

<REGION>.artifacts.<PROJECT_ID>.appspot.com` storage bucket could not be created.

A solução

Se você estiver usando constraints/gcp.resourceLocations nas restrições da política da organização, especifique o local multirregional apropriado. Por exemplo, se você estiver implantando em uma das regiões us, use us-locations.

No entanto, se você precisar de um controle mais refinado e quiser restringir a implantação de funções em uma única região (não em várias regiões), primeiro crie o bucket multirregional:

  1. Permita toda a multirregião
  2. Implante uma função de teste
  3. Após a conclusão da implantação, altere a política da organização para permitir apenas a região específica.

O bucket de armazenamento multirregional permanece disponível para essa região para que as implantações subsequentes possam ser bem-sucedidas. Se mais tarde você decidir allowlist uma região fora da região em que o bucket de armazenamento multirregional foi criado, repita o processo.

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

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 ver uma mensagem de erro mais detalhada, verifique os registros da versão da sua função, bem como 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. Além disso, é possível tentar aumentar o tempo limite da função.

Criar

Quando você implanta o código-fonte da função no Cloud Functions, essa origem é armazenada em um bucket do Cloud Storage. Em seguida, o Cloud Build cria o código automaticamente em uma imagem de contêiner e envia essa imagem para o Container Registry. O Cloud Functions acessa essa imagem quando precisa executar o contêiner para executar a função.

Falha na criação devido a ausência de imagens do Container Registry

O Cloud Functions (1a geração) usa o Container Registry para gerenciar imagens das funções. O Container Registry usa o Cloud Storage para armazenar as camadas das imagens em buckets chamados STORAGE-REGION.artifacts.PROJECT-ID.appspot.com. O uso do Gerenciamento do ciclo de vida de objetos nesses buckets interrompe a implantação das funções, porque as implantações dependem dessas imagens.

A mensagem de erro

Console do Cloud

Build failed: Build error details not available. Please check the logs at
<CLOUD_CONSOLE_LINK>

CLOUD_CONSOLE_LINK contains an error like below :
failed to get OS from config file for image 'us.gcr.io/<PROJECT_ID>/gcf/us-central1/<UUID>/worker:latest'"

SDK do Cloud

ERROR: (gcloud.functions.deploy) OperationError: code=13, message=Build
failed: Build error details not available. Please check the logs at
<CLOUD_CONSOLE_LINK>

CLOUD_CONSOLE_LINK contains an error like below :
failed to get OS from config file for image 'us.gcr.io/<PROJECT_ID>/gcf/us-central1/<UUID>/worker:latest'"

A solução

  1. Desative o gerenciamento do ciclo de vida nos buckets exigidos pelo Container Registry.
  2. Exclua todas as imagens das funções afetadas. Acesse registros de criação para encontrar os caminhos da imagem. Use o script de referência para excluir as imagens em massa. Observe que isso não afeta as funções implantadas atualmente.
  3. Reimplantar as funções.

Disponibilização

A fase de disponibilização também pode ser uma fonte de erros.

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. Essa mensagem de erro indica que o autor da chamada não tem permissão para invocar a função.

A mensagem de erro

Código de resposta de erro HTTP: 403 Forbidden

Corpo da resposta de erro HTTP: Error: Forbidden O cliente não tem permissão para receber o URL /<FUNCTION_NAME> desse servidor.

A solução

É possível:

  • Implantar a função para permitir invocações não autenticadas se for compatível com a sua organização. Isso pode ser útil para fins de teste.

  • 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 com gcloud da seguinte maneira:

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

    Consulte Como autenticar para invocação

  • Para o Cloud Functions (1a geração), permita o acesso público (não autenticado) a todos os usuários para a função específica.

  • Para o Cloud Functions (2ª geração), é possível realizar uma das seguintes ações:

    • Atribua ao usuário o papel de Invocador do Cloud Run do Cloud IAM para a função específica.

    • No console do Google Cloud:

      Acessar o Console do Google Cloud

      1. Clique no nome do link da função para que você quer conceder acesso.

      2. Clique no link Powered by Cloud Run no link no canto superior direito da página de visão geral dos detalhes da função.

      3. Clique em Acionador e selecione Permitir invocações não autenticadas.

      4. Clique em Save.

Erro de permissão de exibição devido à configuração "permitir somente o tráfego interno"

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 a configuração "Permitir somente tráfego interno" da rede de entrada estiver definida, essa mensagem de erro indicará 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: 403 Forbidden

Corpo da resposta de erro HTTP: Error 403 (Forbidden) 403. Ocorreu um erro. O acesso é proibido. Isso é tudo que sabemos.

A solução

É possível:

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

    ou

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

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

Para invocar uma função do Cloud Functions que foi configurada com acesso restrito, requer um token de ID. Os tokens de acesso ou atualizar não funcionam.

A mensagem de erro

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

Corpo da resposta de erro HTTP: seu cliente não tem permissão para o URL solicitado

A solução

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ê estiver gerando 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, seguindo este guia.

Tentativa de invocar a função usando redirecionamentos curl para a página de login do Google

Se você tentar invocar uma função que não existe, o Cloud Functions responderá com um redirecionamento HTTP/2 302, que levará você à página de login da Conta do Google. Incorreto. Ele responderá com um código de resposta de erro HTTP/2 404. O problema está sendo resolvido.

A solução

Especifique o nome da função corretamente. Você sempre pode verificar usando gcloud functions call, que retorna o erro 404 correto para uma função ausente.

Falhas no aplicativo e falha na execução da função

Esse erro indica que o processo que executa a função foi eliminado. Geralmente, isso ocorre devido a falhas no tempo de execução devido a problemas no código da função. Isso também pode acontecer quando um impasse ou alguma outra condição no código da função faz com que o ambiente de execução pare de responder às solicitações recebidas.

A mensagem de erro

Nos registros do Cloud Logging: "A infraestrutura não se comunica com a função. Provavelmente houve uma falha ou impasse no código fornecido pelo usuário."

A solução

Diferentes ambientes de execução podem falhar em diferentes cenários. Para encontrar a causa principal, gere registros detalhados do nível de depuração, verifique a lógica do seu aplicativo e teste para casos extremos.

O ambiente de execução do Python 37 do Cloud Functions tem atualmente uma limitação conhecida na taxa que pode lidar com a geração de registros. Se as instruções de registro de uma instância de ambiente de execução do Python37 forem gravadas a uma taxa suficientemente alta, esse erro poderá ser gerado. As versões do ambiente de execução do Python >= 3.8 não têm essa limitação. Recomendamos que os usuários migrem para uma versão superior do ambiente de execução do Python para evitar esse problema.

Se você ainda tiver dúvidas sobre a causa do erro, confira nossa página de suporte.

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 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)
  • acionar exceções e/ou 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 todas as tarefas assíncronas, verifique se a função está sinalizando corretamente o Cloud Functions quando ela for concluída. Verifique se você executou uma das operações listadas acima assim que a função tiver concluído as tarefas assíncronas.

Pilha de JavaScript sem memória

Para funções do Node.js 12+ com limites de memória maiores que 2 GiB, os usuários precisam configurar NODE_OPTIONS para ter max_old_space_size. Assim, o limite de heap do JavaScript é equivalente ao limite de memória da função.

A mensagem de erro

Console do Cloud

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory

A solução

Implante a função Node.js 12+ com NODE_OPTIONS configurado para definir max_old_space_size como o limite de memória da função. Exemplo:

gcloud functions deploy envVarMemory \
--runtime nodejs20 \
--set-env-vars NODE_OPTIONS="--max_old_space_size=8192" \
--memory 8Gi \
--trigger-http

Função encerrada

Você talvez verá uma das mensagens de erro a seguir quando o processo que executa o código for encerrado devido a um erro de tempo de execução ou uma saída deliberada. Há também uma pequena chance de que ocorra um erro raro de infraestrutura.

As mensagens de erro

A invocação de função foi interrompida. Erro: função encerrada. Ação recomendada: inspecionar registros em busca do motivo do encerramento. Mais informações sobre solução de problemas podem ser encontradas no Logging.

Solução rejeitada. Erro: função encerrada. Ação recomendada: inspecionar registros em busca do motivo do encerramento. Mais informações sobre solução de problemas podem ser encontradas no Logging.

Não é possível inicializar a função. Erro: função encerrada. Ação recomendada: inspecionar registros em busca do motivo do encerramento. Mais informações sobre solução de problemas podem ser encontradas no Logging.

A solução

  • Para uma função de segundo plano (Pub/Sub acionada) quando um executionID está associado à solicitação que foi encerrada devido a um erro, tente ativar Tentar novamente em caso de falha. Isso permite a repetição da execução da função quando uma exceção recuperável é gerada. Para mais informações sobre como usar essa opção com segurança, incluindo mitigações para evitar loops infinitos de tentativas e gerenciamento de erros passíveis de recuperação/fatais, consulte as Práticas recomendadas.

  • A atividade em segundo plano (qualquer coisa que acontece depois que sua função é encerrada) pode causar problemas, portanto, verifique seu código. O Cloud Functions não garante nenhuma ação além daquelas executadas durante o período de execução da função. Portanto, mesmo que uma atividade seja executada em segundo plano, ela poderá ser encerrada pelo processo de limpeza.

  • Nos casos em que houver um pico repentino de tráfego, tente distribuir a carga de trabalho por mais tempo. Teste também as funções localmente usando o Functions Framework antes de implantar no Cloud Functions para garantir que o erro não seja causado por dependências conflitantes ou ausentes.

Erro de ambiente de execução ao acessar recursos protegidos pela VPC-SC

Por padrão, o Cloud Functions usa endereços IP públicos para fazer solicitações de saída a outros serviços. Se as funções não estiverem dentro de um perímetro do VPC Service Controls, isso poderá fazer com que elas recebam respostas HTTP 403 ao tentar acessar serviços do Google Cloud protegidos pelo VPC-SC devido às 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

Adicione o Cloud Functions no seu projeto do Google Cloud como um recurso protegido no perímetro de serviço e implante funções compatíveis com o VPC-SC. Consulte Como usar o VPC Service Controls para mais informações.

Como alternativa, se o projeto do Cloud Functions não puder ser adicionado ao perímetro de serviço, consulte Como usar o VPC Service Controls com funções fora de um perímetro.

Escalabilidade

Problemas de escalonamento relacionados à infraestrutura do Cloud Functions podem surgir em várias circunstâncias.

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

  • Um grande aumento repentino no tráfego
  • Um longo tempo de inicialização a frio
  • Um longo tempo de processamento de solicitação
  • Alta taxa de erros da função.
  • Atingir o limite máximo de instâncias e, portanto, o sistema não pode escalonar ainda mais.
  • Fatores temporários atribuídos ao serviço do Cloud Functions.

Em cada caso, o Cloud 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
    • severity=WARNING ( Código de resposta: 429 ) O Cloud Functions não pode ser escalonado devido ao limite max-instances que você definiu durante a configuração.
    • severity=ERROR ( Código de resposta: 500) O Cloud Functions não pode gerenciar a taxa de tráfego intrinsecamente.

A solução

  • Para funções baseadas em gatilho HTTP, faça com que o cliente implemente a espera exponencial e tente novamente para solicitações que não podem ser descartadas. Se você estiver acionando o Cloud Functions do Workflows, use a sintaxe try/retry para fazer isso.
  • Para funções em segundo plano ou orientadas por eventos, o Cloud Functions é compatível com a 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. Consulte Como repetir funções orientadas por eventos para mais informações.
  • Quando a causa raiz do problema for um período de erros transitórios elevados atribuídos exclusivamente ao Cloud Functions ou se você precisar de ajuda para resolver o problema, entre em contato com o suporte.

Logging

Configurar a geração de registros para identificar problemas que podem causar outros problemas.

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

O Cloud Functions inclui por padrão a geração simples 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 string simples.

A mensagem de erro

Níveis de gravidade incorretos ou inexistentes.

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.

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.

A função do Cloud está retornando erros, mas os registros estão ausentes

Os registros de funções do Cloud são transmitidos para um bucket padrão criado e ativado quando um projeto é criado. Se o bucket padrão estiver desativado ou se os registros da Função do Cloud estiverem no filtro de exclusão, eles não aparecerão no Explorador de registros.

A solução

Verifique se os registros padrão estão ativados.

Os registros do Cloud Functions não estão aparecendo no Explorador 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 no Explorador 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 do Cloud Functions não estão aparecendo no coletor do roteador de registros

As entradas de registro são roteadas para vários destinos usando coletores do roteador de registros.

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 simplesmente descartadas.

Captura de tela do pop-up de detalhes do coletor do roteador de registros no console. A imagem mostra o filtro de exclusão

A solução

Verifique se nenhum filtro de exclusão está definido como resource.type="cloud_functions".

Conexões do Database

Há diversos problemas que podem surgir ao se conectar a um banco de dados. Muitos estão associados ao exceder limites de conexão ou tempo limite. Se aparecer um aviso do Cloud SQL nos seus registros, como "prazo de contexto excedido", talvez seja necessário ajustar a configuração de conexão. Consulte os documentos do Cloud SQL para mais detalhes.

Rede

Conectividade de rede

Se todas as solicitações de saída de uma função do Cloud 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.

A solução

Liste suas sub-redes para verificar se o conector usa uma máscara de sub-rede /28.

Caso contrário, recrie ou crie um novo conector para usar uma sub-rede /28. Observe as considerações a seguir:

  • 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.

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.

A solução

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