Risolvi i problemi di Cloud Functions

Questo documento illustra alcuni dei problemi più comuni che potresti riscontrare e come affrontarli.

Deployment

La fase di deployment rappresenta spesso una fonte di problemi. Molti dei problemi che potresti riscontrare durante il deployment sono correlati ai ruoli e alle autorizzazioni. Altre hanno a che fare con una configurazione errata.

L'utente con il ruolo Visualizzatore non può eseguire il deployment di una funzione

Un utente a cui è stato assegnato il ruolo Visualizzatore progetto o Visualizzatore Cloud Functions ha accesso di sola lettura alle funzioni e ai dettagli delle funzioni. Questi ruoli non sono autorizzati a eseguire il deployment di nuove funzioni.

Il messaggio di errore

console Cloud

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

Cloud SDK

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

La soluzione

Assegna all'utente un ruolo con l'accesso appropriato.

L'utente con il ruolo di Visualizzatore progetto o Cloud Function non può eseguire il deployment di una funzione

Per eseguire il deployment di una funzione, è necessario assegnare un ruolo aggiuntivo a un utente a cui è stato assegnato il ruolo Visualizzatore progetto, Sviluppatore funzioni Cloud o Amministratore funzioni Cloud Functions.

Il messaggio di errore

console 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'

Cloud SDK

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

La soluzione

Assegna all'utente un ruolo aggiuntivo, il ruolo IAM Utente account di servizio (roles/iam.serviceAccountUser), con ambito all'account di servizio di runtime di Cloud Functions.

All'account di servizio del deployment manca il ruolo di Agente di servizio durante il deployment delle funzioni

Il servizio Cloud Functions utilizza l'account di servizio dell'agente di servizio Cloud Functions (service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com) per eseguire azioni amministrative sul progetto. Per impostazione predefinita, a questo account è assegnato il ruolo cloudfunctions.serviceAgent di Cloud Functions. Questo ruolo è richiesto per le integrazioni di Cloud Pub/Sub, IAM, Cloud Storage e Firebase. Se hai modificato il ruolo per questo account di servizio, il deployment non riesce.

Il messaggio di errore

console 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'

Cloud SDK

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'

La soluzione

Reimposta questo account di servizio sul ruolo predefinito.

L'account di servizio del deployment non dispone delle autorizzazioni Pub/Sub durante il deployment di una funzione basata su eventi

Il servizio Cloud Functions utilizza l'account di servizio dell'agente di servizio Cloud Functions (service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com) per l'esecuzione di azioni amministrative. Per impostazione predefinita, a questo account è assegnato il ruolo cloudfunctions.serviceAgent di Cloud Functions. Per eseguire il deployment di funzioni basate su eventi, il servizio Cloud Functions deve accedere a Cloud Pub/Sub per configurare argomenti e abbonamenti. Se il ruolo assegnato all'account di servizio viene modificato e non vengono concesse le autorizzazioni appropriate, il servizio Cloud Functions non può accedere a Cloud Pub/Sub e il deployment non riesce.

Il messaggio di errore

console Cloud

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

Cloud SDK

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

La soluzione

Puoi:

L'account di servizio di runtime predefinito non esiste

Se non è specificato un account di servizio di runtime gestito dall'utente, le funzioni di 1ª generazione utilizzano per impostazione predefinita l'utilizzo dell'account di servizio App Engine come account di servizio di runtime. Se questo account predefinito è stato eliminato e non viene specificato nessun account gestito dall'utente, i deployment non andranno a buon fine.

Il messaggio di errore

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

Cloud SDK

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

La soluzione

L'utente non dispone delle autorizzazioni per l'account di servizio di runtime durante il deployment di una funzione

Negli ambienti in cui più funzioni accedono a risorse diverse, è pratica comune utilizzare identità per funzione, con account di servizio di runtime denominati anziché con l'account di servizio di runtime predefinito (PROJECT_ID@appspot.gserviceaccount.com).

