Salta al contenuto

Come posso risolvere gli errori di Amazon S3 che ricevo a causa di eccezioni di AWS SDK per Java?

5 minuti di lettura
0

Desidero risolvere gli errori che si verificano quando utilizzo AWS SDK per Java per accedere alle mie risorse Amazon Simple Storage Service (Amazon S3).

Breve descrizione

Quando utilizzi AWS SDK, potresti ricevere i seguenti errori relativi a client e servizi:

  • AmazonClientException o SdkClientException
  • AmazonServiceException, AwsServiceException o AmazonS3Exception
  • UnknownHostException

Per risolvere gli errori precedenti, identifica prima il tipo di eccezione, quindi completa la risoluzione del problema.

Risoluzione

AmazonClientException o SdkClientException

L'errore AmazonClientException o SdkClientException si verifica quando non puoi inviare una richiesta o analizzare una risposta da AWS a causa di errori nel codice del client.

Per risolvere il problema, intraprendi le seguenti azioni:

  • Controlla l'utilizzo delle impostazioni proxy da parte dell'ambiente locale e imposta la configurazione del proxy per S3Client nel codice. Se utilizzi AWS SDK per Java 2.x, configura il client S3 per utilizzare i proxy HTTP.
    Se utilizzi AWS SDK per Java 1.x, utilizza il seguente codice per aggiornare la configurazione del client S3:

    // Proxy configuration Java 1.x
            ClientConfiguration clientConfig = new ClientConfiguration();
            clientConfig.setProxyHost("your_proxy.example.com");
            clientConfig.setProxyPort(YOUR_PROXY_PORT);
    
            // Optional: If proxy requires authentication
            clientConfig.setProxyUsername(YOUR_PROXY_USERNAME);
            clientConfig.setProxyPassword(YOUR_PROXY_PASSWORD);
    
            // Create S3 client with proxy configuration
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withRegion(YOUR_REGION)
                    .withCredentials(new AWSStaticCredentialsProvider(credentials))
                    .withClientConfiguration(clientConfig)
                    .build();
  • Esegui una prova della connettività di rete agli endpoint di S3 con strumenti come nslookup, ping, cURL o telnet. Per risolvere i problemi di connettività di rete, consulta Come posso risolvere un errore di connessione quando eseguo i comandi "cp" o sul mio bucket Amazon S3?"sync"

  • Stampa o registra le configurazioni del client S3 per verificare di averlo configurato correttamente.
    Esempio di configurazione:

    // AWS SDK for Java v1.x
    
        public static void validateClientConfiguration(AmazonS3 s3Client) {
            try {
                // See: https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/ClientConfiguration.html
                ClientConfiguration config = s3Client.getClientConfiguration();
    
                System.out.println("=== Currnt S3 Client Configuration ===");
    
                // Connection Settings
                System.out.println("Max Connections: " + config.getMaxConnections());
                System.out.println("Connection Timeout: " + config.getConnectionTimeout() + "ms");
                System.out.println("Socket Timeout: " + config.getSocketTimeout() + "ms");
                System.out.println("Request Timeout: " + config.getRequestTimeout() + "ms");
                System.out.println("Client Execution Timeout: " + config.getClientExecutionTimeout() + "ms");
    
                // Retry Settings
                System.out.println("Max Error Retry: " + config.getMaxErrorRetry());
                System.out.println("Retry Policy: " + config.getRetryPolicy());
    
                // Proxy Settings
                if (config.getProxyHost() != null) {
                    System.out.println("Proxy Host: " + config.getProxyHost());
                    System.out.println("Proxy Port: " + config.getProxyPort());
                }
    
                // Protocol Settings
                System.out.println("Protocol: " + config.getProtocol());
    
                // Region/Endpoint but only if you are using the AmazonS3ClientBuilder client
                // See https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3ClientBuilder.html
    
                System.out.println("Region: " + s3Client.getRegion());
    
    
            } catch (Exception e) {
                System.err.println("Error validating client configuration: " + e.getMessage());
            }
        }
  • Controlla se sono presenti vincoli di connessione o risorse nelle impostazioni del trasporto HTTP nella configurazione del client S3. Per ulteriori informazioni, consulta Configurazione del client e Configurare i client HTTP in AWS SDK per Java 2.x.

  • Esegui questo comando try-catch-finally per chiudere il client S3 il prima possibile in modo che altre richieste possano utilizzare la connessione:

    try {
                .... // your code
            } catch (Exception e) {
                .... // catch exception
            } finally {
                // close the S3 client
                s3Client.close();
            }
  • Se utilizzi credenziali temporanee, esegui questo comando try-catch per verificare che le credenziali non siano scadute:

    // sample method for AWS SDK Java 2.x
        public static boolean areCredentialsExpired(AwsCredentialsProvider credentialsProvider) {
            try {
                AwsCredentials credentials = credentialsProvider.resolveCredentials();
    
                if (credentials instanceof AwsSessionCredentials) {
                    return false;
                }
            } catch (S3Exception e) {
                //Check if exception contains any expired credentials indication.
                if("ExpiredToken".equals(e.awsErrorDetails().errorCode())){
                   return true;
                }
            } catch (Exception e) {
                // If we can't resolve credentials, they're likely expired
                return true;
            }
    
            return true;
        }

AmazonServiceException, AwsServiceException o AmazonS3Exception

Se ricevi un errore AmazonServiceException, AwsServiceException o AmazonS3Exception, si è verificato un problema dopo aver inviato con successo la richiesta al servizio AWS. Per risolvere il problema, controlla il codice di stato HTTP nella risposta della traccia dello stack. I seguenti esempi sono alcuni degli errori del codice di stato che potresti riscontrare. Per un elenco completo dei codici di stato HTTP, consulta List of error codes (Elenco dei codici di errore).

HTTP 400

L'errore HTTP 400 si verifica a causa di una sintassi della richiesta non corretta. Prima di inviare la richiesta ad Amazon S3, registra o stampa temporaneamente la richiesta per verificarne la sintassi.

HTTP 409

Verifica se Amazon S3 ha rimosso un bucket eliminato di recente prima di crearne uno nuovo.

HTTP 403

Ricevi un errore Access denied quando non hai l'autorizzazione per eseguire azioni. Controlla le autorizzazioni AWS Identity and Access Management (AWS IAM), le policy di controllo dei servizi (SCP), la policy del bucket S3 e la proprietà degli oggetti per assicurarti di avere autorizzazioni sufficienti. Inoltre, assicurati che le credenziali non siano scadute.

L'errore Access denied si verifica anche quando un principale IAM richiede un oggetto senza autorizzazioni ****"s3:ListBucket" e l'oggetto non esiste nel bucket S3.

Per ulteriori informazioni, consulta Risoluzione dei problemi relativi agli errori di accesso negato (403 Forbidden) in Amazon S3.

HTTP 404

Assicurati che l'oggetto S3 esista nel bucket.

HTTP 500

Ritenta le richieste o introduci un ritardo nel codice. Per impostazione predefinita, ogni modalità di ripetizione standard di AWS SDK prevede tre tentativi massimi. Se i tentativi non risolvono il problema, incrementa il valore.

HTTP 503

Distribuisci gli oggetti tra più prefissi. Per ulteriori informazioni, consulta Come faccio a risolvere un errore HTTP 500 o 503 di Amazon S3?

UnknownHostException

Se ricevi un errore UnknownHostException, assicurati che non siano presenti problemi di risoluzione DNS verso gli endpoint di S3.

Informazioni correlate

Gestione degli errori in AWS SDK per Java 2.x

Gestione delle eccezioni

AWS UFFICIALEAggiornata un anno fa