启用 Amazon S3 服务器访问日志记录 - Amazon Simple Storage Service
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

欢迎使用新的 Amazon S3 用户指南! Amazon S3 用户指南结合了以下三个已停用的指南中的信息和说明:Amazon S3 开发人员指南Amazon S3 控制台用户指南Amazon S3 入门指南

启用 Amazon S3 服务器访问日志记录

服务器访问日志记录详细地记录对 Amazon S3 存储桶提出的各种请求。对于许多应用程序而言,服务器访问日志很有用。例如,访问日志信息可能在安全和访问权限审核方面很有用。它还可以帮助您了解您的客户群并了解您的 Amazon S3 账单。

默认情况下,Amazon S3 不会收集服务器访问日志。在您启用日志记录后,Amazon S3 会将源存储桶的访问日志传输到您选择的目标存储桶。目标存储桶必须位于源存储桶所在的相同 AWS 区域中且不得具有默认保留周期配置。

访问日志记录包含有关对存储桶做出的请求的详细信息。这些信息可能包括请求类型、请求中指定的资源以及处理请求的时间和日期。有关日志记录基本知识的更多信息,请参阅使用服务器访问日志记录来记录请求

重要

在 Amazon S3 存储桶上启用服务器访问日志记录不收取额外费用。但是,系统提交给您的任何日志文件都会产生普通存储费用。(您可以随时删除日志文件。) 我们不会计算提交日志文件的数据传输费,但会按正常数据传输费率对访问日志文件收费。

您可以使用 Amazon S3 控制台、Amazon S3 API、AWS 命令行界面 (AWS CLI) 或 AWS 开发工具包启用或禁用服务器访问日志记录。

启用服务器访问日志记录之前,请考虑以下事项:

  • 在 Amazon S3 中,您可以授予权限,以便通过存储桶访问控制列表 (ACL) 而不是存储桶策略传输访问日志。

  • 向存储桶策略添加拒绝条件可能会阻止 Amazon S3 提供访问日志。

  • 仅当选择 AES256 (SSE-S3) 时,您才能在目标存储桶上使用默认的存储桶加密。不支持 SSE-KMS 加密。

  • 您无法在目标存储桶上启用 S3 对象锁定。

要启用日志记录,请按照以下步骤操作。

步骤 1:启用服务器访问日志记录

您可以使用控制台、API、AWS CLI 或 AWS 开发工具包启用日志记录。

  1. 登录 AWS 管理控制台,并通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. Buckets (存储桶) 列表中,选择要为其启用服务器访问日志记录的存储桶的名称。

  3. 选择属性

  4. Server access logging (服务器访问日志记录) 部分中,选择 Edit (编辑)

  5. Server access logging (服务器访问日志记录) 下,选择 Enable (启用)。对于 Target bucket (目标存储桶),请输入您想要接收日志记录对象的存储桶的名称。目标存储桶必须位于源存储桶所在的相同区域中且不得具有默认保留周期配置。

  6. 选择保存更改

    您可以查看目标存储桶中的日志。启用服务器访问日志记录后,可能需要数小时,日志才会传输到目标存储桶。有关如何以及何时传送日志的更多信息,请参阅如何传输日志?

当您在存储桶上启用日志记录时,控制台会同时在源存储桶上启用日志记录,并在目标存储桶的访问控制列表 (ACL) 中添加授权,向日志传输组授予写入权限。

有关更多信息,请参阅 查看 S3 存储桶的属性

要启用日志记录,请提交 PUT Bucket 日志记录请求,以在源存储桶上添加日志记录配置。该请求指定目标存储桶,以及要用于所有日志对象键的前缀 (可选)。

以下示例将 logbucket 标识为目标存储桶,将 logs/ 标识为前缀。

<BucketLoggingStatus xmlns="http://doc.s3.amazonaws.com/2006-03-01"> <LoggingEnabled> <TargetBucket>logbucket</TargetBucket> <TargetPrefix>logs/</TargetPrefix> </LoggingEnabled> </BucketLoggingStatus>

