Risolvere i problemi

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:

  1. Fai clic sul pulsante del menu principale di Chrome ().

  2. Seleziona Altri strumenti.

  3. Fai clic su Strumenti per sviluppatori.

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

  1. 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
  2. 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:

  1. Nella console Google Cloud, vai alla pagina Bucket di Cloud Storage.

    Vai a Bucket

  2. Fai clic sul pulsante Attiva Cloud Shell nella parte superiore della console Google Cloud. Attiva Cloud Shell
  3. Esegui gcloud storage ls --recursive gs://www.example.com/dir/. Se l'output include http://www.example.com/dir/, significa che hai un oggetto vuoto in quella posizione.
  4. 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:

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

  2. 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'autorizzazione storage.objects.list, il che potrebbe sorprendere, dato che l'obiettivo è l'eliminazione degli oggetti, che in genere richiede solo l'autorizzazione storage.objects.delete. Se questa è la causa del tuo messaggio di errore, assicurati di ricevere i ruoli IAM che dispongono delle autorizzazioni aggiuntive necessarie.

  3. 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'autorizzazione Storage 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 o allAuthenticatedUsers. 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:

  1. Fai clic sul pulsante Notifiche nell'intestazione della console Google Cloud.

    Notifiche

    Un menu a discesa mostra le operazioni più recenti eseguite dalla console Google Cloud.

  2. Fai clic sull'elemento di cui vuoi saperne di più.

    Si apre una pagina in cui sono visualizzate informazioni dettagliate sull'operazione.

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

    Dettagli errore di eliminazione 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:

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 test rthru_file e wthru_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 OAuth2
  • oauth2.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