Tuttavia, per utilizzare un account di servizio di runtime non predefinito, l'utente che ha eseguito il deployment deve disporre dell'autorizzazione iam.serviceAccounts.actAs sull'account non predefinito. Questa autorizzazione viene concessa automaticamente a un utente che crea un account di servizio di runtime non predefinito, ma ad altri utenti di deployment deve essere concessa da un utente con le autorizzazioni corrette.

Il messaggio di errore

Cloud SDK

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

La soluzione

Assegna all'utente il ruolo roles/iam.serviceAccountUser nell'account di servizio di runtime <SERVICE_ACCOUNT_NAME> non predefinito. Questo ruolo include l'autorizzazione iam.serviceAccounts.actAs.

All'account di servizio dell'agente di servizio Cloud Functions mancano le autorizzazioni del bucket di progetto durante il deployment di una funzione

Le funzioni Cloud Functions possono essere attivate solo da eventi provenienti dai bucket Cloud Storage nello stesso progetto Google Cloud Platform. Inoltre, l'account di servizio dell'agente di servizio Cloud Functions (service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com) deve avere un ruolo cloudfunctions.serviceAgent nel progetto.

Il messaggio di errore

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

Cloud SDK

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.

La soluzione

Puoi:

  • Reimposta questo account di servizio sul ruolo predefinito.

    o

  • Concedi all'account di servizio di runtime il ruolo cloudfunctions.serviceAgent.

    o

  • Concedi all'account di servizio di runtime le autorizzazioni storage.buckets.{get, update} e resourcemanager.projects.get.

L'utente con il ruolo di Editor di progetto non può rendere pubblica una funzione

Per garantire che gli sviluppatori non autorizzati non possano modificare le impostazioni di autenticazione per le chiamate di funzione, l'utente o il servizio che esegue il deployment della funzione deve avere l'autorizzazione cloudfunctions.functions.setIamPolicy.

Il messaggio di errore

Cloud SDK

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).]

La soluzione

Puoi:

Il deployment delle funzioni non riesce perché Cloud Build non supporta VPC-SC

Cloud Functions utilizza Cloud Build per creare il codice sorgente in un container eseguibile. Per utilizzare Cloud Functions con i Controlli di servizio VPC, devi configurare un livello di accesso per l'account di servizio Cloud Build nel perimetro di servizio.

Il messaggio di errore

console Cloud

Uno dei seguenti valori:

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"

Cloud SDK

Uno dei seguenti valori:

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"

La soluzione

Se i log delle risorse controllate del progetto riportano la dicitura "La richiesta è vietata dai criteri dell'organizzazione" nella sezione Controlli di servizio VPC e hanno un'etichetta Cloud Storage, devi concedere all'account di servizio Cloud Build l'accesso al perimetro dei Controlli di servizio VPC.

Il deployment della funzione non riesce a causa di un punto di ingresso specificato in modo errato

Il deployment di Cloud Functions può non riuscire se il punto di ingresso del codice, ovvero il nome della funzione esportata, non è specificato correttamente.

Il messaggio di errore

console 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

Cloud SDK

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

La soluzione

Il codice sorgente deve contenere una funzione del punto di ingresso specificata correttamente nel deployment, tramite la console Cloud o Cloud SDK.

Il deployment della funzione non riesce quando si utilizza il criterio dell'organizzazione del vincolo di località delle risorse

Se la tua organizzazione utilizza un criterio Vincolo di località delle risorse, potresti visualizzare questo errore nei log. Indica che la pipeline di deployment non è riuscita a creare un bucket di archiviazione multiregionale.

Il messaggio di errore

Nei log di Cloud Build:

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

Nei log di Cloud Storage:

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

La soluzione

Se utilizzi constraints/gcp.resourceLocations nei vincoli dei criteri dell'organizzazione, devi specificare la località multiregionale appropriata. Ad esempio, se esegui il deployment in una delle regioni us, devi utilizzare us-locations.

Tuttavia, se hai bisogno di un controllo più granulare e vuoi limitare il deployment delle funzioni a una singola regione (non a più regioni), crea prima il bucket multiregionale:

  1. Consenti l'intera area multiregionale
  2. Esegui il deployment di una funzione di test
  3. Al termine del deployment, modifica di nuovo il criterio dell'organizzazione per consentire solo la regione specifica.

