查询 Amazon VPC 流日志 - Amazon Athena
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

查询 Amazon VPC 流日志

Amazon Virtual Private Cloud 流日志捕获有关在 VPC 中传入和传出网络接口的 IP 流量的信息。可使用日志来调查网络流量模式,并识别 VPC 网络中的威胁和风险。

当您开始在 Athena 中查询日志之前,启用 VPC 流日志并将其配置为保存到您的 Amazon S3 存储桶。在您创建日志后,让它们运行几分钟以收集一些数据。这些日志是采用 Athena 允许您直接查询的 GZIP 压缩格式创建的。

当您创建 VPC 流日志时,您可以使用默认格式,也可以指定自定义格式。采用自定义格式,您可以指定在流日志中返回哪些字段,以及这些字段的显示顺序。有关更多信息,请参阅 Amazon VPC 用户指南 中的流日志记录

为 VPC 流日志创建表

以下过程将为使用默认格式的 VPC 流日志创建 Amazon VPC 表。如果您使用自定义格式创建流日志,那么您必须创建一个表,其字段与您在创建流日志时指定的字段相匹配,且字段顺序与您指定的字段顺序相同。

创建 Amazon VPC 表

  1. 将以下 DDL 语句复制并粘贴到 Athena 控制台查询编辑器中。

    CREATE EXTERNAL TABLE IF NOT EXISTS vpc_flow_logs ( version int, account string, interfaceid string, sourceaddress string, destinationaddress string, sourceport int, destinationport int, protocol int, numpackets int, numbytes bigint, starttime int, endtime int, action string, logstatus string ) PARTITIONED BY (`date` date) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' LOCATION 's3://your_log_bucket/prefix/AWSLogs/{account_id}/vpcflowlogs/{region_code}/' TBLPROPERTIES ("skip.header.line.count"="1");

    请注意以下几点:

    • 此查询指定 ROW FORMAT DELIMITED 并省略指定 SerDe。这意味着查询使用用于 CSV、TSV 和自定义分隔文件的 LazySimpleSerDe。在此查询中,字段由一个空格终止。

    • PARTITIONED BY 子句使用 date 类型。这样,就可以在查询中使用数学运算符来选择比特定日期更早或更新的内容。

      注意

      因为 date 在 DDL 语句中是保留关键字,所以用反引号字符对其进行转义。有关更多信息,请参阅保留关键字

    • 对于具有自定义格式的 VPC 流日志,请修改字段以与您创建流日志时指定的字段相匹配。

  2. 修改 LOCATION 's3://your_log_bucket/prefix/AWSLogs/{account_id}/vpcflowlogs/{region_code}/' 以指向包含您的日志数据的 Amazon S3 存储桶。

  3. 在 Athena 控制台中运行查询。查询完成后,Athena 将注册 vpc_flow_logs 表,使其中的数据可以供您发出查询。

  4. 创建分区以便能够读取数据,如以下示例查询中所示。此示例查询创建指定日期的单个分区。根据需要替换日期和位置的占位符。

    注意

    此查询仅为您指定的日期创建单个分区。要自动执行此过程,请使用运行此查询并以这种方式为 year/month/day 创建分区的脚本。

    ALTER TABLE vpc_flow_logs ADD PARTITION (`date`='YYYY-MM-dd') location 's3://your_log_bucket/prefix/AWSLogs/{account_id}/vpcflowlogs/{region_code}/YYYY/MM/dd';

Amazon VPC 流日志的示例查询

以下示例查询列出了指定日期的最多 100 个流日志。

SELECT * FROM vpc_flow_logs WHERE date = DATE('2020-05-04') LIMIT 100;

以下查询列出所有被拒绝的 TCP 连接并使用新创建的日期分区列 date 来从中提取这些事件发生的星期几。

SELECT day_of_week(date) AS day, date, interfaceid, sourceaddress, action, protocol FROM vpc_flow_logs WHERE action = 'REJECT' AND protocol = 6 LIMIT 100;

要查看您的哪个服务器收到最大数量的 HTTPS 请求,请使用此查询。它计算在 HTTPS 端口 443 上接收的数据包数,按目标 IP 地址对它们进行分组,并返回上一周的前 10 个。

SELECT SUM(numpackets) AS packetcount, destinationaddress FROM vpc_flow_logs WHERE destinationport = 443 AND date > current_date - interval '7' day GROUP BY destinationaddress ORDER BY packetcount DESC LIMIT 10;

有关更多信息,请参阅 AWS 大数据博客文章使用 Amazon Kinesis Firehose、Athena 和 Amazon QuickSight 分析 VPC 流日志