Java 用 AWS SDK 例外から受け取る Amazon S3 エラーをトラブルシューティングする方法を教えてください。
AWS SDK for Java を使用して Amazon Simple Storage Service (Amazon S3) リソースにアクセスするときに発生するエラーをトラブルシューティングしたいと考えています。
簡単な説明
AWS SDK を使用すると、次のクライアントエラーとサービスエラーが発生する可能性があります。
- AmazonClientException または SdkClientException
- AmazonServiceException、AwsServiceException、または 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
AmazonServiceException、AwsServiceException、または 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 解決の問題がないことを確認してください。