Il bucket di archiviazione multiregionale rimane disponibile per quella regione, in modo che i deployment successivi possano avere esito positivo. Se in un secondo momento decidi di allowlist una regione esterna a quella in cui è stato creato il bucket di archiviazione multiregionale, dovrai ripetere il processo.

Il deployment della funzione non riesce durante l'esecuzione dell'ambito globale della funzione

Questo errore indica un problema con il codice. La pipeline di deployment ha terminato il deployment della funzione, ma non è riuscita nell'ultimo passaggio, inviando un controllo di integrità alla funzione. Questo controllo di integrità ha lo scopo di eseguire l'ambito globale di una funzione, che potrebbe generare un'eccezione, un arresto anomalo o un timeout. Nell'ambito globale, di solito carichi nelle librerie e inizializzi i client.

Il messaggio di errore

Nei log di Cloud Logging:

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

La soluzione

Per un messaggio di errore più dettagliato, esamina i log di build della funzione e i log di runtime della funzione. Se non è chiaro il motivo per cui la funzione non è riuscita a eseguire il suo ambito globale, valuta la possibilità di spostare temporaneamente il codice nella chiamata della richiesta utilizzando l'inizializzazione lazy delle variabili globali. In questo modo puoi aggiungere istruzioni di log aggiuntive per le librerie client che potrebbero provocare il timeout della creazione dell'istanza (in particolare se chiamano altri servizi) o causare l'arresto anomalo o l'applicazione di eccezioni. Inoltre, puoi provare ad aumentare il timeout della funzione.

Creare

Quando esegui il deployment del codice sorgente della tua funzione in Cloud Functions, l'origine viene archiviata in un bucket Cloud Storage. Cloud Build crea quindi automaticamente il codice in un'immagine container e ne esegue il push in Container Registry. Cloud Functions accede a questa immagine quando deve eseguire il container per eseguire la funzione.

Creazione non riuscita a causa di immagini di Container Registry mancanti

Cloud Functions (1ª generazione.) utilizza Container Registry per gestire le immagini delle funzioni. Container Registry utilizza Cloud Storage per archiviare i livelli delle immagini nei bucket denominati STORAGE-REGION.artifacts.PROJECT-ID.appspot.com. L'utilizzo della Gestione del ciclo di vita degli oggetti in questi bucket interrompe il deployment delle funzioni poiché i deployment dipendono dalla presenza di queste immagini.

Il messaggio di errore

console 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'"

Cloud SDK

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'"

La soluzione

  1. Disabilita la Gestione del ciclo di vita per i bucket richiesti da Container Registry.
  2. Elimina tutte le immagini delle funzioni interessate. Puoi accedere ai log di build per trovare i percorsi delle immagini. Fai riferimento allo script per eliminare le immagini in blocco. Tieni presente che ciò non influisce sulle funzioni di cui viene attualmente eseguito il deployment.
  3. Esegui di nuovo il deployment delle funzioni.

Pubblicazione

Anche la fase di pubblicazione può essere fonte di errori.

Errore di autorizzazione di pubblicazione a causa della funzione che richiede l'autenticazione

Le funzioni HTTP senza aver abilitato l'opzione Consenti chiamate non autenticate limitano l'accesso a utenti finali e account di servizio che non hanno autorizzazioni appropriate. Questo messaggio di errore indica che il chiamante non dispone dell'autorizzazione per richiamare la funzione.

Il messaggio di errore

Codice di risposta di errore HTTP: 403 accesso negato

Corpo della risposta di errore HTTP: Errore: vietato Il client non dispone dell'autorizzazione per ottenere l'URL /<FUNCTION_NAME> da questo server.

La soluzione

