在 S3 表类数据存储服务中查询访问日志
启用 Amazon S3 表类数据存储服务集成后,Amazon CloudWatch Logs 会自动以 Apache Iceberg 格式将您的服务器访问日志传输到 aws-cloudwatch 托管式表存储桶。由于数据采用 Iceberg 格式,因此,您可以使用任何支持 Apache Iceberg 的工具对数据进行查询,包括:
-
Amazon Athena:使用 S3 表类数据存储服务目录直接从 Athena 控制台运行 SQL 查询。
-
Amazon SageMaker 融通式合作开发工作室:使用内置的 SQL 编辑器查询您的日志数据以及其它分析工作负载。
-
Amazon Redshift:通过 Redshift Spectrum 或直接集成查询 Iceberg 表。
-
Amazon EMR 上的 Apache Spark:使用 Spark SQL 或带有 Iceberg 连接器的 DataFrame API。
-
开源工具:任何支持 Apache Iceberg REST 目录的工具,例如 Trino、DuckDB 或 PyIceberg。
注意
有关在 CloudWatch Logs Insights 中以交互方式查询日志(不使用 SQL),请参阅使用 CloudWatch Logs Insights 查询日志。
先决条件
您必须先完成以下步骤,然后才能在 S3 表类数据存储服务中查询访问日志:
-
启用 S3 表类数据存储服务集成。请参阅启用 S3 表类数据存储服务集成(可选)。
-
启用 S3 表类数据存储服务与分析服务集成。在 Amazon S3 控制台中,导航到表存储桶,然后选择启用集成。这将在数据目录中创建
s3tablescatalog联合目录,并使您的表对分析服务可见。默认情况下,访问权限通过 IAM 权限进行控制。您可以选择使用 AWS Lake Formation 进行精细的访问控制。有关更多信息,请参阅将 S3 表类数据存储服务与 AWS 分析服务集成。 -
等待数据进行填充。数据通常会在首次传输到 CloudWatch Logs 后的一小时内出现。
连接 Amazon Athena
-
从 https://console.aws.amazon.com/athena/
打开 Athena 控制台。 -
在查询编辑器中,从数据来源下拉列表中选择 Amazon S3 表类数据存储服务目录。
-
您的日志表出现在
logs命名空间下的数据库列表中。
服务器访问日志的表名称为 amazon_s3__server_access。完全限定的表参考是:
"s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access"
流量分析
例一段时间内的请求量
SELECT date_trunc('minute', request_time) AS interval, COUNT(*) AS requests FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" GROUP BY date_trunc('minute', request_time) ORDER BY interval ASC;
例按操作类型划分的请求组合
SELECT operation, COUNT(*) AS cnt FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" GROUP BY operation ORDER BY cnt DESC;
例按存储桶划分的流量
SELECT bucket_arn, COUNT(*) AS requests, SUM(bytes_sent_size) AS bytes_out FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" GROUP BY bucket_arn ORDER BY requests DESC;
错误排查
例错误率细分
SELECT http_status, error_code, operation, COUNT(*) AS error_count FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" WHERE http_status >= 400 GROUP BY http_status, error_code, operation ORDER BY error_count DESC;
例 403 拒绝访问请求
SELECT key_name, remote_ip, requester, COUNT(*) AS denied_count FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" WHERE http_status = 403 GROUP BY key_name, remote_ip, requester ORDER BY denied_count DESC;
例 404 找不到请求
SELECT key_name, error_code, remote_ip, COUNT(*) AS miss_count FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" WHERE http_status = 404 GROUP BY key_name, error_code, remote_ip ORDER BY miss_count DESC;
例 503 减速(节流)事件
SELECT key_name, remote_ip, COUNT(*) AS throttle_count FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" WHERE http_status = 503 GROUP BY key_name, remote_ip ORDER BY throttle_count DESC;
访问模式
例按源 IP 划分的流量
SELECT remote_ip, COUNT(*) AS total_requests, SUM(CASE WHEN http_status >= 400 THEN 1 ELSE 0 END) AS errors, SUM(bytes_sent_size) AS bytes_transferred FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" GROUP BY remote_ip ORDER BY total_requests DESC;
例请求者的操作
SELECT requester, operation, COUNT(*) AS requests FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" GROUP BY requester, operation ORDER BY requests DESC;
例最常访问的键
SELECT key_name, COUNT(*) AS access_count, SUM(bytes_sent_size) AS bytes_out FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" WHERE operation IN ('REST.GET.OBJECT', 'REST.PUT.OBJECT') GROUP BY key_name ORDER BY access_count DESC LIMIT 10;
延迟分析
例按操作类型划分的延迟
SELECT operation, AVG(total_duration) AS avg_ms, APPROX_PERCENTILE(total_duration, 0.5) AS p50_ms, APPROX_PERCENTILE(total_duration, 0.95) AS p95_ms, MAX(total_duration) AS max_ms, COUNT(*) AS requests FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" WHERE operation IN ('REST.GET.OBJECT', 'REST.PUT.OBJECT') GROUP BY operation;
例按照 p95 延迟划分的最慢键
SELECT key_name, AVG(total_duration) AS avg_ms, APPROX_PERCENTILE(total_duration, 0.95) AS p95_ms, COUNT(*) AS requests FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" WHERE operation = 'REST.GET.OBJECT' GROUP BY key_name ORDER BY p95_ms DESC LIMIT 10;
例一段时间内的延迟
SELECT date_trunc('minute', request_time) AS interval, AVG(total_duration) AS avg_ms, APPROX_PERCENTILE(total_duration, 0.95) AS p95_ms FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" WHERE operation IN ('REST.GET.OBJECT', 'REST.PUT.OBJECT') GROUP BY date_trunc('minute', request_time) ORDER BY interval ASC;
成本归属
例按操作划分的数据传输
SELECT operation, SUM(bytes_sent_size) AS total_bytes_out, SUM(object_size) AS total_object_bytes, COUNT(*) AS request_count FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" WHERE operation IN ('REST.GET.OBJECT', 'REST.PUT.OBJECT', 'REST.DELETE.OBJECT') GROUP BY operation ORDER BY total_bytes_out DESC;
例正在提供的最大对象
SELECT key_name, MAX(object_size) AS max_size, AVG(object_size) AS avg_size, COUNT(*) AS reads FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" WHERE operation = 'REST.GET.OBJECT' AND bytes_sent_size > 0 GROUP BY key_name ORDER BY max_size DESC LIMIT 10;
安全分析
例具有高错误率的 IP
SELECT remote_ip, COUNT(*) AS total, SUM(CASE WHEN http_status >= 400 THEN 1 ELSE 0 END) AS errors FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" GROUP BY remote_ip HAVING SUM(CASE WHEN http_status >= 400 THEN 1 ELSE 0 END) > 10 ORDER BY errors DESC;
例按键划分的尝试访问失败
SELECT remote_ip, key_name, operation, http_status, COUNT(*) AS attempts FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" WHERE http_status >= 400 GROUP BY remote_ip, key_name, operation, http_status ORDER BY attempts DESC LIMIT 20;
例 TLS 版本分配
SELECT tls_version, COUNT(*) AS cnt FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" GROUP BY tls_version ORDER BY cnt DESC;
使用人工智能代理查询 Amazon S3 服务器访问日志
与 MCP 兼容的人工智能代理可以发现包含 Amazon S3 服务器访问日志的 S3 表,生成 SQL 查询并分析结果。由于您的 Amazon S3 服务器访问日志在 aws-cloudwatch 表存储桶中以 Iceberg 表的形式导出,因此,代理可以通过您在 Amazon Athena、Amazon EMR、Amazon Redshift 或任何与 Iceberg 兼容的工具中使用的相同 S3 表类数据存储服务目录对这些日志进行查询。
Agent Toolkit for AWSaws-cloudwatch 表存储桶中的 Amazon S3 服务器访问日志。要使用它,请从 GitHub 上的存储库下载该技能,并将其添加到代理的技能目录中。
例如,您可以要求代理显示过去 24 小时内,S3 服务器访问日志中请求计数排名前 10 的源 IP 地址。代理使用该技能来定位访问日志表并在 Athena 中运行查询。