Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何對從適用於 Java 的 AWS SDK 例外狀況所收到的 Amazon S3 錯誤進行疑難排解?
我想對使用適用於 Java 的 AWS SDK 存取 Amazon Simple Storage Service (Amazon S3) 資源時,遇到的錯誤進行疑難排解。
簡短描述
使用 AWS SDK 時,您可能會收到下列用戶端和服務錯誤:
- AmazonClientException 或 SdkClientException
- AmazonServiceException、AwsServiceException 或 AmazonS3Exception
- UnknownHostException
若要解決上述錯誤,請先確定例外狀況類型,然後完成問題的解決方法。
解決方法
AmazonClientException 或 SdkClientException
當您因用戶端程式碼存在錯誤而無法向 AWS 傳送請求或解析來自 AWS 的回應時,就會發生 AmazonClientException 或 SdkClientException。
若要解決此錯誤,請執行下列動作:
-
檢查您本機環境的 Proxy 設定使用情況,並在程式碼的 S3Client 中設定 Proxy 組態。如果您使用的是適用於 Java 2.x 的 AWS SDK,請將您的 S3 用戶端設定為使用 HTTP Proxy。
如果您使用的是適用於 Java 1.x 的 AWS SDK,請使用下列程式碼更新您的 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 傳輸設定,是否有連線或資源限制。如需詳細資訊,請參閱用戶端組態和 HTTP 用戶端。
-
執行以下 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 禁止) 錯誤進行疑難排解。
HTTP 404
確保儲存貯體中存在 S3 物件。
HTTP 500
重試您的請求,或在您的程式碼中加入延遲。預設情況下,每個 AWS SDK 標準重試模式的最大嘗試次數為三次。如果這些嘗試無法解決您的問題,請增加重試次數的值。
HTTP 503
將您的物件分佈在多個首碼中。如需詳細資訊,請參閱如何對 Amazon S3 的 HTTP 500 或 503 錯誤進行疑難排解?
UnknownHostException
如果您收到 UnknownHostException 錯誤,請確保 S3 端點沒有 DNS 解析問題。
相關資訊
相關內容
- 已提問 10 個月前
- 已提問 1 年前