Puoi:

  • Esegui di nuovo il deployment della funzione per consentire chiamate non autenticate, se questa funzionalità è supportata dalla tua organizzazione. Questo può essere utile a scopo di test.

  • Richiama la funzione HTTP utilizzando le credenziali di autenticazione nell'intestazione della richiesta. Ad esempio, puoi ricevere un token di identità tramite gcloud nel seguente modo:

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

    Consulta Autenticazione per le chiamate

  • Per Cloud Functions (1ª generazione.), consenti l'accesso pubblico (non autenticato) a tutti gli utenti per la funzione specifica.

  • Per Cloud Functions (2nd gen) puoi eseguire una delle seguenti operazioni:

    • Assegna all'utente il ruolo Invoker Cloud IAM di Cloud Run per la funzione specifica.

    • Dalla console Google Cloud:

      Vai alla console Google Cloud

      1. Fai clic sul nome collegato della funzione alla quale vuoi concedere l'accesso.

      2. Fai clic sul link Powered By Cloud Run nel link nell'angolo in alto a destra della pagina di riepilogo dei dettagli della funzione.

      3. Fai clic su Trigger e seleziona Consenti chiamate non autenticate.

      4. Fai clic su Salva.

Errore di autorizzazione di pubblicazione dovuto alla configurazione "Consenti solo traffico interno"

Le impostazioni in entrata limitano se una funzione HTTP può essere richiamata da risorse esterne al progetto Google Cloud o al perimetro di servizio dei Controlli di servizio VPC. Quando è configurata l'impostazione "Consenti solo traffico interno" per il networking in entrata, questo messaggio di errore indica che sono consentite solo le richieste dalle reti VPC nello stesso progetto o nello stesso perimetro dei Controlli di servizio VPC.

Il messaggio di errore

Codice di risposta di errore HTTP: 403 accesso negato

Corpo della risposta di errore HTTP: Errore 403 (Accesso negato) 403. Errore. L'accesso è vietato. Non abbiamo altri dettagli.

La soluzione

Puoi:

  • Assicurati che la richiesta provenga dal tuo progetto Google Cloud o dal perimetro di servizio dei Controlli di servizio VPC.

    o

  • Modifica le impostazioni di traffico in entrata in modo da consentire tutto il traffico per la funzione.

La chiamata della funzione non dispone di credenziali di autenticazione valide

La chiamata a una funzione Cloud Functions configurata con accesso limitato richiede un token ID. I token di accesso o i token di aggiornamento non funzionano.

Il messaggio di errore

Codice di risposta di errore HTTP: 401 Non autorizzato

Corpo della risposta di errore HTTP: Il tuo client non dispone dell'autorizzazione per l'URL richiesto

La soluzione

Assicurati che le richieste includano un'intestazione Authorization: Bearer ID_TOKEN e che il token sia un token ID, non un token di accesso o di aggiornamento. Se generi manualmente questo token con la chiave privata di un account di servizio, devi scambiare il token JWT autofirmato con un token di identità firmato da Google, seguendo questa guida.

Tentativo di richiamare la funzione utilizzando curl reindirizza alla pagina di accesso di Google

Se tenti di richiamare una funzione che non esiste, Cloud Functions risponde con un reindirizzamento HTTP/2 302 che porta alla pagina di accesso all'Account Google. Risposta errata. Dovrebbe rispondere con un codice di risposta di errore HTTP/2 404. Il problema è in fase di risoluzione.

La soluzione

Assicurati di specificare correttamente il nome della funzione. Puoi sempre verificare utilizzando gcloud functions call, che restituisce l'errore 404 corretto per una funzione mancante.

Arresti anomali dell'applicazione ed esecuzione della funzione non riuscita

Questo errore indica che il processo che esegue la funzione è terminato. Generalmente, questo problema è dovuto all'arresto anomalo del runtime a causa di problemi nel codice della funzione. Questo può verificarsi anche quando un deadlock o qualche altra condizione nel codice della tua funzione fa sì che il runtime non risponda alle richieste in entrata.

Il messaggio di errore

Nei log di Cloud Logging: "L'infrastruttura non può comunicare con la funzione. È probabile che il codice fornito dall'utente si sia verificato un arresto anomalo o un deadlock."

La soluzione

Runtime diversi possono arrestarsi in modo anomalo in scenari diversi. Per trovare la causa principale, genera log dettagliati del livello di debug, controlla la logica dell'applicazione e testa i casi periferici.

