View a markdown version of this page

获取 AWS 支持 的 Amazon S3 请求 ID - Amazon Simple Storage Service

获取 AWS 支持 的 Amazon S3 请求 ID

每当您因为在 Amazon S3 中遇到错误或意外行为而联系 AWS 支持 时,您必须提供与失败操作相关联的请求 ID。AWS 支持 使用这些请求 ID 来帮助解决您遇到的问题。

请求 ID 成对出现,并在 Amazon S3 处理的每个响应(甚至是错误的响应)中返回并可通过详细日志访问。可通过许多常见的方法来获取您的请求 ID,包括 S3 服务器访问日志和 AWS CloudTrail 事件或数据事件。

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

使用 AWS CLI 获得请求 ID

要在使用 AWS Command Line Interface(AWS CLI)时获取您的请求 ID,请将 --debug 添加到您的命令中。例如,您应该在调试日志中看到 x-amz-request-idx-amz-id-2,如下所示:

... 2025-04-30 14:35:28,572 - MainThread - botocore.parsers - DEBUG - Response headers: {'x-amz-id-2': 'a+zm50vDJH3LLmCiXvwEo0u0PtPS/qCJaBvB2ZMH9dzyzTiJhiLZkBFFoRfsPfOKztUKT/garCI=', 'x-amz-request-id': 'N4NMN0MJ4VDFZMX9', 'Date': 'Wed, 30 Apr 2025 21:35:29 GMT', 'Content-Type': 'application/xml', 'Transfer-Encoding': 'chunked', 'Server': 'AmazonS3'} ...

使用 Windows PowerShell 获取请求 ID

有关使用 Windows PowerShell 恢复日志的信息,请参阅 AWS 开发人员工具博客中的 Response Logging in AWS Tools for Windows PowerShell

使用 AWS CloudTrail 数据事件获取请求 ID

使用 CloudTrail 数据事件配置为记录 S3 对象级别 API 操作的 Amazon S3 桶提供了有关用户、角色或 AWS 服务在 Amazon S3 桶中所采取操作的详细信息。您可以通过向 Athena 查询 CloudTrail 事件来识别 S3 请求 ID。

有关更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的使用 CloudTrail 识别 Amazon S3 请求

使用 S3 服务器访问日志记录获取请求 ID

为 S3 服务器访问日志记录配置的 Amazon S3 桶为向桶发出的每个请求提供详细记录。您可以通过使用 Athena 查询服务器访问日志来识别 S3 请求 ID。

有关更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的使用 Amazon Athena 查询访问日志中的请求

使用 HTTP 获得请求 ID

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

对于 HTTP 请求,请求 ID 对将与以下内容类似:

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

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

使用 Web 浏览器获得请求 ID

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

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

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

要从成功的请求中获取请求 ID 对,请使用浏览器的开发人员工具来查看 HTTP 响应标头。

使用 AWS SDK 获得请求 ID

以下各节包含有关使用不同的 AWS SDK 配置日志记录的信息。

注意

尽管您可以对每个请求和响应启用详细的日志记录,但我们不建议在生产系统中启用日志记录,因为大型请求或响应会显著降低应用程序的速度。

对于 AWS SDK 请求,请求 ID 对将如下所示:

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
C++

日志记录程序的类型和详细程度是在 SDK 初始化期间在 SDKOptions 参数中指定的。以下示例将详细程度级别指定为 LogLevel::Debug

默认日志记录程序将写入文件系统,并使用以下约定 aws_sdk_YYYY-MM-DD-HH.log 对文件命名。日志记录程序会在整点创建一个新文件。

Aws::SDKOptions options; options.loggingOptions.logLevel = Aws::Utils::Logging::LogLevel::Debug; Aws::InitAPI(options); // ... Aws::ShutdownAPI(options);

有关更多信息,请参阅 GitHub 上适用于 C++ 的 AWS SDK wiki 中的 How do I turn on logging?

Go

可以使用适用于 Go 的 SDK 配置日志记录。有关更多信息,请参阅《适用于 Go 的 AWS SDK v2 开发人员指南》中的日志记录

Java

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

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 请求和响应的详细日志记录。有关更多信息,请参阅《适用于 Java 的 AWS SDK 开发人员指南》中的详细线路日志记录

JavaScript

