Amazon Simple Storage Service
开发人员指南 (API 版本 2006-03-01)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

以编程方式启用日志记录

您可以使用 Amazon S3 API 或 AWS 开发工具包,以编程方式启用或禁用日志记录。为此,请同时在存储桶上启用日志记录并向日志传输组授予向目标存储桶写入日志的权限。

启用日志记录

要启用日志记录,请提交 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 开发工具包包装程序库在存储桶上启用日志记录。

向日志传输组授予 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 授权的示例,请参阅使用AWS SDK for Java管理 ACL在现有对象上配置 ACL 授予使用适用于 .NET 的 AWS 开发工具包管理 ACL

示例:适用于 .NET 的 AWS 开发工具包

以下 C# 示例在存储桶上启用日志记录。您需要创建两个存储桶 (一个源存储桶和一个目标存储桶)。该示例首先向日志传输组授予向目标存储桶写入日志的所需权限,然后在源存储桶上启用日志记录。有关更多信息,请参阅 以编程方式启用日志记录。有关如何创建和测试有效示例的说明,请参阅 运行 Amazon S3 .NET 代码示例

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); } } }