Knowledge Center Monthly Newsletter - September 2025
Stay up to date with the latest from the Knowledge Center. See all new Knowledge Center articles published in the last month, and re:Post’s top contributors.
如何解决从适用于 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 错误。
要解决此问题,请执行以下操作:
-
检查本地环境的代理设置使用情况,并在代码的 S3Client 中设置代理配置。如果您使用的是适用于 Java 2.x 的 AWS SDK,请将您的 S3 客户端配置为使用 HTTP 代理。
如果您使用的是适用于 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 状态代码的完整列表,请参阅 List of error codes(错误代码列表)。
HTTP 400
HTTP 400 错误是由于请求语法不正确而发生的。在向 Amazon S3 发送请求之前,请临时记录或打印您的请求,以检查您的请求语法。
HTTP 409
在创建新存储桶之前,请检查 Amazon S3 是否已移除最近删除的存储桶。
HTTP 403
当您没有执行操作的权限时,您会收到 Access denied 错误。检查您的 AWS Identity and Access Management (IAM) 权限、服务控制策略 (SCP)、S3 存储桶策略和对象所有权,以确保您拥有足够的权限。此外,请确保您的凭证未过期。
当 IAM 主体在没有****"s3:ListBucket"权限的情况下请求某个对象,且该对象在 S3 存储桶中不存在时,也会出现 Access denied 错误。
有关详细信息,请参阅排查 Amazon S3 中的 access denied (403 Forbidden) 错误。
HTTP 404
确保 S3 对象存在于存储桶中。
HTTP 500
重试您的请求,或在代码中引入延迟。默认情况下,每个 AWS SDK 的标准重试模式最多尝试三次。如果这些尝试未能解决您的问题,请增加该值。
HTTP 503
将您的对象分配给多个前缀。有关详细信息,请参阅如何解决来自 Amazon S3 的 HTTP 500 或 503 错误?
UnknownHostException
如果您收到 UnknownHostException 错误,请确保 S3 端点不存在 DNS 解析问题。
相关信息
相关内容
- AWS 官方已更新 2 年前