查詢 Amazon Route 53 Resolver 查詢日誌 - Amazon Athena

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

查詢 Amazon Route 53 Resolver 查詢日誌

您可以為 Amazon Route 53 Resolver 查詢日誌建立 Athena 資料表,並從 Athena 查詢它們。

Route 53 Resolver 查詢記錄功能用於記錄資源在 VPC 內所做的 DNS 查詢、使用傳入解析程式端點的內部部署資源、使用遞迴 DNS 解析之傳出解析程式端點的查詢,以及使用 Route 53 Resolver DNS 防火牆規則封鎖、允許或監控網域清單的查詢。如需有關 Resolver 查詢記錄的詳細資訊,請參閱《Amazon Route 53 開發人員指南》中的 Resolver 查詢記錄。如需有關日誌中各欄位的資訊,請參閱《Amazon Route 53 開發人員指南》中的在 Resolver 查詢日誌中出現的值

建立 Resolver 查詢日誌的資料表

您可以使用 Athena 主控台中的查詢編輯器,建立並查詢 Route 53 Resolver 查詢日誌的資料表。

若要建立並查詢 Route 53 Resolver 查詢日誌的 Athena 資料表
  1. 前往 https://console.aws.amazon.com/athena/ 開啟 Athena 主控台。

  2. 在 Athena 查詢編輯器中,輸入以下 CREATE TABLE 陳述式。使用對應於 Amazon S3 中 Resolver 日誌位置的值取代 LOCATION 子句值。

    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:行不是有效的 JSON 對象HIVE_CURSOR_ERROR:: 意外 JsonParseException end-of-input:當您嘗試查詢表後創建表時,對象的預期關閉標記。如需詳細資訊,請參閱上 GitHub的 OpenX SerDe 文件中的 JSON 資料檔案。

  3. 選擇 Run query (執行查詢)。該陳述式會建立名為 r53_rlogs 的 Athena 資料表,其資料欄表示 Resolver 日誌資料中的各欄位。

  4. 在 Athena 主控台查詢編輯器中,執行以下查詢,以確認您的資料表已建立。

    SELECT * FROM "r53_rlogs" LIMIT 10

分割範例

下列範例顯示使用分割區投影並依據 vpc 和日期分割的 Resolver 查詢日誌 CREATE TABLE 陳述式。如需有關分割區投影的詳細資訊,請參閱使用 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 對 Resolver 查詢日誌執行的部分查詢。

範例 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';