将服务器访问日志传输到 CloudWatch Logs
您可以使用 Amazon CloudWatch Logs 提供的日志传输将 Amazon S3 服务器访问日志传输到 CloudWatch Logs 日志组。一旦日志位于 CloudWatch Logs 中,您就可以使用 CloudWatch logs Insights 查询它们,跨账户和区域对它们进行聚合,使用 AWS Key Management Service(AWS KMS)对其进行加密,并可以选择以 Apache Iceberg 格式将它们传输到 Amazon S3 表类数据存储服务来进行 SQL 分析。您还可以采用 JSON 或 Apache Parquet 格式将日志传输到 Amazon S3,或者通过 Amazon Data Firehose 进行路由。
您可以使用 CloudWatch Logs API 而不是 Amazon S3 API 来配置传输。您可以为每个源存储桶指定一个日志组。多个存储桶可以共享同一个日志组,或者每个存储桶可以传输到自己的日志组。
提示
您可以为同一个存储桶设置多个目标。例如,传输到 CloudWatch Logs 日志组以进行交互式查询,同时以 Parquet 格式传输到 Amazon S3,以便以更低的成本长期保留。
注意
CloudWatch Logs 提供的日志传输还支持将 Amazon Data Firehose 和 Amazon S3 作为传输目标,包括 Apache Parquet 输出格式。本页介绍 CloudWatch Logs 日志组目标,该目标还支持 S3 表类数据存储服务集成以进行 SQL 分析。有关 Firehose 和 Amazon S3 目标的信息,请参阅《Amazon CloudWatch Logs 用户指南》中的从 AWS 服务启用日志记录。
注意
有关将服务器访问日志改而传输至 Amazon S3 通用存储桶的信息,请参阅启用 Amazon S3 服务器访问日志记录。
先决条件
在设置传输之前,您需要具备以下各项:
-
Amazon S3 通用存储桶(您要记录的源存储桶)。
-
与源存储桶位于相同 AWS 区域中的 CloudWatch Logs 日志组。
-
调用方的 IAM 权限。您至少需要以下权限:
-
logs:PutDeliverySource -
logs:PutDeliveryDestination -
logs:CreateDelivery -
s3:AllowVendedLogDeliveryForResource(对于源存储桶)
如果您计划启用 S3 表类数据存储服务集成,则还需要:
-
observabilityadmin:CreateS3TableIntegration -
logs:AssociateSourceToS3TableIntegration -
s3tables:CreateTableBucket -
s3tables:PutTableBucketEncryption -
s3tables:PutTableBucketPolicy
-
设置传输(AWS CLI)
要使用 AWS Command Line Interface设置向 CloudWatch Logs 传输服务器访问日志,请完成以下三个步骤。
-
创建传输源。这会将您的 Amazon S3 存储桶注册为 CloudWatch Logs 的日志源。
aws logs put-delivery-source \ --namemy-sal-source\ --resource-arn arn:aws:s3:::my-bucket\ --log-type S3_SERVER_ACCESS_LOGS -
创建传输目标。这会指定将向其中传输日志的 CloudWatch Logs 日志组。
aws logs put-delivery-destination \ --namemy-sal-destination\ --delivery-destination-configuration '{"destinationResourceArn": "arn:aws:logs:us-east-1:123456789012:log-group:my-sal-logs"}' -
创建传输。这会将源链接到目标并开始日志传输。
aws logs create-delivery \ --delivery-source-namemy-sal-source\ --delivery-destination-arn arn:aws:logs:us-east-1:123456789012:delivery-destination:my-sal-destination
完成这些步骤后,Amazon S3 开始将服务器访问日志传输到您的 CloudWatch Logs 日志组。该配置需要 15–20 分钟进行传播。传播后,日志传输通常会在数小时内开始。只记录新的请求,而不会回填历史数据。
设置传输(Amazon S3 控制台)
-
登录到 Amazon S3 控制台,网址:https://console.aws.amazon.com/s3/
。 -
在左侧导航窗格中,选择存储桶。
-
选择您要为其启用日志记录的源存储桶的名称。
-
选择属性选项卡。
-
在服务器访问日志传输到 CloudWatch Logs 部分中,选择编辑。
-
请选择启用。
-
选择或创建 CloudWatch Logs 日志组作为传输目标。
-
(可选)要以 Apache Iceberg 格式将日志传输到 S3 表类数据存储服务,请选择启用 S3 表类数据存储服务集成。
-
选择保存更改。
保存后,服务器访问日志传输到 CloudWatch Logs 部分会显示已启用的日志组。
设置传输(CloudFormation)
您可以使用 AWS CloudFormation 自动设置将服务器访问日志传输到 CloudWatch Logs。以下模板创建所需的资源:IAM 角色、CloudWatch Logs 日志组、传输源、传输目标和传输。
AWSTemplateFormatVersion: '2010-09-09' Description: S3 Access Logs delivery to CloudWatch Logs Parameters: SourceBucketArn: Type: String Description: ARN of the S3 bucket to enable access logging LogGroupName: Type: String Default: /aws/s3/access-logs Description: CloudWatch Log Group name for SAL delivery Resources: SALLogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: !Ref LogGroupName RetentionInDays: 180 SALDeliverySource: Type: AWS::Logs::DeliverySource Properties: Name: !Sub '${AWS::StackName}-sal-source' ResourceArn: !Ref SourceBucketArn LogType: S3_SERVER_ACCESS_LOGS SALDeliveryDestination: Type: AWS::Logs::DeliveryDestination Properties: Name: !Sub '${AWS::StackName}-sal-destination' DestinationResourceArn: !GetAtt SALLogGroup.Arn SALDelivery: Type: AWS::Logs::Delivery Properties: DeliverySourceName: !Ref SALDeliverySource DeliveryDestinationArn: !GetAtt SALDeliveryDestination.Arn
启用 S3 表类数据存储服务集成(可选)
启用 S3 表类数据存储服务集成后,CloudWatch Logs 会自动以 Apache Iceberg 格式将您的服务器访问日志传输到您账户中的 aws-cloudwatch 托管式表存储桶。然后,您可以使用 Amazon Athena、Amazon Redshift 或任何与 Iceberg 兼容的工具来查询这些数据。
在 S3 表类数据存储服务集成中无需支付存储或表维护费用。您只需按照 S3 表类数据存储服务定价为 CloudWatch Logs 摄取和查询请求付费。
-
创建 S3 表类数据存储服务集成(每个区域、每个账户一次)。
aws observabilityadmin create-s3-table-integration \ --role-arn arn:aws:iam::123456789012:role/CWLogsS3TableIntegrationRole\ --encryption '{"SseAlgorithm": "AES256"}'IAM 角色必须信任
logs.amazonaws.com服务主体并授予logs:integrateWithS3Table权限。以下是信任策略的示例:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "logs.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "aws:SourceAccount": "123456789012" }, "ArnLike": { "aws:SourceArn": "arn:aws:logs:us-east-1:123456789012:log-group:log-group-name" } } } ] }该角色还需要以下权限策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "logs:integrateWithS3Table", "Resource": "arn:aws:logs:us-east-1:123456789012:log-group:log-group-name", "Condition": { "StringEquals": { "aws:ResourceAccount": "123456789012" } } } ] } -
将您的传输源与集成关联。
aws logs associate-source-to-s3-table-integration \ --integration-arnintegration-arn\ --data-source '{"name":"amazon_s3","type":"server_access"}'
完成这些步骤后,CloudWatch Logs 将创建 aws-cloudwatch 托管式表存储桶并开始以 Iceberg 格式传输日志。数据通常会在首次传输到 CloudWatch Logs 后的一小时内出现。
有关查询 S3 表类数据存储服务集成的信息,请参阅在 S3 表类数据存储服务中查询访问日志。
跨账户和跨区域聚合
CloudWatch Logs 传输路径支持跨账户和跨区域日志聚合,有两个选项:
-
CloudWatch 跨账户可观测性可让您在不复制数据的情况下跨账户查询现有日志。
-
CloudWatch Logs 集中化支持您将来自多个账户和区域的日志整合到一个中央日志组中,也可以选择使用订阅筛选条件来进行选择性转发。
对于多账户设置,管理员可以将 CloudWatch 遥测配置启用规则与 AWS Organizations 结合使用,以自动启用跨成员账户传输服务器访问日志。
注意
启用规则目前不支持自动启用 S3 表类数据存储服务集成。您必须在每个账户中单独启用此集成。
加密
您可以通过在日志组上配置 AWS KMS 加密来加密传输到 CloudWatch Logs 的服务器访问日志。当服务器访问日志传输到该日志组时,将使用您的 AWS KMS 密钥对其进行加密。这解决了 Amazon S3 通用存储桶传输路径的一个关键限制,该路径仅支持 SSE-S3 加密。
如果您启用了与 AWS KMS 加密日志组的 S3 表类数据存储服务集成,则必须在 AWS KMS 密钥策略中向以下服务主体授予其它权限:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnableCWSystemTablesKeyUsage", "Effect": "Allow", "Principal": { "Service": "systemtables.cloudwatch.amazonaws.com" }, "Action": [ "kms:DescribeKey", "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "arn:aws:kms:us-east-1:123456789012:key/key-id", "Condition": { "StringEquals": { "aws:SourceAccount": "123456789012" } } }, { "Sid": "EnableS3TablesMaintenanceKeyUsage", "Effect": "Allow", "Principal": { "Service": "maintenance.s3tables.amazonaws.com" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "arn:aws:kms:us-east-1:123456789012:key/key-id", "Condition": { "StringLike": { "kms:EncryptionContext:aws:s3:arn": "table-bucket-arn/*" } } } ] }
CloudWatch Logs 使用 systemtables.cloudwatch.amazonaws.com 主体将日志写入 S3 表类数据存储服务。S3 表类数据存储服务使用 maintenance.s3tables.amazonaws.com 主体来执行诸如压缩之类的 Iceberg 操作。
禁用传输
要停止将服务器访问日志传输到 CloudWatch Logs,您可以删除传输或传输源:
-
删除传输:停止日志传输,但保持传输源配置不变。稍后您可以创建新的传输,而无需重新配置源。
aws logs delete-delivery \ --iddelivery-id -
删除传输源:完全移除源配置。如果您不再希望存储桶与 CloudWatch Logs 传输相关联,请使用此选项。
aws logs delete-delivery-source \ --namedelivery-source-name
之前传输的日志仍保留在日志组和 S3 表类数据存储服务集成(如果已启用)中。删除传输不会移除现有的日志数据。