Risolvere i problemi relativi a Cloud Run Functions (1ª generazione.)
Questo documento spiega come risolvere i problemi segnalati dai messaggi di errore e risolvere i problemi relativi all'utilizzo delle funzioni Cloud Run (1ª generazione.).
Deployment
Questa sezione elenca i problemi che potresti riscontrare durante il deployment e fornisce suggerimenti su come risolverli. Molti dei problemi che potresti riscontrare durante il deployment sono relativi a ruoli e autorizzazioni o a una configurazione errata.
Nell'account di servizio di deployment mancano le 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 eseguire azioni amministrative. Per impostazione predefinita, a questo account viene assegnato il ruolo cloudfunctions.serviceAgent
di Cloud Functions. Per eseguire il deployment di funzioni basate su eventi, il servizio Cloud Functions deve accedere a Pub/Sub per configurare argomenti e abbonamenti. Se il ruolo assegnato all'account di servizio cambia e le autorizzazioni appropriate non vengono aggiornate, il servizio Cloud Functions non può accedere a Pub/Sub e il deployment non va a buon fine.
Il messaggio di errore
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
La soluzione
Puoi ripristinare l'account di servizio al ruolo cloudfunctions.serviceAgent
predefinito.
L'account di servizio di runtime predefinito non esiste
Quando non viene specificato un account di servizio gestito dall'utente, le funzioni Cloud Run (1ª generazione.) utilizzano per impostazione predefinita l'account di servizio App Engine. I deployment non riescono se elimini l'account predefinito senza specificare un account di servizio gestito dall'utente.
Il messaggio di errore
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.]
La soluzione
Per risolvere il problema, segui una di queste soluzioni:
Specifica un account di servizio di runtime gestito dall'utente durante il deployment della funzione.
Rigenera l'account di servizio predefinito PROJECT_ID@appspot.gserviceaccount.com per il tuo progetto.
Annulla l'eliminazione dell'account di servizio predefinito.
Mancano le autorizzazioni dell'utente per l'account di servizio di runtime durante il deployment di una funzione
Ogni funzione è associata a un account di servizio che funge da identità quando la funzione accede ad altre risorse. Questo account di servizio di runtime può essere l'account di servizio predefinito o un account di servizio gestito dall'utente. Affinché Cloud Functions possa utilizzare un account di servizio di runtime, l'eseguitore del deployment deve disporre dell'autorizzazione iam.serviceAccounts.actAs
per quell'account di servizio. A un utente che crea un account di servizio di runtime non predefinito viene concessa automaticamente questa autorizzazione, ma gli altri responsabili del deployment devono disporre di questa autorizzazione concessa da un utente con le autorizzazioni corrette.
A un utente a cui è stato assegnato il ruolo Visualizzatore progetto, Sviluppatore Cloud Functions o Amministratore Cloud Functions deve essere assegnata anche l'autorizzazione iam.serviceAccounts.actAs
per l'account di servizio di runtime.
Il messaggio di errore
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
Per l'account di servizio predefinito si verifica il seguente errore:
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:'.
Per l'account di servizio non predefinito si verifica il seguente errore:
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:'.
La soluzione
Assegna il ruolo Utente
roles/iam.serviceAccountUser
all'account di servizio predefinito o gestito dall'utente. Questo ruolo include l'autorizzazione iam.serviceAccounts.actAs
.
Le autorizzazioni del bucket del progetto mancano nell'account di servizio Service Agent di Cloud Run durante il deployment di una funzione
Le funzioni Cloud Run possono essere
attivate solo da eventi
provenienti da bucket Cloud Storage nello stesso progetto Google Cloud. Inoltre, l'account di servizio agente di servizio Cloud Functions (service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com
) deve disporre del ruolo cloudfunctions.serviceAgent
nel progetto.
Il messaggio di errore
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.
La soluzione
Per risolvere questo errore, reimposta l'account di servizio Agente di servizio sul ruolo predefinito.
L'utente con il ruolo Editor del progetto non può rendere pubblica una funzione
Il ruolo Editor del progetto dispone di autorizzazioni ampie per gestire le risorse all'interno di un progetto, ma non concede intrinsecamente la possibilità di rendere pubbliche le funzioni Cloud Run. Devi concedere l'autorizzazione cloudfunctions.functions.setIamPolicy
all'utente o al servizio che esegue il deployment della funzione.
Il messaggio di errore
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).]
La soluzione
Per risolvere questo errore, segui una di queste soluzioni:
Assegna al deployer il ruolo Proprietario del progetto o Amministratore di Cloud Functions, entrambi contenenti l'autorizzazione
cloudfunctions.functions.setIamPolicy
.Concedi l'autorizzazione manualmente creando un ruolo personalizzato.
Verifica se la condivisione limitata per i domini è impostata per il progetto.
Il deployment delle funzioni non riesce quando si utilizza il criterio dell'organizzazione per la restrizione sulla località delle risorse
Se la tua organizzazione utilizza un criterio di limitazione della località delle risorse, il deployment delle funzioni nelle regioni limitate dal criterio verrà limitato. Nella console Google Cloud, la regione con limitazioni non sarà disponibile nel menu a discesa delle regioni durante il deployment di una funzione.
Il messaggio di errore
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."
}
La soluzione
Aggiungi o rimuovi località dagli elenchi allowed_values
o denied_values
del vincolo delle località delle risorse per un deployment riuscito.
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 non è riuscita nell'ultimo passaggio, ovvero l'invio di un controllo di integrità alla funzione. Questo controllo di integrità è progettato per eseguire lo ambito globale di una funzione, che potrebbe generare un'eccezione, un arresto anomalo o un timeout. Lo scopo globale è dove carichi comunemente le librerie e inizili i client.
Il messaggio di errore
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.
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 risolvere il problema, segui una di queste soluzioni:
Per un messaggio di errore più dettagliato, esamina i log di compilazione e i log di runtime della funzione.
Se non è chiaro perché la funzione non è riuscita a eseguire il suo ambito globale, valuta la possibilità di spostare temporaneamente il codice nell'invocazione della richiesta, utilizzando l'inizializzazione lazy delle variabili globali. In questo modo puoi aggiungere istruzioni di log aggiuntive alle librerie client, che potrebbero avere un timeout durante l'inizializzazione (in particolare se chiamano altri servizi) o arrestarsi in modo anomalo o generare eccezioni.
Aumenta il timeout della funzione.
Il codice sorgente deve contenere una funzione di punto di ingresso specificata correttamente nel deployment tramite la console o gcloud.
L'utente con il ruolo Visualizzatore non può eseguire il deployment di una funzione
Gli utenti con il ruolo Visualizzatore progetto o Visualizzatore Cloud Functions hanno accesso di sola lettura alle funzioni e ai relativi dettagli e non possono eseguire il deployment di nuove funzioni. La funzionalità Crea funzione non è selezionabile nella console Google Cloud e viene visualizzato il seguente errore:
Il messaggio di errore
gcloud
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 il ruolo Sviluppatore di Funzioni Cloud.
Autorizzazioni mancanti per l'account di servizio di Build
Il messaggio di errore
Nell'errore di deployment della funzione o nei log di compilazione, potresti visualizzare uno dei seguenti errori:
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.
La soluzione
L'account di servizio di compilazione deve disporre dell'autorizzazione di lettura dal bucket di origine e delle autorizzazioni di lettura e scrittura per il repository di deployment degli elementi. Potresti riscontrare questo errore a causa di una modifica del comportamento predefinito per l'utilizzo degli account di servizio da parte di Cloud Build, descritta in Modifica dell'account di servizio Cloud Build.
Per risolvere il problema, utilizza una di queste soluzioni:
- Crea un account di servizio di compilazione personalizzato per i deployment delle funzioni.
- Aggiungi il
ruolo dell'account di servizio Cloud Build
(
roles/cloudbuild.builds.builder
) all'account di servizio Compute predefinito. - Consulta le indicazioni di Cloud Build sulle modifiche all'account di servizio predefinito e disattiva queste modifiche.
Account di servizio di Build disattivato
Il messaggio di errore
Could not build the function due to disabled service account used by Cloud Build. Please make sure that the service account is active.
La soluzione
Per eseguire il deployment di una funzione, è necessario attivare l'account di servizio di compilazione. Potresti riscontrare questo errore a causa di una modifica del comportamento predefinito per l'utilizzo degli account di servizio da parte di Cloud Build, descritta in Modifica dell'account di servizio Cloud Build.
Per risolvere il problema, utilizza una di queste soluzioni:
- Crea un account di servizio di compilazione personalizzato per i deployment delle funzioni.
- Abilita l'account di servizio Compute predefinito.
- Consulta le indicazioni di Cloud Build sulle modifiche all'account di servizio predefinito e disattiva queste modifiche.
Pubblicazione
Questa sezione elenca i problemi di pubblicazione che potresti riscontrare e fornisce suggerimenti su come risolverli.
Errore di autorizzazione di pubblicazione a causa della 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.
La visita all'URL di Cloud Run Functions in un browser non aggiunge automaticamente un intestazione di autenticazione.
Il messaggio di errore
Codice di risposta dell'errore HTTP: 403 accesso negato
Corpo della risposta all'errore HTTP:
Error: Forbidden Your client does not have permission
to get URL /FUNCTION_NAME from this server.
La soluzione
Per risolvere questo errore, segui una di queste soluzioni:
Assegna all'utente il ruolo Invoker di Cloud Run Functions.
Ridistribuisci la funzione per consentire le chiamate non autenticate, se questa opzione è supportata dalla tua organizzazione. Questa opzione può essere utile per scopi di test.
Errore di autorizzazione di pubblicazione a causa della configurazione di allow internal traffic only
Le impostazioni di ingresso limitano la possibilità che una funzione HTTP venga invocata da risorse al di fuori del progetto Google Cloud o del perimetro di servizio dei Controlli di servizio VPC. Quando configuri l'impostazione Consenti solo traffico interno per la rete di ingress, questo messaggio di errore indica che sono consentite solo le richieste provenienti da reti VPC nello stesso progetto o nello stesso perimetro di Controlli di servizio VPC.
Il messaggio di errore
Codice di risposta dell'errore HTTP: 404 NOT FOUND
Corpo della risposta all'errore HTTP:
404 Page not found
La soluzione
Per risolvere questo errore, segui una di queste soluzioni:
Assicurati che la richiesta provenga dal progetto Google Cloud o dal perimetro di servizio Controlli di servizio VPC.
Modifica le impostazioni di ingresso in modo da consentire tutto il traffico per la funzione.
Il codice sorgente delle funzioni Cloud Run può generare un errore 404 a causa di URL della funzione, metodi HTTP o errori logici errati.
L'invocazione della funzione non dispone di credenziali di autenticazione valide
Le funzioni configurate con accesso limitato richiedono un token ID. L'invocazione della funzione non va a buon fine se utilizzi token di accesso o token di aggiornamento.
Il messaggio di errore
Codice di risposta dell'errore HTTP: 401 Accesso non autorizzato
Corpo della risposta all'errore HTTP:
Your client does not have permission to the requested URL </FUNCTION_NAME>
La soluzione
Per risolvere questo errore, segui una di queste soluzioni:
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 di identità firmato da Google. Per maggiori informazioni, consulta Eseguire l'autenticazione per l'invocazione.Richiama la funzione HTTP utilizzando le credenziali di autenticazione nell'header della richiesta. Ad esempio, puoi ottenere un token di identità utilizzando gcloud nel seguente modo:
curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME
Per ulteriori informazioni, consulta la sezione Autenticazione per l'invocazione .
La funzione si interrompe durante l'esecuzione o continua a funzionare al termine del codice
Alcuni runtime di Cloud Run Functions consentono agli utenti di eseguire attività asincrone. Se la funzione crea queste attività, deve anche attendere esplicitamente il loro completamento. In caso contrario, la funzione potrebbe interrompere l'esecuzione al momento sbagliato.
Il comportamento dell'errore
La funzione presenta 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.
- La funzione non si interrompe al termine di queste attività e continua a funzionare fino al termine del periodo di timeout.
La soluzione
Se la funzione termina in modo anomalo, devi assicurarti che tutte le attività asincrone della funzione siano completate prima che la funzione esegua una delle seguenti azioni:
- Restituire un valore
- Risolvere o rifiutare un oggetto
Promise
restituito (solo funzioni Node.js) - Generare eccezioni ed errori non rilevati
- Invio di una risposta HTTP
- Chiamare una funzione di callback
Se la funzione non riesce a terminare dopo aver completato le attività asincrone, devi verificare che indichi correttamente le funzioni Cloud Run al termine. In particolare, assicurati di eseguire una delle operazioni elencate nell'elenco precedente non appena la funzione ha completato le attività asincrone.
Errore di runtime durante l'accesso alle risorse protette dai Controlli di servizio VPC
Per impostazione predefinita, le funzioni Cloud Run utilizzano indirizzi IP pubblici per inviare richieste in uscita ad altri servizi. Le funzioni che non rientrano nel perimetro di Controlli di servizio VPC potrebbero ricevere risposte HTTP 403
quando tentano di accedere ai servizi Google Cloud protetti da Controlli di servizio VPC, a causa di rifiuti del perimetro di servizio.
Il messaggio di errore
Nei log delle risorse sottoposte a controllo, una voce come la 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
Per risolvere questo errore, segui una di queste soluzioni:
La funzione deve instradare tutto il traffico in uscita attraverso la rete VPC. Per ulteriori informazioni, consulta la sezione Eseguire il deployment di funzioni conformi ai Controlli di servizio VPC.
In alternativa, concedi al service account di runtime della funzione l'accesso al perimetro. Puoi farlo creando un livello di accesso e aggiungendolo al perimetro di servizio oppure creando un criterio in entrata nel perimetro. Per ulteriori informazioni, consulta Utilizzare i Controlli di servizio VPC con funzioni esterne a un perimetro.
Scalabilità
Questa sezione elenca i problemi di scalabilità e fornisce suggerimenti su come risolverli.
Errori di Cloud Logging relativi all'interruzione delle richieste in coda in attesa
Le seguenti condizioni possono essere associate a errori di scalabilità.
- Un enorme aumento improvviso del traffico.
- Tempo di avvio a freddo lungo.
- Tempo di elaborazione delle richieste lungo.
- Tasso di errore elevato della funzione.
- Raggiunzione del limite massimo di istanze.
- Fattori temporanei attribuiti al servizio Cloud Run Functions.
In ogni caso, le funzioni Cloud Run potrebbero non scalare abbastanza velocemente per gestire il traffico.
Il messaggio di errore
The request was aborted because there was no available instance.
Le funzioni Cloud Run hanno i seguenti livelli di gravità:
* `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.
La soluzione
- Per le funzioni basate su trigger HTTP, implementa il backoff e i tentativi di nuovo accesso esponenziali per le richieste che non devono essere ignorate. Se
attivi le funzioni Cloud Run dai flussi di lavoro,
puoi utilizzare la sintassi
try/retry
per farlo. - Per le funzioni in background o basate su eventi, le funzioni Cloud Run supportano la consegna almeno una volta. Anche senza attivare esplicitamente il nuovo tentativo, l'evento viene reintegrato automaticamente e verrà eseguito un nuovo tentativo di esecuzione della funzione. Per ulteriori informazioni, consulta Attivare i tentativi di funzioni basate su eventi.
- Quando la causa principale del problema è un periodo di errori transitori elevati attribuiti esclusivamente alle funzioni Cloud Run o se hai bisogno di assistenza per il tuo problema, contatta l'assistenza clienti Google Cloud.
Logging
La sezione seguente illustra i problemi relativi alla registrazione e come risolverli.
Le voci dei log non hanno livelli di gravità o sono errati
Le funzioni Cloud Run includono il logging di runtime per impostazione predefinita. I log scritti in stdout
o stderr
vengono visualizzati automaticamente nella console Google Cloud.
Tuttavia, per impostazione predefinita, queste voci di log contengono solo messaggi di stringa.
La soluzione
Per includere le gravità dei log, devi inviare una voce di log strutturata.
Gestire o registrare le eccezioni in modo diverso in caso di arresto anomalo
Ti consigliamo di personalizzare la gestione e la registrazione delle informazioni sugli arresti anomali.
La soluzione
Inserisci la funzione in un blocco try
per personalizzare la gestione delle eccezioni e la registrazione delle tracce dello stack.
L'aggiunta di un blocco try
può comportare un effetto collaterale indesiderato nelle funzioni basate su eventi con la configurazione retry on failure
. La ripetizione degli eventi non riusciti potrebbe non riuscire.
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 di una voce di log normale in questi ambienti di runtime è 105 KiB.
La soluzione
Invia voci di log di dimensioni inferiori a questo limite.
Log mancanti nonostante le funzioni Cloud Run restituiscano errori
Le funzioni Cloud Run trasmettono in streaming i log delle funzioni Cloud Run in un bucket predefinito. Quando crei un progetto, le funzioni Cloud Run creano e attivano il bucket predefinito. Se il bucket predefinito è disabilitato o se i log delle funzioni Cloud Run sono nel filtro di esclusione, i log non verranno visualizzati in Esplora log.
La soluzione
Attiva i log predefiniti e assicurati che non sia impostato alcun filtro di esclusione.
I log delle funzioni Cloud Run 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, è possibile che alcune voci di log non siano state ancora scritte e potrebbero essere visualizzate in un secondo momento. È inoltre possibile che alcuni log vengano persi e non possano essere visualizzati in Esplora log.
La soluzione
Utilizza l'interfaccia della libreria client per svuotare le voci di log in buffer prima di uscire dalla funzione o utilizza la libreria per scrivere le voci di log in modo sincrono. Puoi anche scrivere i log in modo sincrono direttamente in stdout
o stderr
.
I log delle funzioni Cloud Run non vengono visualizzati utilizzando l'emissario Log Router
I sink del router dei log indirizzano le voci di log a varie destinazioni.
Le impostazioni includono i filtri di esclusione, che definiscono le voci che possono essere ignorate.
La soluzione
Rimuovi il set di filtri di esclusione per resource.type="cloud_functions"
.
Connessioni al database
Molti errori del database sono associati al superamento dei limiti di connessione o al timeout. Se nei log viene visualizzato un avviso Cloud SQL, ad esempio Context deadline exceeded
, potrebbe essere necessario modificare la configurazione della connessione. Per ulteriori informazioni, consulta le best practice di Cloud SQL.
Networking
Questa sezione elenca i problemi di rete e fornisce suggerimenti su come risolverli.
Connettività di rete
Se tutte le richieste in uscita di una funzione Cloud Run non vanno a buon fine anche dopo aver configurato le impostazioni di uscita, puoi eseguire Connectivity Tests per identificare eventuali problemi di connettività di rete sottostanti. Per ulteriori informazioni, consulta Creare ed eseguire test di connettività.
Il connettore di accesso VPC serverless non è pronto o non esiste
Se un connettore di accesso VPC serverless non funziona, è possibile che non utilizzi una maschera di sottorete /28
dedicata al connettore come richiesto.
Il messaggio di errore
VPC connector projects/xxxxx/locations/REGION/connectors/xxxx
is not ready yet or does not exist.
Quando le funzioni Cloud Run vengono dipiattate con un connettore in uno stato non valido a causa dell'assenza dell'autorizzazione nell'account di servizio dell'agente di servizio API Google PROJECT_NUMBER@cloudservices.gserviceaccount.com
, si verifica il seguente errore:
Il messaggio di errore
Failed to prepare VPC connector. Please try again later.
La soluzione
Elenca le subnet
per verificare se il connettore utilizza una subnet mask /28
. Se il connettore non utilizza la subnet mask /28
, ricrea o crea un nuovo connettore.
Per risolvere il problema, segui una di queste soluzioni:
Se ricrei il connettore, non devi eseguire nuovamente il deployment di altre funzioni. Potresti riscontrare un'interruzione della rete durante la ricostituzione del connettore.
Se crei un nuovo connettore alternativo, esegui il nuovo dispiegamento delle funzioni per utilizzare il nuovo connettore, quindi elimina il connettore originale. Questo metodo evita l'interruzione della rete.
Assicurati che le funzioni Cloud Run e il relativo connettore associato siano di cui è stato eseguito il deployment nella stessa regione.
Per la configurazione del VPC condiviso :
Assicurati che agli account di servizio
SERVICE_PROJECT_NUMBER@cloudservices.gserviceaccount.com
eservice-SERVICE_PROJECT_NUMBER@gcp-sa-vpcaccess.iam.gserviceaccount.com
utilizzati da VPC Connector per il provisioning delle risorse nel progetto non manchino le autorizzazioni. Questi service account devono avere il ruoloroles/compute.networkUser
nel progetto host della configurazione del VPC condiviso quando il connettore si trova nel progetto di servizio. In caso contrario, è obbligatorioroles/compute.networkAdmin
.Se il connettore viene creato nel progetto host, assicurati che il ruolo
Serverless VPC Access User
sia assegnato aCloud Run functions Service Agent
nel progetto host.Se lo stato del connettore mostra l'errore
Connector is in a bad state, manual deletion recommended
e all'agente di servizio delle API di Google mancano le autorizzazioni necessarie per il provisioning delle risorse di calcolo nel progetto del connettore, concediroles/compute.admin
all'account di servizioPROJECT_NUMBER@cloudservices.gserviceaccount.com
. In alcuni casi, potrebbe essere necessario ricreare il connettore dopo aver aggiornato le autorizzazioni.
Il traffico SMTP verso indirizzi IP di destinazione esterni che utilizzano la porta TCP 25 è bloccato
Per una maggiore sicurezza, Google Cloud blocca le connessioni alla porta di destinazione TCP 25
quando invii email dalle funzioni Cloud Run.
La soluzione
Per sbloccare queste connessioni, scegli una delle seguenti opzioni:
Connettiti al server SMTP su una porta diversa, ad esempio la porta TCP
587
o465
.
Altro
Questa sezione illustra eventuali problemi aggiuntivi che non rientrano in altre categorie e offre soluzioni per ciascuno.
Errore di Controlli di servizio VPC nel metodo google.storage.buckets.testIamPermissions
in Cloud Audit Logs
Quando apri la pagina Dettagli funzione nella console Google Cloud, le funzioni Cloud Run verificano se puoi modificare il repository di archiviazione dell'immagine del contenitore e accedervi pubblicamente. Per la verifica, le funzioni Cloud Run inviano una richiesta al bucket Container Registry utilizzando il metodo google.storage.buckets.testIamPermissions
con il seguente formato:[REGION].artifacts.[PROJECT_ID].appspot.com
. L'unica differenza tra i controlli è che uno viene eseguito con autenticazione per verificare le autorizzazioni utente per modificare il bucket, mentre l'altro viene eseguito senza autenticazione per verificare se il bucket è accessibile pubblicamente.
Se il perimetro di Controlli di servizio VPC limita l'API storage.googleapis.com
, la console Google Cloud mostra un errore nel metodo google.storage.buckets.testIamPermissions
in Cloud Audit Logs.
Il messaggio di errore
Per il controllo dell'accesso pubblico senza informazioni di autenticazione, gli audit log del Risoluzione dei problemi relativi ai criteri di rifiuto delle autorizzazioni VPC mostrano 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": {}, "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", ...
Per il controllo dell'accesso pubblico con informazioni di autenticazione, i log di controllo del Criterio di rifiuto VPC SC mostrano una voce che consente all'utente di modificare le impostazioni del bucket simili all'esempio 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": "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", ...
La soluzione
Se il bucket Container Registry non è accessibile pubblicamente, puoi ignorare gli errori di Controlli di servizio VPC.
In alternativa, puoi aggiungere una regola di ingresso di Controlli di servizio VPC per consentire il metodo google.storage.buckets.testIamPermissions
, come mostrato nell'esempio seguente:
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" }
Se possibile, puoi perfezionare ulteriormente la regola di ingresso definendo il livello di accesso con gli indirizzi IP degli utenti.