Il runtime Python37 di Cloud Functions attualmente ha una limitazione nota sulla frequenza con cui può gestire il logging. Se le istruzioni di log di un'istanza di runtime Python37 vengono scritte con una frequenza sufficientemente elevata, è possibile che si verifichi questo errore. Le versioni di runtime Python >= 3.8 non hanno questa limitazione. Per evitare questo problema, invitiamo gli utenti a eseguire la migrazione a una versione superiore del runtime Python.

Se hai ancora dubbi sulla causa dell'errore, consulta la nostra pagina di assistenza.

La funzione si interrompe a metà esecuzione o continua in esecuzione al termine del codice

Alcuni runtime di Cloud Functions consentono agli utenti di eseguire attività asincrone. Se la funzione crea attività di questo tipo, deve anche attenderne esplicitamente il completamento. In caso contrario, la funzione potrebbe interrompersi al momento sbagliato.

Comportamento dell'errore

La funzione mostra uno dei seguenti comportamenti:

  • La funzione termina mentre le attività asincrone sono ancora in esecuzione, ma prima che sia trascorso il periodo di timeout specificato.
  • L'esecuzione della funzione non viene interrotta al termine di queste attività e continua a essere eseguita fino alla scadenza del periodo di timeout.

La soluzione

Se la funzione viene terminata in anticipo, devi assicurarti che tutte le attività asincrone della funzione siano state completate prima di eseguire una delle seguenti operazioni:

  • che restituisce un valore
  • risoluzione o rifiuto di un oggetto Promise restituito (solo funzioni Node.js)
  • generazione di eccezioni e/o errori non rilevati
  • invio di una risposta HTTP
  • chiamata a una funzione di callback

Se la funzione non viene terminata dopo il completamento di tutte le attività asincrone, devi verificare che la funzione stia segnalando correttamente Cloud Functions al termine dell'operazione. In particolare, assicurati di eseguire una delle operazioni sopra elencate non appena la funzione ha terminato le sue attività asincrone.

Memoria heap JavaScript esaurita

Per le funzioni Node.js 12+ con limiti di memoria superiori a 2 GiB, gli utenti devono configurare NODE_OPTIONS in modo che abbia max_old_space_size, in modo che il limite di heap JavaScript sia equivalente al limite di memoria della funzione.

Il messaggio di errore

console Cloud

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

La soluzione

Esegui il deployment della funzione Node.js 12 e versioni successive, con NODE_OPTIONS configurato in modo da max_old_space_size impostato sul limite di memoria della funzione. Ad esempio:

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

Funzione terminata

Potresti visualizzare uno dei seguenti messaggi di errore quando si è chiuso il processo che esegue il codice a causa di un errore di runtime o di un'uscita intenzionale. Esiste anche una piccola possibilità che si sia verificato un raro errore dell'infrastruttura.

Messaggi di errore

La chiamata alla funzione è stata interrotta. Errore: funzione terminata. Azione consigliata: ispeziona i log per motivo di terminazione. Ulteriori informazioni sulla risoluzione dei problemi sono disponibili in Logging.

Richiesta rifiutata. Errore: funzione terminata. Azione consigliata: controlla i log per individuare il motivo dell'interruzione. Ulteriori informazioni sulla risoluzione dei problemi sono disponibili in Logging.

La funzione non può essere inizializzata. Errore: funzione terminata. Azione consigliata: ispeziona i log per motivo di terminazione. Ulteriori informazioni sulla risoluzione dei problemi sono disponibili in Logging.

La soluzione

  • Per una funzione in background (attivata da Pub/Sub) quando un elemento executionID è associato alla richiesta non riuscita, prova ad abilitare riprova in caso di errore. Ciò consente di ritentare l'esecuzione della funzione quando viene sollevata un'eccezione recuperabile. Per ulteriori informazioni su come utilizzare questa opzione in modo sicuro, incluse le mitigazioni per evitare loop di nuovi tentativi infiniti e gestire in modo diverso gli errori reversibili/irreversibili, consulta le best practice.

  • L'attività in background (qualsiasi cosa che avvenga dopo la fine della funzione) può causare problemi, quindi controlla il codice. Cloud Functions non garantisce azioni diverse da quelle eseguite durante il periodo di esecuzione della funzione. Di conseguenza, anche se un'attività viene eseguita in background, potrebbe essere terminata dal processo di pulizia.

  • Nei casi in cui si verifica un picco di traffico improvviso, prova a distribuire il carico di lavoro per un po' più di tempo. Inoltre, testa le funzioni localmente utilizzando il framework delle funzioni prima di eseguire il deployment in Cloud Functions per assicurarti che l'errore non sia dovuto a dipendenze mancanti o in conflitto.

