Amazon Simple Storage Service
开发人员指南 (API Version 2006-03-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

Amazon S3 疑难解答

本节介绍了如何排除 Amazon S3 的故障,并说明了在联系 AWS Support 时如何获取您需要的请求 ID。

根据征兆对 Amazon S3 进行故障排除

以下主题列出了各种征兆,帮助您解决在使用 Amazon S3 时可能遇到的某些问题。

启用版本控制后,Amazon S3 对存储桶请求的 HTTP 503 响应显著增加

如果您注意到启用版本控制后,Amazon S3 对存储桶的 PUT 或 DELETE 对象请求的 HTTP 503 慢速响应数量显著增加,那么存储桶中可能有一个或多个对象有数以百万计的版本。如果您的对象有数以百万计的版本,Amazon S3 会自动限制对该存储桶的请求,以防止客户的请求流量过多,但也可能会妨碍对该存储桶的其他请求。

要确定哪些 S3 对象有数以百万计的版本,可以使用 Amazon S3 清单工具。清单工具可以生成一份报告,提供存储桶中对象的平面文件列表。有关更多信息,请参阅 Amazon S3 清单

Amazon S3 团队鼓励客户调查重复覆盖同一 S3 对象的应用程序 (可能会为该对象创建数百万个版本),确定应用程序是否正常工作。如果您在使用中发现一个或多个 S3 对象需要数百万个版本,请通过 AWS Support 与 AWS support 团队联系,讨论您的使用案例,并帮助我们协助您确定最佳解决方案。

访问具有 CORS 设置的存储桶时出现意外行为

如果您在访问具有跨源资源共享 (CORS) 配置的存储桶时遇到意外行为,请参阅 排查 CORS 问题

获取 AWS Support 需要的 Amazon S3 请求 ID

当您因在 Amazon S3 中遇到错误或意外行为而需要联系 AWS Support 时,您将需要获取与失败操作关联的请求 ID。获取这些请求 ID 将使 AWS Support 能够帮助您解决所遇到的问题。请求 ID 成对出现,并在 Amazon S3 处理的每个响应 (甚至是错误的响应) 中返回并可通过详细日志访问。可通过大量常见方法来获取您的请求 ID。

在您恢复这些日志后,复制并保留这两个值,因为您在联系 AWS Support 时需要它们。有关联系 AWS Support 的信息,请参阅联系我们

使用 HTTP 获得请求 ID

您可以在 HTTP 请求到达目标应用程序之前记录该请求的位数来获取您的请求 ID,即 x-amz-request-idx-amz-id-2。可使用多种第三方工具来恢复 HTTP 请求的详细日志。选择您信任的某个工具并运行该工具,在发送出另一个 Amazon S3 HTTP 请求时侦听 Amazon S3 流量通过的端口。

对于 HTTP 请求,请求 ID 对将与以下示例类似。

Copy
x-amz-request-id: 79104EXAMPLEB723 x-amz-id-2: IOWQ4fDEXAMPLEQM+ey7N9WgVhSnQ6JEXAMPLEZb7hSQDASK+Jd1vEXAMPLEa3Km

注意

HTTPS 请求将加密并隐藏在大多数数据包捕获中。

使用 Web 浏览器获得请求 ID

大多数 Web 浏览器都具有允许您查看请求标头的开发人员工具。

对于返回了错误的基于 Web 浏览器的请求,请求 ID 对将与以下示例类似。

Copy
<Error><Code>AccessDenied</Code><Message>Access Denied</Message> <RequestId>79104EXAMPLEB723</RequestId><HostId>IOWQ4fDEXAMPLEQM+ey7N9WgVhSnQ6JEXAMPLEZb7hSQDASK+Jd1vEXAMPLEa3Km</HostId></Error>

要从成功的请求中获取请求 ID 对,您需要使用开发人员工具来查看 HTTP 响应标头。有关适用于特定浏览器的开发人员工具的信息,请参阅 AWS 开发人员论坛中的 Amazon S3 疑难解答 - 如何恢复 S3 请求 ID

使用 AWS SDK 获得请求 ID

以下部分包含有关使用 AWS 开发工具包配置日志记录的信息。当您可以对每个请求和响应启用详细日志记录时,您不应在生产系统中启用日志记录,因为大量请求/响应会导致应用程序显著变慢。

对于 AWS 开发工具包请求,请求 ID 对将与以下示例类似。

Copy
Status Code: 403, AWS Service: Amazon S3, AWS Request ID: 79104EXAMPLEB723 AWS Error Code: AccessDenied AWS Error Message: Access Denied S3 Extended Request ID: IOWQ4fDEXAMPLEQM+ey7N9WgVhSnQ6JEXAMPLEZb7hSQDASK+Jd1vEXAMPLEa3Km

使用 适用于 PHP 的开发工具包 获得请求 ID

可使用 PHP 配置日志记录。有关更多信息,请参阅如何查看已通过线路发送的数据?,该文章位于适用于 PHP 的 AWS 开发工具包 的常见问题中。

使用 适用于 Java 的开发工具包 获得请求 ID

可以为特定请求或响应启用日志记录,这将允许您仅捕获和返回相关标头。为此,请导入 com.amazonaws.services.s3.s3ResponseMetadata 类。稍后,您可以先将请求存储在变量中,然后再执行实际请求。调用 getCachedResponseMetadata(AmazonWebServiceRequest request).getRequestID() 获取记录的请求或响应。

Copy
PutObjectRequest req = new PutObjectRequest(bucketName, key, createSampleFile()); s3.putObject(req); S3ResponseMetadata md = s3.getCachedResponseMetadata(req); System.out.println("Host ID: " + md.getHostId() + " RequestID: " + md.getRequestId());

或者,您可以使用每个 Java 请求和响应的详细日志记录。有关更多信息,请参阅 AWS SDK for Java Developer Guide 中的“适用于 Java 的 AWS 开发工具包调用的日志记录”主题中的详细线路日志记录

使用 适用于 .NET 的 AWS 开发工具包 获得请求 ID

可以使用内置的 System.Diagnostics 日志记录工具配置 适用于 .NET 的 AWS 开发工具包 中的日志记录。有关更多信息,请参阅使用适用于 .NET 的 AWS 开发工具包进行日志记录 AWS 开发人员博客文章。

注意

默认情况下,返回的日志仅包含错误信息。配置文件需要已添加 AWSLogMetrics (可以选择添加 AWSResponseLogging) 来获取请求 ID。

使用 SDK for Python 获得请求 ID

可以通过将以下行添加到代码中以将调试信息输出到文件中,来配置 Python 中的日志记录。

Copy
import logging logging.basicConfig(filename="mylog.log", level=logging.DEBUG)

如果使用的是适用于 AWS 的 Boto Python 接口,则可按照此处的 Boto 文档将调试级别设置为 2。

使用 适用于 Ruby 的开发工具包 获得请求 ID

可以使用版本 1 或版本 2 的 适用于 Ruby 的开发工具包 来获取请求 ID。

  • 使用 适用于 Ruby 的开发工具包 - 版本 1– 可以使用以下代码行来全局启用 HTTP 线路日志记录。

    Copy
    s3 = AWS::S3.new(:logger => Logger.new($stdout), :http_wire_trace => true)
  • 使用 适用于 Ruby 的开发工具包 - 版本 2 – 可以使用以下代码行来全局启用 HTTP 线路日志记录。

    Copy
    s3 = Aws::S3::Client.new(:logger => Logger.new($stdout), :http_wire_trace => true)

使用 AWS CLI 获得请求 ID

可以通过将 --debug 添加到命令中来获取 AWS CLI 中的请求 ID。

有关其他疑难解答和支持主题,请参阅以下内容: