查询 Amazon Route 53 Resolver 查询日志 - Amazon Athena
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

查询 Amazon Route 53 Resolver 查询日志

您可以为 Amazon Route 53 Resolver 查询日志创建 Athena 表,并从 Athena 查询这些日志。

Route 53 解析程序查询日志记录用于记录 VPC 中的资源提出的 DNS 查询、使用入站解析程序端点的本地部署资源、使用出站解析程序端点进行递归 DNS 解析的查询以及使用 Route 53 解析程序 DNS 防火墙规则阻止、允许或监控域列表的查询。有关解析程序查询日志记录的更多信息,请参阅《Amazon Route 53 开发人员指南》中的解析程序查询日志记录。有关日志中每个字段的信息,请参阅《Amazon Route 53 开发人员指南》中的 显示在解析程序查询日志中的值

为解析程序查询日志创建表

您可以使用 Athena 控制台中的查询编辑器为 Route 53 解析程序查询日志创建和查询表。

为 Route 53 解析程序查询日志创建和查询 Athena 表
  1. https://console.aws.amazon.com/athena/ 打开 Athena 控制台。

  2. 在 Athena 查询编辑器中,输入以下 CREATE TABLE 语句。将 LOCATION 子句值替换为与您的解析程序日志在 Amazon S3 中的位置相对应的子句值。

    CREATE EXTERNAL TABLE r53_rlogs ( version string, account_id string, region string, vpc_id string, query_timestamp string, query_name string, query_type string, query_class string, rcode string, answers array< struct< Rdata: string, Type: string, Class: string> >, srcaddr string, srcport int, transport string, srcids struct< instance: string, resolver_endpoint: string >, firewall_rule_action string, firewall_rule_group_id string, firewall_domain_list_id string ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' LOCATION 's3://DOC-EXAMPLE-BUCKET/AWSLogs/aws_account_id/vpcdnsquerylogs/{vpc-id}/'

    由于解析程序查询日志数据是 JSON 格式的,因此 CREATE TABLE 语句将使用 JSON SerDe 库来分析数据。

    注意

    SerDe 期望每个 JSON 文档都位于单行文本中,并且不使用行终止字符分隔记录中的字段。如果 JSON 文本采用美观的打印格式,当您在创建表后尝试对其进行查询时,可能会收到类似以下内容的错误消息:HIVE_CURSOR_ERROR: Row is not a valid JSON Object(HIVE_CURSOR_ERROR:行不是有效的 JSON 对象)或 HIVE_CURSOR_ERROR: JsonParseException: Unexpected end-of-input: expected close marker for OBJECT(HIVE_CURSOR_ERROR:JsonParseException:意外的输入结束:对象的预期关闭标记)。有关更多信息,请参阅 GitHub 上 OpenX SerDe 文档中的 JSON 数据文件

  3. 选择运行查询。该语句创建名为 r53_rlogs 的 Athena 表,其中的列表示解析程序日志数据中的每个字段。

  4. 在 Athena 控制台查询编辑器中,运行以下查询以验证您的表是否已创建。

    SELECT * FROM "r53_rlogs" LIMIT 10

分区示例

以下示例显示了 Resolver 查询日志的 CREATE TABLE 语句,该语句使用分区投影并按 VPC 和日期进行分区。更多有关分区投影的信息,请参阅 使用 Amazon Athena 分区投影

CREATE EXTERNAL TABLE r53_rlogs ( version string, account_id string, region string, vpc_id string, query_timestamp string, query_name string, query_type string, query_class string, rcode string, answers array< struct< Rdata: string, Type: string, Class: string> >, srcaddr string, srcport int, transport string, srcids struct< instance: string, resolver_endpoint: string >, firewall_rule_action string, firewall_rule_group_id string, firewall_domain_list_id string ) PARTITIONED BY ( `date` string, `vpc` string ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET/route53-query-logging/AWSLogs/aws_account_id/vpcdnsquerylogs/' TBLPROPERTIES( 'projection.enabled' = 'true', 'projection.vpc.type' = 'enum', 'projection.vpc.values' = 'vpc-6446ae02', 'projection.date.type' = 'date', 'projection.date.range' = '2023/06/26,NOW', 'projection.date.format' = 'yyyy/MM/dd', 'projection.date.interval' = '1', 'projection.date.interval.unit' = 'DAYS', 'storage.location.template' = 's3://DOC-EXAMPLE-BUCKET/route53-query-logging/AWSLogs/aws_account_id/vpcdnsquerylogs/${vpc}/${date}/' )

示例查询

以下示例显示了您可以从 Athena 对解析程序查询日志执行的一些查询。

示例 1 – 按降序 query_timestamp 顺序查询日志

以下查询以降序 query_timestamp 顺序显示日志结果。

SELECT * FROM "r53_rlogs" ORDER BY query_timestamp DESC

示例 2 – 指定的开始时间和结束时间内的查询日志

以下查询查询在 2020 年 9 月 24 日午夜和上午 8 点之间日志。根据您自己的要求替换开始时间和结束时间。

SELECT query_timestamp, srcids.instance, srcaddr, srcport, query_name, rcode FROM "r53_rlogs" WHERE (parse_datetime(query_timestamp,'yyyy-MM-dd''T''HH:mm:ss''Z') BETWEEN parse_datetime('2020-09-24-00:00:00','yyyy-MM-dd-HH:mm:ss') AND parse_datetime('2020-09-24-00:08:00','yyyy-MM-dd-HH:mm:ss')) ORDER BY query_timestamp DESC

示例 3 – 基于指定 DNS 查询名称模式的查询日志

以下查询选择其查询名称包含字符串“example.com”的记录。

SELECT query_timestamp, srcids.instance, srcaddr, srcport, query_name, rcode, answers FROM "r53_rlogs" WHERE query_name LIKE '%example.com%' ORDER BY query_timestamp DESC

示例 4 – 没有答案的查询日志请求

以下查询选择请求未收到任何答案的日志条目。

SELECT query_timestamp, srcids.instance, srcaddr, srcport, query_name, rcode, answers FROM "r53_rlogs" WHERE cardinality(answers) = 0

示例 5 – 查询具有特定答案的日志

以下查询显示了 answer.Rdata 值具有指定的 IP 地址的日志。

SELECT query_timestamp, srcids.instance, srcaddr, srcport, query_name, rcode, answer.Rdata FROM "r53_rlogs" CROSS JOIN UNNEST(r53_rlogs.answers) as st(answer) WHERE answer.Rdata='203.0.113.16';