Direkt zum Inhalt

Wie behebe ich die Amazon S3-Fehler, die ich vom AWS SDK für Java-Ausnahmen erhalte?

Lesedauer: 5 Minute
0

Ich möchte die Fehler beheben, die auftreten, wenn ich das AWS SDK für Java verwende, um auf meine Amazon Simple Storage Service (Amazon S3)-Ressourcen zuzugreifen.

Kurzbeschreibung

Wenn du AWS SDKs verwendest, erhältst du möglicherweise die folgenden Client- und Service-Fehler:

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

Um die vorherigen Fehler zu beheben, identifiziere zunächst den Ausnahmetyp und schließe dann die Lösung für das Problem ab.

Lösung

AmazonClientException oder SdkClientException

AmazonClientException oder SdkClientException tritt auf, wenn du aufgrund von Fehlern im Client-Code keine Anfrage an AWS senden oder eine Antwort von AWS nicht analysieren kannst.

Gehe wie folgt vor, um dieses Problem zu beheben:

  • Überprüfe die Verwendung von Proxyeinstellungen in der lokalen Umgebung und lege die Proxykonfiguration im S3Client des Codes fest. Wenn du das AWS SDK für Java 2.x verwendest, konfiguriere den S3-Client für die Verwendung von HTTP-Proxys.
    Wenn du das AWS SDK für Java 1.x verwendest, verwende den folgenden Code, um die S3-Client-Konfiguration zu aktualisieren:

    // 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();
  • Teste die Netzwerkkonnektivität zu S3-Endpunkten mit Tools wie nslookup, ping, cURL oder telnet. Informationen zur Behebung von Problemen mit der Netzwerkkonnektivität findest du unter Wie behebe ich einen Verbindungsfehler, wenn ich die Befehle "cp" oder in meinem Amazon S3-Bucket ausführe?"sync"

  • Drucke oder protokolliere die S3-Client-Konfigurationen, um zu überprüfen, ob du den S3-Client richtig konfiguriert hast.
    Beispielkonfiguration:

    // 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());
            }
        }
  • Prüfe, ob die HTTP-Transporteinstellungen in der S3-Client-Konfiguration Verbindungs- oder Ressourcenbeschränkungen enthalten. Weitere Informationen findest du unter Client-Konfiguration und HTTP-Clients

  • Führe den folgenden Befehl try-catch-finally aus, um den S3-Client so schnell wie möglich zu schließen, damit andere Anfragen die Verbindung verwenden können:

    try {
                .... // your code
            } catch (Exception e) {
                .... // catch exception
            } finally {
                // close the S3 client
                s3Client.close();
            }
  • Wenn du temporäre Anmeldeinformationen verwendest, führe den folgenden Befehl try-catch aus, um zu bestätigen, dass die Anmeldeinformationen nicht abgelaufen sind:

    // 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 oder AmazonS3Exception

Wenn du einen AmazonServiceException-, AWSServiceException- oder AmazonS3Exception-Fehler erhältst, ist ein Problem aufgetreten, nachdem du die Anfrage erfolgreich an den AWS-Service gesendet hast. Um das Problem zu beheben, überprüfe den HTTP-Status-Code in der Stack-Trace-Antwort. Die folgenden Beispiele sind einige der Status-Codefehler, auf die du möglicherweise stößt. Eine vollständige Liste der HTTP-Status-Codes findest du unter Liste der Fehler-Codes.

HTTP 400

Der HTTP 400-Fehler tritt aufgrund einer falschen Anforderungssyntax auf. Bevor du die Anfrage an Amazon S3 sendest, protokolliere oder drucke die Anfrage vorübergehend aus, um die Anforderungssyntax zu überprüfen.

HTTP 409

Prüfe, ob Amazon S3 einen kürzlich gelöschten Bucket entfernt hat, bevor du einen neuen erstellst.

HTTP 403

Du erhältst die Fehlermeldung Access denied, wenn du nicht berechtigt bist, Aktionen auszuführen. Überprüfe die AWS Identity and Access Management (IAM)-Berechtigungen, Service-kontrollrichtlinien (Service Control Policies, SCPs), S3-Bucket-Richtlinien und Objektbesitz, um sicherzustellen, dass du über ausreichende Berechtigungen verfügst. Stelle außerdem sicher, dass die Anmeldeinformationen nicht abgelaufen sind.

Der Fehler Access denied tritt auch auf, wenn ein IAM-Prinzipal ein Objekt ohne ****"s3:ListBucket" Berechtigungen anfordert und das Objekt nicht im S3-Bucket existiert.

Weitere Informationen findest du unter Behebung von Fehlern „access denied“ (403 Forbidden) in Amazon S3.

HTTP 404

Stelle sicher, dass das S3-Objekt im Bucket vorhanden ist.

HTTP 500

Versuche es erneut mit den Anfragen oder verzögere den Code. Standardmäßig hat jeder standardmäßige Wiederholungsmodus des AWS SDK drei maximale Versuche. Wenn diese Versuche das Problem nicht löst, erhöhe den Wert.

HTTP 503

Verteile die Objekte auf mehrere Präfixe. Weitere Informationen findest du unter Wie behebe ich einen HTTP 500- oder 503-Fehler von Amazon S3?

UnknownHostException

Wenn du einen UnknownHostException-Fehler erhältst, stelle sicher, dass es keine Probleme mit der DNS-Lösung in Bezug auf die S3-Endpunkte gibt.

Ähnliche Informationen

Handhabung von Ausnahmen für das AWSSDK für Java 2.x.x

Handhabung von Ausnahmen

AWS OFFICIALAktualisiert vor 7 Monaten