Risolvi i problemi di Cloud Functions

Questo documento mostra alcuni dei problemi più comuni che potresti riscontrare e come risolverli.

Deployment

La fase di deployment è spesso 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 relativi dettagli. 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 che dispone dell'accesso appropriato.

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

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

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 Cloud Functions.

Nell'account di servizio del deployment manca il ruolo dell'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 l'esecuzione di azioni amministrative sul progetto. A questo account viene assegnato per impostazione predefinita il ruolo cloudfunctions.serviceAgent di Cloud Functions. Questo ruolo è obbligatorio per le integrazioni di Cloud Pub/Sub, IAM, Cloud Storage e Firebase. Se hai modificato il ruolo di 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. A questo account viene assegnato per impostazione predefinita 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 va a buon fine.

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

Quando non viene specificato un account di servizio di runtime gestito dall'utente, le funzioni di 1ª generazione utilizzano l'account di servizio di App Engine come account di servizio di runtime per impostazione predefinita. Se questo account predefinito è stato eliminato e non è 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é l'account di servizio di runtime predefinito (PROJECT_ID@appspot.gserviceaccount.com).

Tuttavia, per utilizzare un account di servizio di runtime non predefinito, l'autore del deployment deve avere l'autorizzazione iam.serviceAccounts.actAs per quell'account non predefinito. A un utente che crea un account di servizio di runtime non predefinito viene concessa automaticamente questa autorizzazione, ma gli altri utenti che eseguono il deployment devono ricevere questa autorizzazione 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 all'account di servizio di runtime non predefinito <SERVICE_ACCOUNT_NAME>. Questo ruolo include l'autorizzazione iam.serviceAccounts.actAs.

L'account di servizio dell'agente di servizio Cloud Functions non dispone delle autorizzazioni per il bucket di progetto durante il deployment di una funzione

Cloud Functions può essere attivato solo da eventi dai bucket Cloud Storage nello stesso progetto della 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 Editor di progetto non può rendere pubblica una funzione

Per garantire che sviluppatori non autorizzati non possano modificare le impostazioni di autenticazione per le chiamate alle funzioni, l'utente o il servizio che esegue il deployment della funzione deve disporre dell'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 della funzione 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 tuo 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 al 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 entry point specificata correttamente nel deployment tramite la console Cloud o Cloud SDK.

Il deployment della funzione non riesce quando viene utilizzato il criterio dell'organizzazione del vincolo per la 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 us regioni, devi usare 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. Una volta che il deployment ha avuto esito positivo, cambia 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, devi ripetere il processo.

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

Questo errore indica che si è verificato un problema con il codice. La pipeline di deployment ha completato il deployment della funzione, ma l'ultimo passaggio non è riuscito: l'invio di un controllo di integrità alla funzione non è andato a buon fine. Questo controllo di integrità ha lo scopo di eseguire l'ambito globale di una funzione, il che potrebbe generare un'eccezione, un arresto anomalo o un timeout. In ambito globale, solitamente carichi le librerie e inizializzare 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 l'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 ulteriori istruzioni di log per le librerie client, il che potrebbe causare il timeout della loro istanza (soprattutto se stanno chiamando altri servizi) o l'arresto anomalo/generazione di eccezioni totali. Inoltre, puoi provare ad aumentare il timeout della funzione.

crea

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

Build non riuscita a causa di immagini 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 in bucket denominati STORAGE-REGION.artifacts.PROJECT-ID.appspot.com. L'uso della gestione del ciclo di vita degli oggetti su 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 collettivamente le immagini. Tieni presente che ciò non influisce sulle funzioni di cui è stato eseguito attualmente il deployment.
  3. Esegui di nuovo il deployment delle funzioni.

Gestione

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

Errore dell'autorizzazione di pubblicazione dovuto alla funzione che richiede l'autenticazione

Le funzioni HTTP senza l'opzione Consenti chiamate non autenticate abilitata limitano l'accesso agli utenti finali e agli account di servizio che non dispongono delle 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 dell'errore HTTP: Errore: vietato Il tuo client non è autorizzato a 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 come segue:

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

    Vedi 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 fare 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 a cui 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 Attiva 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 da reti VPC nello stesso progetto o perimetro dei Controlli di servizio VPC.