适用于 JavaScript 的 AWS SDK 具有内置的日志记录程序,因此您可以记录使用它发出的 API 调用。要打开日志记录程序并在控制台中输出日志条目,请将以下语句添加到代码中:

AWS.config.logger = console;

有关更多信息,请参阅《适用于 JavaScript 的 AWS SDK 开发人员指南》中的记录适用于 JavaScript 的 AWS SDK 调用

Kotlin

借助适用于 Kotlin 的 AWS SDK,您可以使用代码或环境设置为线路级消息指定日志模式。您可以为 HTTP 请求和 HTTP 响应设置日志模式。

要选择使用其它日志记录,请在构造服务客户端时设置 logMode 属性:

import aws.smithy.kotlin.runtime.client.LogMode // ... val client = S3Client { // ... logMode = LogMode.LogRequestWithBody + LogMode.LogResponse }

或者,您可以使用环境变量设置日志模式:

export SDK_LOG_MODE=LogRequestWithBody|LogResponse

有关更多信息,请参阅《适用于 Kotlin 的 AWS SDK 开发人员指南》中的日志记录

.NET

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

注意

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

PHP

通过在客户端构造函数中将调试选项设置为 true,可以获取调试信息,包括通过线路发送的数据。

$s3Client = new Aws\S3\S3Client([ 'region' => 'us-standard', 'version' => '2006-03-01', 'debug' => true ]);

有关更多信息,请参阅《适用于 PHP 的 AWS SDK 开发人员指南》中的如何查看在网上发送了什么数据?

Python (Boto3)

使用 适用于 Python (Boto3) 的 AWS SDK,您可以记录特定的响应。您可以使用此功能仅捕获相关的标题。以下代码显示如何将响应的各个部分记录到文件中:

import logging import boto3 logging.basicConfig(filename='logfile.txt', level=logging.INFO) logger = logging.getLogger(__name__) s3 = boto3.resource('s3') response = s3.Bucket(bucket_name).Object(object_key).put() logger.info("HTTPStatusCode: %s", response['ResponseMetadata']['HTTPStatusCode']) logger.info("RequestId: %s", response['ResponseMetadata']['RequestId']) logger.info("HostId: %s", response['ResponseMetadata']['HostId']) logger.info("Date: %s", response['ResponseMetadata']['HTTPHeaders']['date'])

还可以在引发异常时捕获异常并记录相关信息。有关更多信息,请参阅《适用于 Python 的 AWS SDK(Boto3)API 参考》中的从错误响应中识别有用信息

此外,您可以使用以下代码将 Boto3 配置为输出详细调试日志:

import logging import boto3 boto3.set_stream_logger('', logging.DEBUG)

有关更多信息,请参阅《适用于 Python 的 AWS SDK(Boto3)API 参考》中的 set_stream_logger

Ruby

您可以使用适用于 Ruby 的 SDK 版本 3 来获取请求 ID。您可以使用以下代码在客户端中启用 HTTP 线路日志记录:

s3 = Aws::S3::Client.new(http_wire_trace: true)
注意

线路日志记录可能包含敏感信息,例如您的访问密钥 ID。在与 AWS Support 共享敏感信息之前,应对其进行清理。

您还可以在请求响应或错误中找到请求上下文对象的请求 ID:

# Finding the request ID from an error: begin s3.put_object(bucket: 'bucket', key: 'key', body: 'test') rescue Aws::S3::Errors::ServiceError => e puts e.context[:request_id] puts e.context[:s3_host_id] end # Finding the request ID from a successful call: resp = s3.put_object(bucket: 'bucket', key: 'key', body: 'test') puts resp.context[:request_id] puts resp.context[:s3_host_id]

有关更多信息,请参阅《适用于 Ruby 的 AWS SDK 开发人员指南》中的使用来自适用于 Ruby 的 AWS SDK 客户端的线路跟踪信息进行调试

Rust

要启用日志记录,请添加 tracing-subscriber crate 并在 Rust 应用程序中对其进行初始化。

将跟踪库添加到您的 Cargo.toml 文件中:

tracing-subscriber = { version = "0.3", features = ["env-filter"] }

然后,在 Rust 代码中,在调用任何 SDK 操作之前,在 main 函数中初始化日志记录程序:

tracing_subscriber::fmt::init();

有关更多信息,请参阅《适用于 Rust 的 AWS SDK 开发人员指南》中的在适用于 Rust 的 AWS SDK 中配置和使用日志记录