Athena로 S3에 저장된 VPC Flow Log를 쿼리하여 출력해보기!

S3에 저장된 VPC Flow Log를 쿼리해보기!
2022.12.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

소개

안녕하세요! 클래스메소드 금상원 입니다. 이번 블로그에서는 Athena 쿼리 결과를 S3에 저장하는 방법에 대해 알아 보겠습니다.

VPC Flow Log설정에 대하여

Apache Parquet 형식으로 저장된 VPC Flow Logs의 쿼리는 압축된 컬럼 형식과 쿼리가 더 빨리 실행되고 더 적은 양의 데이터를 스캔가능한 효율적인 설정입니다.

Parquet 형식 파일의 압축 기능이 더 우수하므로 S3 스토리지 비용을 최대 25% 절감할 수 있고, Apache Parquet 변환 애플리케이션을 구축하고 관리할 필요가 없습니다. Hive 호환되는 접두사는 Hive 도구에 새로운 데이터를 더 쉽게 검색하고 로드할 수 있게 하고, 시간별 파티션된 로그 파일은 특정 시간 간격에 걸쳐 더 효율적으로 로그를 쿼리할 수 있게 합니다.

테이블 만들기

Athena의 쿼리 편집기 콘솔 화면에서「편집기」탭에서 아래의 쿼리를 입력합니다. 쿼리입력 후 아래의「실행」 버튼을 클릭하여 테이블을 생성합니다. 우측에 새로만든 테이블이 표시됩니다.

CREATE EXTERNAL TABLE IF NOT EXISTS vpc_flow_logs_parquet (
 `version` int,
 `account_id` string,
 `interface_id` string,
 `srcaddr` string,
 `dstaddr` string,
 `srcport` int,
 `dstport` int,
 `protocol` bigint,
 `packets` bigint,
 `bytes` bigint,
 `start` bigint,
 `end` bigint,
 `action` string,
 `log_status` string,
 `vpc_id` string,
 `subnet_id` string,
 `instance_id` string,
 `tcp_flags` int,
 `type` string,
 `pkt_srcaddr` string,
 `pkt_dstaddr` string,
 `region` string,
 `az_id` string,
 `sublocation_type` string,
 `sublocation_id` string,
 `pkt_src_aws_service` string,
 `pkt_dst_aws_service` string,
 `flow_direction` string,
 `traffic_path` int
)
PARTITIONED BY (
`aws-account-id` string,
`aws-service` string,
`aws-region` string,
`year` string,
`month` string,
`day` string,
`hour` string
)
ROW FORMAT SERDE
 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT
 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
 's3://{버킷명}/AWSLogs/'
TBLPROPERTIES (
 'EXTERNAL'='true',
 'skip.header.line.count'='1'
)

「LOCATION」의 부분에서 s3 버켓경로를 입력하실 때 공식문서 처럼 날짜와 같은 설정까지 세세하게 하면 데이터를 조회할 수 있는 범위가 좁아지기 때문에 특별한 이유가 없다면 위의 코드처럼「s3://버킷명/AWSLogs/」정도만 설정하는 것을 추천 드립니다.

쿼리 해보기

테이블내에 데이터 갱신하기

아래의 쿼리문을 입력하시면 갱신하는 현시점 까지의 데이터가 추가가 됩니다. 아래의 쿼리문은「Hive 호환 형식」인 경우에만 사용됩니다.

MSCK REPAIR TABLE {테이블명}

Hive 호환 형식 설정이 되어 있지 않으시다면 아래의 명령어를 사용 하여 데이터를 추가할 수 있습니다.

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

쿼리 실행

아래의 쿼리문을 이용하여 특정기간내의 데이터를 최신 기록순으로 조회할 수 있습니다. Athena 요금은 스캔한 데이터당 요금이 추가로 발생하기 때문에 기간이나 시간을 설정 하는 것을 추천드립니다.

아래의 블로그는 한국어가 지원이 되지 않기 때문에 크롬에서 우클릭후 한국어 번역으로 설정하신 후 확인 부탁드립니다.

쿼리가 정상적으로 실행이 되었다면 쿼리문 아래의 사진처럼 결과가 나오는 것을 확인할 수 있습니다.

SELECT *
FROM vpc_flow_logs_parquet
WHERE (year,month,day) >= ('2022','12','01') AND (year,month,day) <= ('2022','12','06')
ORDER BY (year,month,day,hour) DESC

마무리

이번 블로그에서는 S3에 저장된 VPC Flow Log를 Athena를 이용하여 조회 하는 방법에 대해 알아보았습니다. VPC Flow Log를 통해 IP 트래픽을 수집하여 운영이나 보안에 사용하기를 원하는시는 분들께 조금이나마 도움이 되었으면 좋겠습니다.

참고 자료

본 블로그 게시글을 보시고 문의 사항이 있으신 분들은 클래스메소드코리아 (info@classmethod.kr)로 연락 주시면 빠른 시일 내 담당자가 회신 드릴 수 있도록 하겠습니다 !