Il messaggio di errore

Codice di risposta di errore HTTP: 403 accesso negato

Corpo della risposta dell'errore HTTP: Errore 403 (non consentito) 403. Errore. L'accesso è vietato. Non abbiamo altri dettagli.

La soluzione

Puoi:

  • Assicurati che la richiesta provenga dal 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 di 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 dell'errore HTTP: 401 Autorizzazione assente

Corpo della risposta dell'errore HTTP: Il 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 questo token manualmente con la chiave privata di un account di servizio, devi scambiare il token JWT autofirmato con un token Identity firmato da Google, seguendo questa guida.

Tentativo di richiamare la funzione utilizzando il reindirizzamento curl 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 ti porta alla pagina di accesso dell'Account Google. Informazioni errate. 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. In genere questo accade a causa dell'arresto anomalo del runtime a causa di problemi nel codice della funzione. Questo può accadere anche quando un deadlock o qualche altra condizione nel codice della 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. probabilmente era presente un arresto anomalo o un deadlock nel codice fornito dall'utente."

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 verifica la presenza di casi limite.

Il runtime Python37 di Cloud Functions attualmente ha una limitazione nota relativa alla frequenza con cui può gestire il logging. Se le istruzioni di log da un'istanza di runtime Python37 vengono scritte a una frequenza sufficientemente elevata, può verificarsi questo errore. Le versioni di runtime Python >= 3.8 non hanno questa limitazione. Per evitare questo problema, consigliamo agli utenti di 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à dell'esecuzione o continua a essere eseguita al termine del codice

Alcuni runtime di Cloud Functions consentono agli utenti di eseguire attività asincrone. Se la funzione crea tali attività, deve anche attendere esplicitamente il loro completamento. In caso contrario, l'esecuzione della funzione potrebbe essere interrotta nel momento sbagliato.

Comportamento di errore

La funzione presenta uno dei seguenti comportamenti:

  • La funzione viene terminata 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 al termine 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:

  • restituendo un valore
  • risoluzione o rifiuto di un oggetto Promise restituito (solo funzioni Node.js)
  • generazione di eccezioni e/o errori non rilevati
  • l'invio di una risposta HTTP
  • il richiamo di una funzione di callback

Se la funzione non viene terminata una volta completate tutte le attività asincrone, devi verificare che la funzione segnali correttamente Cloud Functions al termine dell'operazione. In particolare, assicurati di eseguire una delle operazioni elencate sopra non appena la funzione ha completato le attività asincrone.

Heap JavaScript esaurito

Per le funzioni Node.js e versioni successive di 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 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 tua funzione Node.js 12 e versioni successive, con NODE_OPTIONS configurato in modo che max_old_space_size sia 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 il processo che esegue il codice è stato chiuso a causa di un errore di runtime o di un'uscita intenzionale. Esiste anche una piccola possibilità che si sia verificato un errore raro dell'infrastruttura.

I messaggi di errore

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

Richiesta rifiutata. Errore: funzione terminata. Azione consigliata: controlla i log per verificare il motivo della terminazione. Puoi trovare ulteriori informazioni sulla risoluzione dei problemi in Logging.

Impossibile inizializzare la funzione. Errore: funzione terminata. Azione consigliata: ispeziona i log per verificare il motivo della terminazione. Puoi trovare ulteriori informazioni sulla risoluzione dei problemi in Logging.

La soluzione

  • Per una funzione in background (attivato Pub/Sub) quando un executionID è associato alla richiesta che è stata considerata errata, prova ad abilitare Riprova in caso di errore. Ciò consente di ritentare l'esecuzione della funzione quando viene generata un'eccezione reversibile. Per ulteriori informazioni su come utilizzare questa opzione in modo sicuro, incluse le mitigazioni per evitare cicli di nuovi tentativi infiniti e gestire in modo diverso gli errori ripristinabili/irreversibili, consulta le best practice.

  • L'attività in background (tutto ciò che accade dopo l'interruzione 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.

  • Se si verifica un picco improvviso di traffico, prova a distribuire il carico di lavoro nell'arco di un po' più di tempo. Inoltre, testa le tue 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 alle risorse protette da VPC-SC

