发送到 Amazon S3 的日志 - Amazon CloudWatch Logs

发送到 Amazon S3 的日志

当您将日志设置为发送到 Amazon S3 时,AWS 会创建或更改与接收日志的 S3 存储桶关联的资源策略(如需要)。

直接发布到 Amazon S3 的日志将发布到您指定的现有存储桶。每 5 分钟将在指定的存储桶中创建一个或多个日志文件。

当您首次将日志发送到 Amazon S3 存储桶时,发送日志的服务会记录存储桶的拥有者,以确保日志仅发送到属于该账户的存储桶。因此,要更改 Amazon S3 存储桶拥有者,您必须在原始服务中重新创建或更新日志订阅。

注意

CloudFront 使用与将公开发布的日志发送到 S3 的其他服务不同的权限模型。有关更多信息,请参阅配置标准日志记录和访问日志文件所需的权限

此外,如果您对 CloudFront 访问日志和另一个日志源使用相同的 S3 存储桶,则在 CloudFront 的存储桶上启用 ACL 也会向使用此存储桶的所有其他日志源授予权限。

重要

如果您要将日志发送到 Amazon S3 存储桶,并且存储桶策略包含 NotActionNotPrincipal 元素,则自动向存储桶添加日志传输权限和创建日志订阅将会失败。为了成功创建日志订阅,您需要手动将日志传输权限添加到存储桶策略,然后创建日志订阅。有关更多信息,请参阅本节中的说明。

如果存储桶使用客户自主管理型 AWS KMS 密钥进行服务器端加密,您还必须为客户自主管理型密钥添加密钥政策。有关更多信息,请参阅 Amazon S3

如果目标存储桶启用了 SSE-KMS 和存储桶密钥,则附加的客户管理型 KMS 密钥策略将不再按预期对所有请求工作。有关更多信息,请参阅使用 Amazon S3 存储桶密钥降低 SSE-KMS 的成本

如果您使用公开发布的日志和具有客户管理型 AWS KMS 密钥的 S3 加密,则在配置存储桶时,您必须使用完全限定的 AWS KMS 密钥 ARN 而不是密钥 ID。有关更多信息,请参阅 put-bucket-encryption

用户权限

若要能够设置首次将这些类型日志中的任一种日志发送到 Amazon S3,您必须登录具有以下权限的账户。

  • logs:CreateLogDelivery

  • S3:GetBucketPolicy

  • S3:PutBucketPolicy

如果其中任何一种类型的日志已被发送到 Amazon S3 存储桶,要设置将其中另一种日志也发送到同一存储桶,您只需要 logs:CreateLogDelivery 权限。

S3 存储桶资源策略

接收日志的 S3 存储桶必须具有包含特定权限的资源策略。如果存储桶当前没有资源策略,而且设置日志记录的用户对存储桶具有 S3:GetBucketPolicyS3:PutBucketPolicy 权限,那么当您开始将日志发送到 Amazon S3 时,AWS会自动为其创建以下策略。

JSON
{ "Version":"2012-10-17", "Id": "AWSLogDeliveryWrite20150319", "Statement": [ { "Sid": "AWSLogDeliveryAclCheck", "Effect": "Allow", "Principal": { "Service": "delivery.logs.amazonaws.com" }, "Action": "s3:GetBucketAcl", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket", "Condition": { "StringEquals": { "aws:SourceAccount": [ "0123456789" ] }, "ArnLike": { "aws:SourceArn": [ "arn:aws:logs:us-east-1:111122223333:*" ] } } }, { "Sid": "AWSLogDeliveryWrite", "Effect": "Allow", "Principal": { "Service": "delivery.logs.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/AWSLogs/account-ID/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control", "aws:SourceAccount": [ "0123456789" ] }, "ArnLike": { "aws:SourceArn": [ "arn:aws:logs:us-east-1:111122223333:*" ] } } } ] }

在之前的策略中,对于 aws:SourceAccount,请指定将日志传送到此存储桶的账户 ID 列表。对于 aws:SourceArn,请按 arn:aws:logs:source-region:source-account-id:* 格式指定生成日志的资源 ARN 列表。

如果存储桶具有资源策略,但该策略不包含上一个策略中所示的语句,并且设置日志记录的用户对存储桶具有 S3:GetBucketPolicyS3:PutBucketPolicy 权限,则该语句将附加到存储桶的资源策略中。

注意

某些情况下,如果未向 delivery.logs.amazonaws.com 授予 s3:ListBucket 权限,可能会在 AWS CloudTrail 中看到 AccessDenied 错误。为了避免 CloudTrail 日志中出现此类错误,必须向 delivery.logs.amazonaws.com 授予 s3:ListBucket 权限且必须包含与在上述存储桶策略中设置的 s3:GetBucketAcl 权限一起显示的 Condition 参数。为方便起见,可以直接将 AWSLogDeliveryAclCheck 更新为 “Action”: [“s3:GetBucketAcl”, “s3:ListBucket”],而不是创建一个新的 Statement

Amazon S3 存储桶服务器端加密

您可以通过启用 Amazon S3 托管式密钥 (SSE-S3) 的服务器端加密或 AWS Key Management Service 中存储 AWS KMS 密钥 (SSE-KMS) 的服务器端加密来保护 Amazon S3 存储桶中的数据。有关更多信息,请参阅使用服务器端加密保护数据

如果选择 SSE-S3,则不需要额外的配置。Amazon S3 处理加密密钥。

警告

如果选择 SSE-KMS,则必须使用客户托管式密钥,因为此场景不支持使用 AWS 托管式密钥。如果您使用 AWS 托管密钥设置加密,则会以不可读取的格式提供日志。

当您使用客户托管式 AWS KMS 密钥时,您可以在启用存储桶加密时指定客户托管式密钥的Amazon Resource Name (ARN)。您必须将以下内容添加到客户托管式密钥的密钥策略(不是 S3 存储桶的存储桶策略)中,以便日志传输账户可以写入 S3 存储桶。

如果选择 SSE-KMS,则必须使用客户托管式密钥,因为此场景不支持使用 AWS 托管式密钥。当您使用客户托管式 AWS KMS 密钥时,您可以在启用存储桶加密时指定客户托管式密钥的Amazon Resource Name (ARN)。您必须将以下内容添加到客户托管式密钥的密钥策略(不是 S3 存储桶的存储桶策略)中,以便日志传输账户可以写入 S3 存储桶。

{ "Sid": "Allow Logs Delivery to use the key", "Effect": "Allow", "Principal": { "Service": [ "delivery.logs.amazonaws.com" ] }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*", "Condition": { "StringEquals": { "aws:SourceAccount": ["0123456789"] }, "ArnLike": { "aws:SourceArn": ["arn:aws:logs:us-east-1:0123456789:*"] } } }

对于 aws:SourceAccount,请指定将日志传送到此存储桶的账户 ID 列表。对于 aws:SourceArn,请按 arn:aws:logs:source-region:source-account-id:* 格式指定生成日志的资源 ARN 列表。