Errore di runtime durante l'accesso a risorse protette da VPC-SC

Per impostazione predefinita, Cloud Functions utilizza indirizzi IP pubblici per effettuare richieste in uscita ad altri servizi. Se le tue funzioni non si trovano all'interno di un perimetro dei Controlli di servizio VPC, le funzioni potrebbero ricevere risposte HTTP 403 durante il tentativo di accedere ai servizi Google Cloud protetti da VPC-SC, a causa dei rifiuti perimetro di servizio.

Il messaggio di errore

Nei log delle risorse controllate, una voce simile alla seguente:

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

La soluzione

Aggiungi Cloud Functions al tuo progetto Google Cloud come risorsa protetta nel perimetro di servizio ed esegui il deployment di funzioni conformi a VPC-SC. Per ulteriori informazioni, consulta Utilizzo dei Controlli di servizio VPC.

In alternativa, se il progetto Cloud Functions non può essere aggiunto al perimetro di servizio, consulta Utilizzo dei Controlli di servizio VPC con funzioni esterne a un perimetro.

Scalabilità

I problemi di scalabilità relativi all'infrastruttura di Cloud Functions possono presentarsi in diverse circostanze.

Le seguenti condizioni possono essere associate agli errori di scalabilità.

  • Un enorme aumento improvviso del traffico.
  • Un'ora di avvio a freddo lunga.
  • Un tempo di elaborazione della richiesta lungo.
  • Elevato tasso di errori delle funzioni.
  • Hai raggiunto il limite massimo di istanze e, di conseguenza, il sistema non può scalare ulteriormente.
  • Fattori temporanei attribuiti al servizio Cloud Functions.

In ogni caso, Cloud Functions potrebbe non fare lo scale up abbastanza rapidamente per gestire il traffico.

Il messaggio di errore

  • The request was aborted because there was no available instance
    • severity=WARNING ( codice di risposta: 429 ) Cloud Functions non è in grado di scalare a causa del limite di max-instances impostato durante la configurazione.
    • severity=ERROR ( Codice di risposta: 500) Le funzioni Cloud Functions intrinsecamente non possono gestire la frequenza di traffico.

La soluzione

  • Per le funzioni basate su trigger HTTP, chiedi al client di implementare il backoff esponenziale e di riprovare per le richieste che non devono essere ignorate. Se stai attivando Cloud Functions da Workflows, puoi utilizzare la sintassi try/retry per ottenere questo risultato.
  • Per le funzioni in background / basate su eventi, Cloud Functions supporta la distribuzione at-least-once. Anche senza abilitare esplicitamente la ripetizione, l'evento viene automaticamente pubblicato e ritentare l'esecuzione della funzione. Per ulteriori informazioni, consulta Ripetere le funzioni basate su eventi.
  • Se la causa principale del problema è un periodo di gravi errori temporanei attribuiti esclusivamente a Cloud Functions o se hai bisogno di aiuto per il problema, contatta l'assistenza.

Logging

La configurazione del logging per identificare i problemi può causare problemi personali.

Le voci di log non hanno livelli di gravità dei log o non sono corretti

Per impostazione predefinita, Cloud Functions include il logging del runtime semplice. I log scritti in stdout o stderr vengono visualizzati automaticamente nella console Google Cloud. Tuttavia, queste voci di log, per impostazione predefinita, contengono solo semplici messaggi stringa.

Il messaggio di errore

Livelli di gravità assenti o errati nei log.

La soluzione

Per includere la gravità dei log, devi inviare una voce di log strutturata.

Gestire o registrare le eccezioni in modo diverso in caso di arresto anomalo

