AWS ATHENA 로 VPC FLOW LOG 분석하기 – 2
이전 글에서 AWS 의 Athena 를 이용한 VPC Flow Log 를 어떻게 분석하는지에 대해서 이야기 했다. VPC Flow Log 생성부터, S3 버킷 생성, Athena 데이터베이스와 테이블 그리고 Lambda 를 이용한 파티션 추가까지 비교적 많은 부분을 손봐야 했다.
이 방법은 파티션 작업을 Lambda 를 이용하는 방법으로 하루에 한번 실행시키도록 하고 있다. 하지만, AWS 에서는 이마져도 필요 없는 방법을 제공하는데, 그것이 바로 파티션 프로젝션(Partition Projection) 이다.
AWS 메뉴얼 주의사항
파티션 프로젝션을 하기 위해서 AWS 메뉴얼을 보고 따라했는데 되지 않는다. 정확히는 테이블 생성이 되지만 Athena 에서는 보이지 않는다.
Athena 의 데이터베이스는 Glue 를 이용한다. AWS Glue 가 가보면 Athena 의 테이블을 볼 수 있는데, AWS 메뉴얼대로 파티션 프로젝션을 생성하면 Glue 에는 나오지만 Athena 에는 안나온다. 이는 Glue 에서 S3 저장소를 인식하지 못해 나오는 문제다.
다음의 메뉴얼에는 문제가 있다.
일단 위 메뉴얼에는 파티션 프로젝션이 무엇인지를 설명하고 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
CREATE EXTERNAL TABLE my_ingested_data ( ... ) ... PARTITIONED BY ( datehour STRING ) LOCATION "s3://DOC-EXAMPLE-BUCKET/prefix/" TBLPROPERTIES ( "projection.enabled" = "true", "projection.datehour.type" = "date", "projection.datehour.format" = "yyyy/MM/dd/HH", "projection.datehour.range" = "2021/01/01/00,NOW", "projection.datehour.interval" = "1", "projection.datehour.interval.unit" = "HOURS", "storage.location.template" = "s3://DOC-EXAMPLE-BUCKET/prefix/${datehour}/" ) |
위 내용을 요약하면 버킷의 구조가 다음과 같다는 것이다.
1 2 3 |
s3://DOC-EXAMPLE-BUCKET/prefix/2021/01/01/00/ s3://DOC-EXAMPLE-BUCKET/prefix/2021/01/01/01/ s3://DOC-EXAMPLE-BUCKET/prefix/2021/01/01/02/ |
이런 구조에서 파티션 프로젝션을 걸어주면 자동으로 날짜시간으로 파티션이 형성된다.
VPC Flow Log 의 파티션 프로젝션
그렇다면 이제 VPC Flow Log 에 파티션 프로젝션을 걸어 테이블 생성해 보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
CREATE EXTERNAL TABLE IF NOT EXISTS `vpc_flow_logs_prj`( `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 ) PARTITIONED BY (`day` string) -- 파티셔닝 컬럼 지정 ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' LOCATION 's3://flow-log-buckets/AWSLogs/111111222222333333/vpcflowlogs/ap-northeast-2/' TBLPROPERTIES ( 'projection.enabled' = 'true', 'projection.day.type' = 'date', 'projection.day.range' = '2022/08/23,NOW', 'projection.day.format' = 'yyyy/MM/dd', 'projection.day.interval' = '1', 'projection.day.interval.unit' = 'DAYS' 'storage.location.template' = 's3://flow-log-buckets/AWSLogs/1111112222222333333/vpcflowlogs/ap-northeast-2/${day}/' ) |
위 쿼리문으로 테이블을 생성하면 AWS Glue 에서는 테이블이 생성되지만 Athena 에는 나오지 않는다. 그리고 AWS Clue 에서 테이블 속성을 보면 S3 저장소와 연결되어 있지 않다.
왜 그럴까?
파티션 프로젝션을 연결할때에는 S3 저장소에 저장된 위치는 물론이고 S3 에 저장된 값의 속성도 지정해 줘야 한다. 대표적인 것이 다음과 같은 것이다.
- Row format delimited
- Stored as inputformat
- outputformat
파티션 프로젝션 없이 테이블을 생성할때에는 이 옵션을 지정해 주지 않았다. 그러면 Default 값이 지정되는데, 대부분 잘 맞는 것이였다.
하지만, 파티션 프로젝션을 할 경우에 속성들을 지정해주지 않으면 아무것도 안된다. 다음과 같이 파티션 프로젝션 테이블을 생성해준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
CREATE EXTERNAL TABLE `vpc_flow_logs_prj`( `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) PARTITIONED BY ( `day` string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://flow-log-buckets/AWSLogs/111112222223333/vpcflowlogs/ap-northeast-2' TBLPROPERTIES ( 'skip.header.line.count'='1', 'projection.enabled'='true', 'projection.day.type' = 'date', 'projection.day.range' = '2022/08/23,NOW', 'projection.day.format' = 'yyyy/MM/dd', 'projection.day.interval' = '1', 'projection.day.interval.unit' = 'DAYS', 'storage.location.template'='s3://flow-log-buckets/AWSLogs/111111222222333333/vpcflowlogs/ap-northeast-2/${day}/' ) |
위와같이 할 경우에 파티션 프로젝션 테이블이 잘 생성된다. 이렇게 생성하고 난 후에 AWS Glue 에서 테이블의 속성을 보게 되면 정상적으로 S3 버킷과 연결이 되어 있고 각종 속성들이 설정되어 있는 것을 볼 수 있다.