スキップしてコンテンツを表示

Java 用 AWS SDK 例外から受け取る Amazon S3 エラーをトラブルシューティングする方法を教えてください。

所要時間3分
0

AWS SDK for Java を使用して Amazon Simple Storage Service (Amazon S3) リソースにアクセスするときに発生するエラーをトラブルシューティングしたいと考えています。

簡単な説明

AWS SDK を使用すると、次のクライアントエラーとサービスエラーが発生する可能性があります。

  • AmazonClientException または SdkClientException
  • AmazonServiceExceptionAwsServiceException、または AmazonS3Exception
  • UnknownHostException

上記のエラーをトラブルシューティングするには、まず例外の種類を特定し、問題の解決策を実施します。

解決策

AmazonClientException または SdkClientException

AmazonClientException または SDKClientException は、AWS へのリクエストの送信や AWS からの応答の解析ができない場合に発生します。

このエラーを解決するには、次の操作を行います。

  • ローカル環境のプロキシ設定の使用状況を確認し、コードの S3Client でプロキシ設定を設定します。AWS SDK for Java 2.x を使用している場合は、HTTP プロキシを使用するように S3 クライアントを設定します
    AWS SDK for Java 1.x を使用している場合は、次のコードを使用して 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();
  • nslookup、ping、cURL、telnet などのツールを使用して、S3 エンドポイントへのネットワーク接続をテストします。ネットワーク接続の問題をトラブルシューティングするには、「Amazon S3 バケットで "cp" または コマンドを実行したときの接続エラーをトラブルシューティングする方法を教えてください"sync"」を参照してください。

  • S3 クライアントの設定を印刷または記録して、S3 クライアントが正しく設定されていることを確認します。
    設定例:

    // 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());
            }
        }
  • S3 クライアント設定の HTTP トランスポート設定に、接続またはリソースの制約があるかどうかを確認します。詳細については、「Client configuration」と「HTTP clients」を参照してください。

  • 次の ** try-catch-finally** コマンドを実行して S3 クライアントをできるだけ早く閉じ、他のリクエストが接続を使用できるようにします。

    try {
                .... // your code
            } catch (Exception e) {
                .... // catch exception
            } finally {
                // close the S3 client
                s3Client.close();
            }
  • 一時的な認証情報を使用している場合は、次の ** try-catch ** コマンドを実行して、認証情報が期限切れになっていないことを確認します。

    // 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、または AmazonS3Exception

AmazonServiceExceptionAwsServiceException、または AmazonS3Exception エラーを受け取った場合は、リクエストを AWS のサービスに正常に送信した後に問題が発生したことになります。問題を解決するには、スタックトレース応答の HTTP ステータスコードを確認します。次の例は、発生する可能性のあるステータスコードエラーの一部です。HTTP ステータスコードの一覧については、「エラーコードのリスト」を参照してください。

HTTP 400

HTTP 400 エラーは、リクエスト構文が正しくないために発生します。Amazon S3 にリクエストを送信する前に、リクエストを一時的に記録または印刷して、リクエストの構文を確認してください。

HTTP 409

最近削除したバケットを新たに作成する前に、それが Amazon S3 によって削除されたかどうかを確認してください。

HTTP 403

アクションを実行する権限がないと、アクセス拒否エラーが表示されます。AWS Identity and Access Management (IAM) の権限、サービスコントロールポリシー (SCP)、S3 バケットポリシー、およびオブジェクトの所有権を確認して、十分な権限があることを確認します。また、認証情報が期限切れになっていないことを確認してください。

アクセス拒否エラーは、IAM プリンシパルが ****"s3:ListBucket" 権限のないオブジェクトをリクエストし、そのオブジェクトが S3 バケットに存在しない場合にも発生します。

詳細については、「Amazon S3 でのアクセス拒否 (403 Forbidden) エラーのトラブルシューティング」を参照してください。

**HTTP 404 **

S3 オブジェクトがバケットに存在することを確認してください。

HTTP 500

リクエストを再試行するか、コードに遅延を発生させてください。デフォルトでは、各 AWS SDK 標準再試行モードの試行回数は最大 3 回です。これらの方法で問題が解決しない場合は、値を増やしてください。

HTTP 503

複数のプレフィックスにオブジェクトを分配してください。5xx エラーの詳細については、「Amazon S3 の HTTP 500 または 503 エラーをトラブルシューティングする方法を教えてください」を参照してください。

UnknownHostException

UnknownHostException エラーを受け取った場合は、S3 エンドポイントに対する DNS 解決の問題がないことを確認してください。

関連情報

Java 2.x.x 用 AWS SDK の例外処理

例外処理

AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