日志对象由日志传输账户编写和拥有,存储桶拥有者可获得对日志对象的完全权限。此外,您还可以选择向其他用户授予权限,以便他们可以访问日志。有关更多信息,请参阅 PUT Bucket 日志记录

Amazon S3 还提供 GET Bucket 日志记录 API,用于检索存储桶上的日志记录配置。要删除日志记录配置,请发送 BucketLoggingStatus 为空的 PUT Bucket 日志记录请求。

<BucketLoggingStatus xmlns="http://doc.s3.amazonaws.com/2006-03-01"> </BucketLoggingStatus>

您可以使用 Amazon S3 API 或 AWS 开发工具包包装程序库在存储桶上启用日志记录。

.NET

以下 C# 示例在存储桶上启用日志记录。您必须创建两个存储桶(一个源存储桶和一个目标存储桶)。该示例首先向日志传输组授予向目标存储桶写入日志的所需权限,然后在源存储桶上启用日志记录。

using Amazon; using Amazon.S3; using Amazon.S3.Model; using System; using System.Threading.Tasks; namespace Amazon.DocSamples.S3 { class ServerAccesLoggingTest { private const string bucketName = "*** bucket name for which to enable logging ***"; private const string targetBucketName = "*** bucket name where you want access logs stored ***"; private const string logObjectKeyPrefix = "Logs"; // Specify your bucket region (an example region is shown). private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2; private static IAmazonS3 client; public static void Main() { client = new AmazonS3Client(bucketRegion); EnableLoggingAsync().Wait(); } private static async Task EnableLoggingAsync() { try { // Step 1 - Grant Log Delivery group permission to write log to the target bucket. await GrantPermissionsToWriteLogsAsync(); // Step 2 - Enable logging on the source bucket. await EnableDisableLoggingAsync(); } catch (AmazonS3Exception e) { Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message); } catch (Exception e) { Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message); } } private static async Task GrantPermissionsToWriteLogsAsync() { var bucketACL = new S3AccessControlList(); var aclResponse = client.GetACL(new GetACLRequest { BucketName = targetBucketName }); bucketACL = aclResponse.AccessControlList; bucketACL.AddGrant(new S3Grantee { URI = "http://acs.amazonaws.com/groups/s3/LogDelivery" }, S3Permission.WRITE); bucketACL.AddGrant(new S3Grantee { URI = "http://acs.amazonaws.com/groups/s3/LogDelivery" }, S3Permission.READ_ACP); var setACLRequest = new PutACLRequest { AccessControlList = bucketACL, BucketName = targetBucketName }; await client.PutACLAsync(setACLRequest); } private static async Task EnableDisableLoggingAsync() { var loggingConfig = new S3BucketLoggingConfig { TargetBucketName = targetBucketName, TargetPrefix = logObjectKeyPrefix }; // Send request. var putBucketLoggingRequest = new PutBucketLoggingRequest { BucketName = bucketName, LoggingConfig = loggingConfig }; await client.PutBucketLoggingAsync(putBucketLoggingRequest); } } }

我们建议您在其中放置 S3 存储桶的每个 AWS 区域中都创建一个专用日志记录存储桶。然后,将 Amazon S3 访问日志传输到该 S3 存储桶。

例 — 为跨两个区域的五个存储桶启用访问日志

在本示例中,您有以下 5 个存储桶:

  • 1-awsexamplebucket1-us-east-1

  • 2-awsexamplebucket1-us-east-1

  • 3-awsexamplebucket1-us-east-1

  • 1-awsexamplebucket1-us-west-2

  • 2-awsexamplebucket1-us-west-2

  1. 在以下区域中创建两个日志记录存储桶:

    • awsexamplebucket1-logs-us-east-1

    • awsexamplebucket1-logs-us-west-2

  2. 然后按如下方式启用 Amazon S3 访问日志:

    • 3-awsexamplebucket1-us-east-1 记录到带有前缀 1-awsexamplebucket1-us-east-1 的 S3 存储桶 awsexamplebucket1-logs-us-east-1

    • 2-awsexamplebucket1-us-east-1 记录到带有前缀 2-awsexamplebucket1-us-east-1 的 S3 存储桶 awsexamplebucket1-logs-us-east-1

    • 3-awsexamplebucket1-us-east-1 记录到带有前缀 3-awsexamplebucket1-us-east-1 的 S3 存储桶 awsexamplebucket1-logs-us-east-1

    • 1-awsexamplebucket1-us-west-2 记录到带有前缀 1-awsexamplebucket1-us-west-2 的 S3 存储桶 awsexamplebucket1-logs-us-west-2

    • 2-awsexamplebucket1-us-west-2 记录到带有前缀 2-awsexamplebucket1-us-west-2 的 S3 存储桶 awsexamplebucket1-logs-us-west-2

  3. 然后,您可以使用以下方法启用 Amazon S3 访问日志:

    1. 首先,使用 put-bucket-acl 授予 Amazon S3 权限。

      aws s3api put-bucket-acl --bucket awsexamplebucket1-logs --grant-write URI=http://acs.amazonaws.com/groups/s3/LogDelivery --grant-read-acp URI=http://acs.amazonaws.com/groups/s3/LogDelivery
    2. 然后,应用日志记录策略。

      aws s3api put-bucket-logging --bucket awsexamplebucket1 --bucket-logging-status file://logging.json

      Logging.json 是当前文件夹中包含日志记录策略的 JSON 文档。

      { "LoggingEnabled": { "TargetBucket": "awsexamplebucket1-logs", "TargetPrefix": "awsexamplebucket1/", "TargetGrants": [ { "Grantee": { "Type": "AmazonCustomerByEmail", "EmailAddress": "user@example.com" }, "Permission": "FULL_CONTROL" } ] } }
      注意

      必须使用 put-bucket-acl 命令向 Amazon S3 日志传输系统授予必要的权限(write-acp 和 read-acp 权限)。

    3. 使用 bash 脚本为您账户中的所有存储桶添加访问日志记录。

      loggingBucket='awsexamplebucket1-logs' region='us-west-2' # Create Logging bucket aws s3 mb s3://$loggingBucket --region $region aws s3api put-bucket-acl --bucket $loggingBucket --grant-write URI=http://acs.amazonaws.com/groups/s3/LogDelivery --grant-read-acp URI=http://acs.amazonaws.com/groups/s3/LogDelivery # List buckets in this account buckets="$(aws s3 ls | awk '{print $3}')" # Put bucket logging on each bucket for bucket in $buckets do printf '{ "LoggingEnabled": { "TargetBucket": "%s", "TargetPrefix": "%s/" } }' "$loggingBucket" "$bucket" > logging.json aws s3api put-bucket-logging --bucket $bucket --bucket-logging-status file://logging.json echo "$bucket done" done rm logging.json echo "Complete"
      注意

      这仅在您的所有存储桶均位于同一区域中时有用。如果您在多个区域中有存储桶,则必须调整该脚本。

步骤 2:向日志传输组授予 WRITE 和 READ_ACP 权限

Amazon S3 作为预定义 Amazon S3 日志传输组的成员,向目标存储桶写入日志文件。这些写入受常规的访问控制限制。您必须通过向目标存储桶的访问控制列表 (ACL) 添加授权,向此组授予 s3:GetObjectAcls3:PutObject 权限。日志传输组由以下 URL 表示。

http://acs.amazonaws.com/groups/s3/LogDelivery

若要授予 WRITEREAD_ACP 权限,请添加以下授权。有关 ACL 的信息,请参阅访问控制列表 (ACL) 概述

<Grant> <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group"> <URI>http://acs.amazonaws.com/groups/s3/LogDelivery</URI> </Grantee> <Permission>WRITE</Permission> </Grant> <Grant> <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group"> <URI>http://acs.amazonaws.com/groups/s3/LogDelivery</URI> </Grantee> <Permission>READ_ACP</Permission> </Grant>

有关使用 AWS 开发工具包以编程方式添加 ACL 授权的示例,请参阅配置 ACL