Per impostazione predefinita, Cloud Functions utilizza gli indirizzi IP pubblici per effettuare richieste in uscita ad altri servizi. Se le tue funzioni non si trovano all'interno di un perimetro di Controlli di servizio VPC, potrebbero ricevere risposte 403 HTTP quando tentano di accedere ai servizi Google Cloud protetti da VPC-SC, a causa di rifiuti del 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 Cloud Functions possono verificarsi in diverse circostanze.

Gli errori di scalabilità possono essere associate alle seguenti condizioni.

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

In ogni caso, lo scale up di Cloud Functions potrebbe non essere sufficiente 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 può scalare a causa del limite di max-instances impostato durante la configurazione.
    • severity=ERROR ( Codice di risposta: 500) Cloud Functions non può gestire intrinsecamente la frequenza del traffico.

La soluzione

  • Per le funzioni basate su trigger HTTP, fai in modo che il client implementi il backoff esponenziale e riprova 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 o basate su eventi, Cloud Functions supporta la distribuzione at-least-once. Anche se non abiliti esplicitamente il nuovo tentativo, l'evento viene inviato di nuovo automaticamente e viene ripetuta l'esecuzione della funzione. Per ulteriori informazioni, consulta Ripetere le funzioni basate su eventi.
  • Se la causa principale del problema è un periodo di errori temporanei aumentati attribuiti esclusivamente a Cloud Functions o se hai bisogno di aiuto per il problema, contatta l'assistenza.

Logging

La configurazione del logging per individuare i problemi può causare anche altri problemi.

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

Cloud Functions include per impostazione predefinita il logging di 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 messaggi stringa semplici.

Il messaggio di errore

Livelli di gravità assenti o errati nei log.

La soluzione

Per includere le gravità dei log, devi inviare una voce di log strutturato.

Gestisci o registra le eccezioni in modo diverso in caso di arresto anomalo

Puoi personalizzare la modalità di gestione e registrazione delle informazioni sugli arresti anomali.

La soluzione

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

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 e versioni successive, 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 restituisce errori, ma mancano i log

I log delle Cloud Function vengono trasmessi a un bucket predefinito che viene creato e abilitato quando viene creato un progetto. Se il bucket predefinito è disabilitato o se i log delle funzioni Cloud Function sono nel filtro di esclusione, i log 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 ha un arresto anomalo o termina in altro modo, è possibile che alcune voci di log non siano ancora state scritte e che possano comparire in seguito. È anche possibile che alcuni log vadano persi e non sono visibili in Esplora log.

La soluzione

Utilizza l'interfaccia della libreria client per eliminare le voci di log nel buffer prima di uscire dalla funzione oppure utilizza la libreria per scrivere le voci di log in modo sincrono. Puoi anche scrivere i log in modo sincrono direttamente su 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 l'opzione Visualizza dettagli sink evidenziata

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

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

Quando si esegue la connessione a un database, possono verificarsi una serie di problemi, molti associati al superamento dei limiti o al timeout delle connessioni. Se nei tuoi log viene visualizzato un avviso Cloud SQL, ad esempio "scadenza del contesto superata", potrebbe essere necessario modificare la configurazione della connessione. Per ulteriori dettagli, consulta la documentazione di Cloud SQL.

Networking

Connettività di rete

Se tutte le richieste in uscita da una Cloud Function non riescono anche dopo aver configurato le impostazioni in uscita, puoi eseguire Connectivity Tests per identificare eventuali problemi di connettività di rete sottostanti. Per maggiori informazioni, consulta 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, è possibile che non utilizzi una subnet mask /28 dedicata al connettore come obbligatoria.

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. Si potrebbe verificare un'interruzione di rete durante la creazione del connettore.

  • Se crei un nuovo connettore alternativo, esegui nuovamente il deployment delle funzioni in modo da 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 si inviano email dalle funzioni.

La soluzione

Per sbloccare queste connessioni, scegli una delle seguenti opzioni: