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:
Especifique uma conta de serviço de tempo de execução gerida pelo utilizador quando implementar a sua função.
Recrie a conta de serviço predefinida PROJECT_ID@appspot.gserviceaccount.com para o seu projeto.
Anule a eliminação da conta de serviço predefinida.
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:
Atribua ao implementador a função de proprietário do projeto ou a função de administrador das Cloud Functions, ambas com a autorização
cloudfunctions.functions.setIamPolicy
.Conceda a autorização manualmente criando uma função personalizada.
Verifique se a partilha restrita por domínio é aplicada no projeto.
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:
- Crie uma conta de serviço de compilação personalizada para implementações de funções.
- Adicione a
função de conta de serviço do Cloud Build
(
roles/cloudbuild.builds.builder
) à conta de serviço predefinida do Compute. - Reveja as orientações do Cloud Build sobre as alterações à conta de serviço predefinida e desative estas alteraçõ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:
- Crie uma conta de serviço de compilação personalizada para implementações de funções.
- Ative a conta de serviço do Compute predefinida.
- Reveja as orientações do Cloud Build sobre as alterações à conta de serviço predefinida e desative estas alteraçõ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:
Atribua ao utilizador a função Invocador das funções do Cloud Run.
Volte a implementar a sua função para permitir invocações não autenticadas se a sua organização o suportar. Isto pode ser útil para fins de teste.
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:
Certifique-se de que os seus pedidos incluem um cabeçalho
Authorization: Bearer ID_TOKEN
e que o token é um token de ID e não um token de acesso ou de atualização. Se gerar este token manualmente com a chave privada de uma conta de serviço, tem de trocar o token JWT autoassinado por um token de identidade assinado pela Google. Para mais informações, consulte o artigo Autenticação para invocação.Invoque a sua função HTTP através de credenciais de autenticação no cabeçalho do pedido. Por exemplo, pode obter um token de identidade através do gcloud da seguinte forma:
curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME
Para mais informações, consulte o artigo Autenticação para invocação .
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:
A função deve encaminhar todo o tráfego de saída através da rede VPC. Consulte a secção Implemente funções em conformidade com os VPC Service Controls para mais informações.
Em alternativa, conceda à conta de serviço de tempo de execução da função acesso ao perímetro. Pode fazê-lo criando um nível de acesso e adicionando o nível de acesso ao perímetro de serviço ou criando uma política de entrada no perímetro. Consulte o artigo Usar os VPC Service Controls com funções fora de um perímetro para mais informaçõ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
- Para funções baseadas em acionadores HTTP, implemente o recuo exponencial e as novas tentativas para pedidos que não podem ser ignorados. Se estiver a acionar funções do Cloud Run a partir de fluxos de trabalho, pode usar a sintaxe
try/retry
para o fazer. - Para funções de segundo plano ou acionadas por eventos, as funções do Cloud Run suportam a entrega, pelo menos, uma vez. Mesmo sem ativar explicitamente a repetição, o evento é reenviado automaticamente e a execução da função é repetida. Para mais informações, consulte o artigo Ative as novas tentativas de funções orientadas por eventos.
- Quando a causa principal do problema é um período de erros transitórios intensificados atribuídos exclusivamente às funções do Cloud Run ou se precisar de assistência com o seu problema, contacte o apoio ao cliente do Google Cloud.
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.
As definições incluem filtros de exclusão, que definem entradas que podem ser rejeitadas.
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 /28
dedicada 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
eservice-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çãoroles/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 camporoles/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 emCloud 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, concedaroles/compute.admin
à conta de serviçoPROJECT_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:
Estabeleça ligação ao seu servidor SMTP numa porta diferente, como a porta TCP
587
ou465
.
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.