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

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

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

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

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

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

  • 您的目标存储桶不应启用服务器访问日志记录。您可以让日志传输至您拥有的且与源存储桶位于同一区域中的任何存储桶,包括源存储桶本身。不过,为了更方便地管理日志,我们建议您将访问日志保存在不同的存储桶中。有关更多信息,请参阅 如何启用日志传送?

您可以使用 Amazon S3 控制台、Amazon S3 API、Amazon Command Line Interface (Amazon CLI) 或 Amazon 开发工具包启用或禁用服务器访问日志记录。

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

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

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

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

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

  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

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

  3. 选择 Properties (属性)

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

  5. Server access logging (服务器访问日志记录) 下,选择 Enable (启用)

  6. 对于 Target bucket (目标存储桶),请输入您想要接收日志记录对象的存储桶的名称。

    目标存储桶必须位于源存储桶所在的相同区域中且不得具有默认保留周期配置。

  7. 选择 Save changes (保存更改)

    当您在存储桶上启用日志记录时,控制台会同时在源存储桶上启用日志记录,并在目标存储桶的访问控制列表 (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 或 Amazon 开发工具包包装程序库在存储桶上启用日志记录。

.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 存储桶的每个 Amazon Web Services 区域 中都创建一个专用日志记录存储桶。然后,将 Amazon S3 访问日志传输到该 S3 存储桶。有关更多信息和示例,请参阅 Amazon CLI 参考中的 put-bucket-logging

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

在本示例中,您有以下 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 访问日志:

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

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

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

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

    • 2-awsexamplebucket1-us-west-2 记录到带有前缀 awsexamplebucket1-logs-us-west-2 的 S3 存储桶 2-awsexamplebucket1-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"
      注意

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

Amazon S3 日志传输组的 WRITE 和 READ_ACP 权限

Amazon S3 作为预定义 Amazon S3 日志传输组的成员,向目标存储桶写入日志文件。这些写入受常规的访问控制限制。

如果您使用 S3 控制台启用服务器访问日志记录,则 S3 会自动更新存储桶权限管控列表 (ACL) 以授予对 S3 日志传输组的访问权限。您无需手动授予 ACL 权限。有关 ACL 的信息,请参阅 访问控制列表 (ACL) 概述

页上的 Amazon CLI 和 Amazon 开发工具包示例包含向 S3 日志传输组授予 ACL 权限的步骤。如果使用这些示例,则无需手动向日志传输组授予 ACL 权限。

如果您以编程方式启用服务器访问日志记录,并且未指定 ACL 权限,则您必须通过向目标存储桶的权限管控列表 (ACL) 添加 s3:GetObjectAcls3:PutObject 授权来向本组授予 WRITEREAD_ACP 许可。日志传输组由以下 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>
重要

使用 Amazon CloudFormation 启用 Amazon S3 服务器访问日志记录时,您还必须在存储桶的属性字段中添加 AccessControl": "LogDeliveryWrite"。这一点非常重要,因为您只能通过为存储桶创建 ACL 授予这些权限,但无法在 CloudFormation 中为存储桶创建自定义 ACL。您只能使用标准 ACL。

有关以编程方式添加 ACL 授权的示例,请参阅 配置 ACL