È consigliabile personalizzare la gestione e la registrazione delle informazioni sugli arresti anomali.

La soluzione

Aggrega la funzione in un blocco try per personalizzare la gestione delle eccezioni e le analisi dello stack di logging.

Esempio


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!'

Log troppo grandi in Node.js 10+, Python 3.8, Go 1.13 e Java 11

La dimensione massima per una normale voce di log in questi runtime è 105 KiB.

La soluzione

Assicurati di inviare voci di log inferiori a questo limite.

La Cloud Function sta restituendo errori, ma mancano i log

I log della funzione Cloud Function vengono trasmessi in flusso in un bucket predefinito che viene creato e abilitato quando viene creato un progetto. Se il bucket predefinito è disabilitato o se i log della funzione Cloud Function si trovano nel filtro di esclusione, non verranno visualizzati in Esplora log.

La soluzione

Assicurati che i log predefiniti siano abilitati.

I log di Cloud Functions non vengono visualizzati in Esplora log

Alcune librerie client di Cloud Logging utilizzano un processo asincrono per scrivere le voci di log. Se una funzione si arresta in modo anomalo o termina in altro modo, è possibile che alcune voci di log non siano state ancora scritte e vengano visualizzate in un secondo momento. È anche possibile che alcuni log vadano persi e non siano visibili in Esplora log.

La soluzione

Utilizza l'interfaccia della libreria client per svuotare le voci di log presenti nel buffer prima di uscire dalla funzione o utilizza la libreria per scrivere voci di log in modo sincrono. Puoi anche scrivere i log in modo sincrono direttamente in stdout o stderr.

I log di Cloud Functions non vengono visualizzati tramite il sink del router dei log

Le voci di log vengono instradate alle varie destinazioni utilizzando i sink del router dei log.

Screenshot del router dei log della console con Visualizza dettagli sink evidenziati

Le impostazioni includono i filtri di esclusione, che definiscono voci che possono essere semplicemente ignorate.

Screenshot del popup Dettagli sink del router dei log della console che mostra il filtro di esclusione

La soluzione

Assicurati che non sia impostato alcun filtro di esclusione per resource.type="cloud_functions"

Connessioni al database

Durante la connessione a un database possono verificarsi vari problemi, molti dei quali associati al superamento dei limiti di connessione o al timeout. Se nei log visualizzi un avviso di Cloud SQL, ad esempio "scadenza contestuale superata", potrebbe essere necessario modificare la configurazione della connessione. Consulta la documentazione di Cloud SQL per ulteriori dettagli.

Networking

Connettività di rete

Se tutte le richieste in uscita da una Cloud Function non vanno a buon fine anche dopo aver configurato le impostazioni in uscita, puoi eseguire Connectivity Tests per identificare eventuali problemi di connettività di rete sottostanti. Per maggiori informazioni, vedi Creare ed eseguire Connectivity Tests.

Il connettore di accesso VPC serverless non è pronto o non esiste

In caso di errore di un connettore di accesso VPC serverless, potrebbe non utilizzare una subnet mask /28 dedicata al connettore come obbligatorio.

Il messaggio di errore

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

La soluzione

Elenca le subnet per verificare se il connettore utilizza una subnet mask /28.

In caso contrario, ricrea o crea un nuovo connettore per utilizzare una subnet /28. Tieni presente quanto segue:

  • Se ricrei il connettore, non è necessario eseguire nuovamente il deployment di altre funzioni. Potrebbe verificarsi un'interruzione di rete durante la creazione del connettore.

  • Se crei un nuovo connettore alternativo, esegui nuovamente il deployment delle funzioni per utilizzare il nuovo connettore, quindi elimina il connettore originale. Questo metodo evita interruzioni di rete.

Il traffico SMTP verso indirizzi IP di destinazione esterni che utilizzano la porta TCP 25 è bloccato

Per maggiore sicurezza, Google Cloud blocca le connessioni alla porta 25 di destinazione TCP quando vengono inviate email dalle funzioni.

La soluzione

Per sbloccare queste connessioni, scegli una delle seguenti opzioni: