Amazon Route 53 Resolver 쿼리 로그의 쿼리 - Amazon Athena

Amazon Route 53 Resolver 쿼리 로그의 쿼리

Amazon Route 53 Resolver 쿼리 로그에 대한 Athena 테이블을 생성하고 Athena에서 쿼리할 수 있습니다.

Route 53 Resolver 쿼리 로깅은 인바운드 해석기(resolver) 엔드포인트를 사용하는 온프레미스 리소스인 VPC 내의 리소스에 의해 수행된 DNS 쿼리, 재귀적 DNS 확인(recursive DNS resolution)을 위해 아웃바운드 해석기 엔드포인트를 사용하는 쿼리, 그리고 도메인 목록을 차단, 허용 또는 모니터링하기 위해 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 문을 입력합니다. LOCATION 절의 값을 Amazon S3의 Resolver 로그 위치에 상응하는 값으로 바꿉니다.

    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}/'

    Resolver 쿼리 로그 데이터는 JSON 형식이기 때문에 CREATE TABLE 문은 JSON SerDe 라이브러리를 사용하여 데이터를 분석합니다.

    참고

    SerDe는 각 JSON 문서가 레코드의 필드를 구분하는 줄 종료 문자가 없는 한 줄의 텍스트에 있을 것으로 예상합니다. JSON 텍스트가 가독성 좋게 꾸민 형식이면 테이블을 만든 후 쿼리하려고 할 때 HIVE_CURSOR_ERROR: 행이 유효한 JSON 객체가 아님(HIVE_CURSOR_ERROR: Row is not a valid JSON Object) 또는 HIVE_CURSOR_ERROR: JsonParseException: 예기치 않은 입력 종료: OBJECT의 닫기 마커 필요(HIVE_CURSOR_ERROR: JsonParseException: Unexpected end-of-input: expected close marker for OBJECT) 같은 오류 메시지가 나타날 수 있습니다. 자세한 내용은 GitHub의 OpenX SerDe 문서에서 JSON 데이터 파일을 참조하세요.

  3. 쿼리 실행을 선택합니다. 이 문은 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';