In questa pagina vengono descritti i metodi per la risoluzione degli errori comuni che potrebbero verificarsi durante l'utilizzo di Cloud Storage.
Consulta la Dashboard dello stato di Google Cloud per informazioni sugli incidenti a livello di regione o globale che interessano i servizi Google Cloud come Cloud Storage.
Registrazione delle richieste non elaborate
Quando utilizzi strumenti come gcloud
o le librerie client di Cloud Storage, gran parte delle informazioni su richieste e risposte viene gestita dallo strumento. Tuttavia, a volte è utile visualizzare dettagli per risolvere i problemi o pubblicare domande nei forum, ad esempio Stack Overflow. Segui queste istruzioni per restituire le intestazioni di richiesta e risposta per il tuo strumento:
Console
La visualizzazione delle informazioni su richieste e risposte dipende dal browser utilizzato per accedere alla console Google Cloud. Per il browser Google Chrome:
Fai clic sul pulsante del menu principale di Chrome (
).
Seleziona Altri strumenti.
Fai clic su Strumenti per sviluppatori.
Nel riquadro visualizzato, fai clic sulla scheda Rete.
Riga di comando
gcloud
Nella tua richiesta, utilizza i flag di debug globali. Ad esempio:
gcloud storage ls gs://my-bucket/my-object --log-http --verbosity=debug
gsutil
Utilizza il flag globale -D
nella richiesta. Ad esempio:
gsutil -D ls gs://my-bucket/my-object
Librerie client
C++
Imposta la variabile di ambiente
CLOUD_STORAGE_ENABLE_TRACING=http
per recuperare il traffico HTTP completo.Imposta la variabile di ambiente CLOUD_STORAGE_ENABLE_CLOG=yes per ottenere il logging di ogni RPC.
C#
Aggiungi un logger tramite ApplicationContext.RegisterLogger
e imposta le opzioni di logging sul gestore di messaggi HttpClient
. Per ulteriori informazioni, consulta la voce delle Domande frequenti.
Go
Imposta la variabile di ambiente GODEBUG=http2debug=1
. Per maggiori
informazioni, consulta il sito Go package net/http.
Se vuoi registrare anche il corpo della richiesta, utilizza un client HTTP personalizzato.
Java
Crea un file denominato "logging.properties" con il seguente contenuto:
# Properties file which configures the operation of the JDK logging facility. # The system will look for this config file to be specified as a system property: # -Djava.util.logging.config.file=${project_loc:googleplus-simple-cmdline-sample}/logging.properties # Set up the console handler (uncomment "level" to show more fine-grained messages) handlers = java.util.logging.ConsoleHandler java.util.logging.ConsoleHandler.level = CONFIG # Set up logging of HTTP requests and responses (uncomment "level" to show) com.google.api.client.http.level = CONFIG
Utilizza logging.properties con Maven
mvn -Djava.util.logging.config.file=path/to/logging.properties insert_command
Per ulteriori informazioni, consulta la sezione sul trasporto HTTP collegabile.
Node.js
Imposta la variabile di ambiente NODE_DEBUG=https
prima di chiamare lo script del nodo.
PHP
Fornisci il tuo gestore HTTP al client utilizzando httpHandler
e configura il middleware per registrare la richiesta e la risposta.
Python
Utilizza il modulo di logging. Ad esempio:
import logging import http.client logging.basicConfig(level=logging.DEBUG) http.client.HTTPConnection.debuglevel=5
Ruby
Nella parte superiore del .rb file
dopo require "google/cloud/storage"
, aggiungi quanto segue:
ruby Google::Apis.logger.level = Logger::DEBUG
Aggiungere intestazioni personalizzate
L'aggiunta di intestazioni personalizzate alle richieste è uno strumento comune per scopi di debug, ad esempio per abilitare le intestazioni di debug o per tracciare una richiesta. L'esempio seguente mostra come impostare le intestazioni delle richieste per i diversi strumenti Cloud Storage:
Riga di comando
gcloud
Utilizza il flag --additional-headers
, disponibile per la maggior parte dei comandi. Ad esempio:
gcloud storage objects describe gs://my-bucket/my-object --additional-headers=HEADER_NAME=HEADER_VALUE
Dove HEADER_NAME
e
HEADER_VALUE
definiscono l'intestazione che stai aggiungendo
alla richiesta.
gsutil
Utilizza il flag globale -h
nella richiesta. Ad esempio:
gsutil -h "HEADER_NAME:HEADER_VALUE" stat gs://my-bucket/my-object
Dove HEADER_NAME
e
HEADER_VALUE
definiscono l'intestazione che stai aggiungendo
alla richiesta.
Librerie client
C++
namespace gcs = google::cloud::storage;
gcs::Client client = ...;
client.AnyFunction(... args ..., gcs::CustomHeader("header-name", "value"));
C#
L'esempio seguente aggiunge un'intestazione personalizzata a ogni richiesta effettuata dalla libreria client.
using Google.Cloud.Storage.V1;
var client = StorageClient.Create();
client.Service.HttpClient.DefaultRequestHeaders.Add("custom-header", "custom-value");
var buckets = client.ListBuckets("my-project-id");
foreach (var bucket in buckets)
{
Console.WriteLine(bucket.Name);
}
Go
Per aggiungere intestazioni personalizzate alle richieste effettuate dalla libreria client Go, è necessario includere il trasporto utilizzato per il client con un RoundTripper
personalizzato.
L'esempio seguente invia le intestazioni di debug e registra le intestazioni di risposta corrispondenti:
package main
import (
"context"
"io/ioutil"
"log"
"net/http"
"cloud.google.com/go/storage"
"google.golang.org/api/option"
raw "google.golang.org/api/storage/v1"
htransport "google.golang.org/api/transport/http"
)
func main() {
ctx := context.Background()
// Standard way to initialize client:
// client, err := storage.NewClient(ctx)
// if err != nil {
// // handle error
// }
// Instead, create a custom http.Client.
base := http.DefaultTransport
trans, err := htransport.NewTransport(ctx, base, option.WithScopes(raw.DevstorageFullControlScope),
option.WithUserAgent("custom-user-agent"))
if err != nil {
// Handle error.
}
c := http.Client{Transport:trans}
// Add RoundTripper to the created HTTP client.
c.Transport = withDebugHeader{c.Transport}
// Supply this client to storage.NewClient
client, err := storage.NewClient(ctx, option.WithHTTPClient(&c))
if err != nil {
// Handle error.
}
// Use client to make a request
}
type withDebugHeader struct {
rt http.RoundTripper
}
func (wdh withDebugHeader) RoundTrip(r *http.Request) (*http.Response, error) {
headerName := "X-Custom-Header"
r.Header.Add(headerName, "value")
resp, err := wdh.rt.RoundTrip(r)
if err == nil {
log.Printf("Resp Header: %+v, ", resp.Header.Get(headerName))
} else {
log.Printf("Error: %+v", err)
}
return resp, err
}
Java
import com.google.api.gax.rpc.FixedHeaderProvider;
import com.google.api.gax.rpc.HeaderProvider;
import com.google.cloud.WriteChannel;
import com.google.cloud.storage.BlobInfo;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;
import java.io.IOException;
import java.nio.ByteBuffer;
import static java.nio.charset.StandardCharsets.UTF_8;
public class Example {
public void main(String args[]) throws IOException {
HeaderProvider headerProvider =
FixedHeaderProvider.create("custom-header", "custom-value");
Storage storage = StorageOptions.getDefaultInstance()
.toBuilder()
.setHeaderProvider(headerProvider)
.build().getService();
String bucketName = "example-bucket";
String blobName = "test-custom-header";
// Use client with custom header
BlobInfo blob = BlobInfo.newBuilder(bucketName, blobName).build();
byte[] stringBytes;
try (WriteChannel writer = storage.writer(blob)) {
stringBytes = "hello world".getBytes(UTF_8);
writer.write(ByteBuffer.wrap(stringBytes));
}
}
}
Node.js
const storage = new Storage();
storage.interceptors.push({
request: requestConfig => {
Object.assign(requestConfig.headers, {
'X-Custom-Header': 'value',
});
return requestConfig;
},
});
PHP
Tutte le chiamate di metodo che attivano le richieste http accettano un argomento $restOptions
facoltativo come ultimo argomento. Puoi fornire intestazioni personalizzate su richiesta o per singoli clienti.
use Google\Cloud\Storage\StorageClient;
$client = new StorageClient([
'restOptions' => [
'headers' => [
'x-foo' => 'bat'
]
]
]);
$bucket = $client->bucket('my-bucket');
$bucket->info([
'restOptions' => [
'headers' => [
'x-foo' => 'bar'
]
]
]);
Python
Al momento, l'aggiunta di intestazioni personalizzate alle richieste effettuate dalla libreria client Python non è supportata.
Ruby
require "google/cloud/storage"
storage = Google::Cloud::Storage.new
storage.add_custom_headers { 'X-Custom-Header'=> 'value' }
Codici di errore
Di seguito sono riportati i codici di stato HTTP più comuni.
301: spostato definitivamente
Problema: sto configurando un sito web statico e l'accesso a un percorso della directory
restituisce un oggetto vuoto e un codice di risposta HTTP 301
.
Soluzione: se il browser scarica un oggetto da zero byte e ricevi un codice di risposta HTTP 301
quando accedi a una directory, ad esempio http://www.example.com/dir/
, è molto probabile che il tuo bucket contenga un oggetto vuoto di quel nome. Per verificare che sia così e risolvere il problema:
- Nella console Google Cloud, vai alla pagina Bucket di Cloud Storage.
- Fai clic sul pulsante Attiva Cloud Shell nella parte superiore della console Google Cloud.
- Esegui
gcloud storage ls --recursive gs://www.example.com/dir/
. Se l'output includehttp://www.example.com/dir/
, significa che hai un oggetto vuoto in quella posizione. - Rimuovi l'oggetto vuoto con il comando:
gcloud storage rm gs://www.example.com/dir/
Ora puoi accedere a http://www.example.com/dir/
e fare in modo che restituisca il file index.html
della directory anziché l'oggetto vuoto.
400: Richiesta errata
Problema: mentre eseguivo un caricamento ripristinabile, ho ricevuto questo errore e il messaggio
Failed to parse Content-Range header.
Soluzione: il valore utilizzato nell'intestazione Content-Range
non è valido. Ad
esempio, Content-Range: */*
non è valido e deve essere invece specificato come
Content-Range: bytes */*
. Se ricevi questo errore, il caricamento corrente ripristinabile non è più attivo e devi avviarne uno nuovo.
401: Non autorizzato
Problema: le richieste inviate direttamente a un bucket pubblico o tramite Cloud CDN non riescono con
una HTTP 401: Unauthorized
e una risposta Authentication Required
.
Soluzione: verifica che il tuo client o un proxy intermedio non stia aggiungendo un'intestazione Authorization
alle richieste a Cloud Storage. Qualsiasi richiesta con un'intestazione Authorization
, anche se vuota, viene convalidata come se si trattasse di un tentativo di autenticazione.
403: Account disattivato
Problema: ho provato a creare un bucket, ma ho ricevuto un errore 403 Account Disabled
.
Soluzione: questo errore indica che non hai ancora attivato la fatturazione per il progetto associato. Per i passaggi per abilitare la fatturazione, consulta Abilitare la fatturazione per un progetto.
Se la fatturazione è attiva e continui a ricevere questo messaggio di errore, puoi contattare l'assistenza fornendo il tuo ID progetto e una descrizione del problema.
403: Vietato
Problema: avrei bisogno di avere l'autorizzazione per accedere a un determinato bucket o oggetto, ma
quando cerco di farlo, ricevo un errore 403 - Forbidden
con un messaggio
simile a: example@email.com does not have storage.objects.get access to the
Google Cloud Storage object
.
Soluzione: non disponi di un'autorizzazione IAM per il bucket o l'oggetto richiesto per completare la richiesta. Se prevedi di poter effettuare la richiesta, ma non riesci, esegui i seguenti controlli:
Nel messaggio di errore viene fatto riferimento al beneficiario che ti aspettavi? Se il messaggio di errore si riferisce a un indirizzo email imprevisto o a "Chiamante anonimo", la tua richiesta non utilizza le credenziali che avevi previsto. Il motivo potrebbe essere che lo strumento che stai utilizzando per effettuare la richiesta è stato configurato con le credenziali di un altro alias o un'altra entità oppure potrebbe essere dovuto al fatto che la richiesta viene effettuata per tuo conto da un account di servizio.
Pensi che l'autorizzazione indicata nel messaggio di errore ti serva? Se l'autorizzazione è imprevista, è probabile che lo strumento che stai utilizzando richiede un accesso aggiuntivo per completare la richiesta. Ad esempio, per eseguire l'eliminazione collettiva degli oggetti in un bucket,
gcloud
deve prima creare un elenco di oggetti nel bucket da eliminare. Questa parte dell'azione di eliminazione collettiva richiede l'autorizzazionestorage.objects.list
, il che potrebbe sorprendere, dato che l'obiettivo è l'eliminazione degli oggetti, che in genere richiede solo l'autorizzazionestorage.objects.delete
. Se questa è la causa del tuo messaggio di errore, assicurati di ricevere i ruoli IAM che dispongono delle autorizzazioni aggiuntive necessarie.Ti è stato concesso il ruolo IAM sulla risorsa o sulla risorsa padre prevista? Ad esempio, se ti viene concesso il ruolo
Storage Object Viewer
per un progetto e stai tentando di scaricare un oggetto, assicurati che l'oggetto si trovi in un bucket che si trova nel progetto; potresti avere inavvertitamente l'autorizzazioneStorage Object Viewer
per un altro progetto.
403: Vietato
Problema: scarico i contenuti da storage.cloud.google.com
e ricevo un errore 403: Forbidden
quando utilizzo il browser per raggiungere l'oggetto tramite l'URL:
https://storage.cloud.google.com/BUCKET_NAME/OBJECT_NAME
Soluzione: l'utilizzo di storage.cloud.google.com
per scaricare oggetti è noto come download di browser autenticati, che utilizza l'autenticazione basata sui cookie.
Se hai configurato gli audit log di accesso ai dati in Cloud Audit Logs per monitorare
l'accesso agli oggetti, una delle limitazioni di questa funzionalità è che
i download autenticati del browser non possono essere utilizzati per scaricare un oggetto monitorato,
a meno che l'oggetto non sia leggibile pubblicamente. Il tentativo di utilizzare un download autenticato dal browser per oggetti non pubblici comporta una risposta 403
. Questa limitazione esiste per impedire il phishing per gli ID Google, che vengono utilizzati per l'autenticazione basata sui cookie.
Per evitare il problema, procedi in uno dei seguenti modi:
- Utilizza chiamate API dirette, che supportano i download non autenticati, anziché utilizzare i download autenticati del browser.
- Disattiva gli audit log di accesso ai dati di Cloud Storage che monitorano l'accesso agli oggetti interessati. Tieni presente che gli audit log di accesso ai dati sono impostati o a livello di progetto e possono essere abilitati contemporaneamente su più livelli.
- Imposta le esenzioni per escludere determinati utenti dal monitoraggio degli audit log di accesso ai dati, che consente di eseguire download autenticati del browser.
- Rendi pubblicamente leggibili gli oggetti interessati concedendo l'autorizzazione di lettura a
allUsers
oallAuthenticatedUsers
. Gli audit log di accesso ai dati non registrano l'accesso agli oggetti pubblici.
409: Conflitto
Problema: ho provato a creare un bucket, ma ho ricevuto il seguente errore:
409 Conflict. Sorry, that name is not available. Please try a different one.
Soluzione: il nome del bucket che hai provato a utilizzare (ad es. gs://cats
o gs://dogs
) è già in uso. Cloud Storage dispone di uno spazio dei nomi globale, pertanto non puoi assegnare un nome a un bucket con lo stesso nome di un bucket esistente. Scegli un nome che non sia utilizzato.
429: Troppe richieste
Problema: le mie richieste sono state rifiutate con un errore 429 Too Many Requests
.
Soluzione: stai raggiungendo il numero massimo di richieste consentite da Cloud Storage per una determinata risorsa. Per una discussione sui limiti in Cloud Storage, consulta le quote di Cloud Storage. Se il tuo carico di lavoro consiste in 1000 richieste al secondo a un bucket, consulta le linee guida per frequenza e distribuzione degli accessi per una discussione sulle best practice, ad esempio per aumentare gradualmente il carico di lavoro ed evitare nomi di file sequenziali.
429: Troppe richieste
Problema: le mie richieste vengono rifiutate con il seguente errore:
429 Too Many Requests. This workload is drawing too much egress bandwidth from Cloud Storage and has exceeded the InternetEgressBandwidth Quota. Please reduce the rate of request or contact Google Cloud Support if you want to increase your bandwidth quota.
Soluzione: il traffico in uscita verso Internet potrebbe essere limitato in base alla cronologia del progetto. Contatta l'assistenza Google Cloud per richiedere un aumento della quota della larghezza di banda.
Diagnosticare gli errori della console Google Cloud
Problema: quando utilizzo la console Google Cloud per eseguire un'operazione, viene visualizzato un messaggio di errore generico. Ad esempio, viene visualizzato un messaggio di errore quando tento di eliminare un bucket, ma non vedo i dettagli per cui l'operazione non è riuscita.
Soluzione: utilizza le notifiche della console Google Cloud per visualizzare informazioni dettagliate sull'operazione non riuscita:
Fai clic sul pulsante Notifiche nell'intestazione della console Google Cloud.
Un menu a discesa mostra le operazioni più recenti eseguite dalla console Google Cloud.
Fai clic sull'elemento di cui vuoi saperne di più.
Si apre una pagina in cui sono visualizzate informazioni dettagliate sull'operazione.
Fai clic su ogni riga per espandere le informazioni dettagliate sull'errore.
Di seguito è riportato un esempio di informazioni di errore per un'operazione di eliminazione del bucket non riuscita, che spiega che un criterio di conservazione del bucket ha impedito l'eliminazione del bucket.
Errori del sito web statico
Di seguito sono riportati i problemi comuni che potresti riscontrare durante la configurazione di un bucket per l'hosting di un sito web statico.
Pubblicazione tramite HTTPS
Problema: voglio pubblicare i miei contenuti su HTTPS senza utilizzare un bilanciatore del carico.
Soluzione: puoi pubblicare contenuti statici tramite HTTPS utilizzando URI diretti, come https://storage.googleapis.com/my-bucket/my-object
. Per altre opzioni
per pubblicare i tuoi contenuti tramite un dominio personalizzato su SSL, puoi:
- Utilizzare una rete di distribuzione dei contenuti di terze parti con Cloud Storage.
- Pubblica i contenuti del tuo sito web statico da Firebase Hosting anziché da Cloud Storage.
Verifica del dominio
Problema: non riesco a verificare il mio dominio.
Soluzione: in genere, il processo di verifica in Search Console ti indica di caricare un file nel tuo dominio, ma potresti non avere un modo per farlo senza prima avere un bucket associato, che puoi creare solo dopo aver eseguito la verifica del dominio.
In questo caso, verifica la proprietà utilizzando il metodo di verifica del provider del nome di dominio. Per i passaggi necessari, consulta Verifica della proprietà. Questa verifica può essere eseguita prima della creazione del bucket.
Pagina non accessibile
Problema: ricevo un messaggio di errore Access denied
per una pagina web pubblicata dal mio
sito web.
Soluzione: verifica che l'oggetto sia condiviso pubblicamente. In caso contrario, consulta Rendere pubblici i dati per istruzioni su come eseguire questa operazione.
Se in precedenza hai caricato e condiviso un oggetto, ma successivamente ne carichi una nuova versione, devi ricondividere l'oggetto pubblicamente. Questo perché l'autorizzazione pubblica viene sostituita dal nuovo caricamento.
Aggiornamento autorizzazione non riuscito
Problema: ricevo un errore quando provo a rendere pubblici i miei dati.
Soluzione: assicurati di avere l'autorizzazione setIamPolicy
per l'oggetto o il bucket. Questa autorizzazione viene concessa, ad esempio, nel ruolo Storage Admin
. Se hai l'autorizzazione setIamPolicy
e continui a visualizzare un errore, il tuo bucket potrebbe essere soggetto alla prevenzione dell'accesso pubblico, che non consente l'accesso a allUsers
o allAuthenticatedUsers
. La prevenzione dell'accesso pubblico potrebbe essere impostata direttamente nel bucket o applicata tramite un criterio dell'organizzazione impostato a un livello superiore.
Download di contenuti
Problema: mi viene chiesto di scaricare i contenuti della mia pagina, invece di poterli visualizzare nel browser.
Soluzione: se specifichi un MainPageSuffix
come oggetto che non ha un tipo di contenuto web, al posto della pagina viene chiesto ai visitatori del sito di scaricare i contenuti. Per risolvere il problema, aggiorna la voce di metadati content-type impostandola su un valore appropriato, ad esempio text/html
. Per istruzioni su come fare, consulta la sezione Modificare i metadati degli oggetti.
Latenza
Di seguito sono riportati i problemi di latenza più comuni che potresti riscontrare. Inoltre, la Dashboard dello stato di Google Cloud fornisce informazioni sugli incidenti a livello di regione o globale che interessano i servizi Google Cloud come Cloud Storage.
Latenza di caricamento o download
Problema: vedo un aumento della latenza durante il caricamento o il download.
Soluzione: utilizza il comando gsutil perfdiag
per eseguire la diagnostica delle prestazioni dell'ambiente interessato. Considera le seguenti cause comuni di latenza di caricamento e download:
Vincoli di CPU o memoria: il sistema operativo dell'ambiente interessato dovrebbe avere strumenti per misurare il consumo di risorse locali, ad esempio l'utilizzo della CPU e della memoria.
Vincoli IO del disco: come parte del comando
gsutil perfdiag
, utilizza i testrthru_file
ewthru_file
per valutare l'impatto sulle prestazioni causato dall'IO del disco locale.Distanza geografica: le prestazioni possono essere influenzate dalla separazione fisica del bucket Cloud Storage e dall'ambiente interessato, in particolare nei casi intercontinentali. Eseguire test con un bucket situato nella stessa regione dell'ambiente interessato può identificare fino a che punto la separazione geografica contribuisce alla latenza.
- Se applicabile, il resolver DNS dell'ambiente interessato deve utilizzare il protocollo EDNS(0) in modo che le richieste dall'ambiente vengano indirizzate tramite un Google Front End (GFE) appropriato.
Latenza dell'interfaccia a riga di comando o della libreria client
Problema: vedo una latenza maggiore quando accedi a Cloud Storage con gcloud storage
, gsutil o una delle librerie client.
Soluzione: le interfacce a riga di comando e le librerie client ripetono automaticamente le richieste quando è utile e questo comportamento può aumentare efficacemente la latenza vista dall'utente finale. Utilizza la metrica Cloud Monitoring storage.googleapis.com/api/request_count
per verificare se Cloud Storage fornisce in modo coerente un codice di risposta ripetibile, ad esempio 429
o 5xx
.
Server proxy
Problema: la connessione avviene tramite un server proxy. Cosa devo fare?
Soluzione: per accedere a Cloud Storage tramite un server proxy, devi consentire l'accesso ai seguenti domini:
accounts.google.com
per la creazione di token di autenticazione OAuth2oauth2.googleapis.com
per l'esecuzione di scambi di token OAuth2*.googleapis.com
per le richieste di spazio di archiviazione
Se il tuo server proxy o il criterio di sicurezza non supporta la lista consentita per dominio e richiede invece l'autorizzazione tramite blocco di rete IP, ti consigliamo vivamente di configurare il server proxy per tutti gli intervalli di indirizzi IP di Google. Puoi trovare gli intervalli di indirizzi eseguendo query sui dati WHOIS in ARIN. Come best practice, ti consigliamo di esaminare periodicamente le impostazioni del proxy per assicurarti che corrispondano agli indirizzi IP di Google.
Non è consigliabile configurare il proxy con indirizzi IP individuali ottenuti da ricerche una tantum di oauth2.googleapis.com
e storage.googleapis.com
. Poiché i servizi Google sono esposti tramite nomi DNS che vengono mappati a un numero elevato di indirizzi IP che possono cambiare nel tempo, la configurazione del proxy in base a una ricerca una tantum potrebbe causare errori di connessione a Cloud Storage.
Se le tue richieste vengono instradate tramite un server proxy, potrebbe essere necessario chiedere all'amministratore di rete che l'intestazione Authorization
contenente le tue credenziali non sia rimossa dal proxy. Senza
l'intestazione Authorization
, le tue richieste vengono rifiutate e ricevi un errore
MissingSecurityHeader
.
Passaggi successivi
- Scopri le opzioni di assistenza.
- Trova le risposte ad altre domande nella sezione Domande frequenti su Cloud Storage.
- Scopri come Error Reporting può aiutarti a identificare e comprendere gli errori di Cloud Storage.