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:
Especifique uma conta de serviço de ambiente de execução gerenciada pelo usuário ao implantar a função.
Recrie a conta de serviço padrão PROJECT_ID@appspot.gserviceaccount.com para o projeto.
Cancele a exclusão da conta de serviço padrão.
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:
atribuir ao implantador o papel Proprietário do projeto ou Administrador do Cloud Functions, ambos contendo a permissão
cloudfunctions.functions.setIamPolicy
.conceder a permissão manualmente criando um papel personalizado.
Verifique se o compartilhamento restrito de domínio é aplicado no projeto.
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:
- Crie uma conta de serviço de build personalizada para implantações de função.
- Adicione o
papel da conta de serviço do Cloud Build
(
roles/cloudbuild.builds.builder
) à conta de serviço padrão do Compute. - Revise as orientações do Cloud Build sobre mudanças na conta de serviço padrão e desative essas mudanças.
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:
- Crie uma conta de serviço personalizada de build para implantações de função.
- Ative a conta de serviço padrão do Compute.
- Revise as orientações do Cloud Build sobre mudanças na conta de serviço padrão e desative essas mudanças.
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:
Atribua ao usuário o papel de Invocador das funções do Cloud Run.
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.
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:
A função precisa rotear todo o tráfego de saída pela rede VPC. Consulte a seção Implantar funções que sigam o VPC Service Controls para mais informações.
Como alternativa, conceda à conta de serviço do ambiente de execução a função para o perímetro. Para isso, você pode criar um nível de acesso e adicionar o nível de acesso ao perímetro de serviço ou criar uma política de entrada no perímetro. Consulte Como usar o VPC Service Controls com funções fora de um perímetro para mais informaçõ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.
- Um grande aumento repentino no tráfego
- Longo tempo de inicialização a frio.
- Tempo de processamento de solicitação longo.
- Alta taxa de erros da função.
- Atingir o limite máximo de instâncias.
- Fatores temporários atribuídos ao serviço do Cloud Run functions.
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.
Incluídos nas configurações estão os filtros de exclusão, que definem as entradas que podem ser descartadas.
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
eservice-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 papelroles/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 emCloud 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, concedaroles/compute.admin
à conta de serviçoPROJECT_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:
Conecte-se ao servidor SMTP em uma porta diferente, como a porta TCP
587
ou465
.
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.