2024. 1. 21. 23:31ใAWS
๊ฐ์
Athena๋ฅผ ์ด์ฉํ์ฌ S3 Bucket์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ค. S3 ๋ฒํท์๋ ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๊ณ ์์ผ๋ฉฐ, Athena์์ ์ฟผ๋ฆฌ ํ์ ๋ ๋ ๋น ๋ฅธ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ ์ํด ๋ฐ์ดํฐ ํํฐ์ ๋์ด ํ์ํ๋ค. Athena Partition projection์ ์ด์ฉํด ๋ณด์.
๋ค์ด๊ฐ๊ธฐ ์
ํํฐ์ ๋์ด๋?
ํฐ Table์ด๋ ์ธ๋ฑ์ค๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ๋จ์๋ก ๋ถ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์๋ฏธํ๋ค. ๋ฐ์ดํฐ๋ฅผ ๋ถํ ํ๋ฉด ๊ฐ ์ฟผ๋ฆฌ๊ฐ ์ค์บํ๋ ๋ฐ์ดํฐ์ ์์ ์ ํํ์ฌ ์ฑ๋ฅ์ ํฅ์ํ๊ณ ๋น์ฉ์ ์ ๊ฐํ ์ ์๋ค. ํํฐ์ ๋์ ๋ํ ์์ธ ๋ด์ฉ์ ์ฌ๊ธฐ ์ฐธ์กฐ.
Amazon Athena๋?
Amazon S3์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ง์ ๊ฐํธํ๊ฒ ๋ถ์ํ ์ ์๋ ๋ํํ ์ฟผ๋ฆฌ ์๋น์ค. ๋ฐ์ดํฐ๋ฅผ ํฌ๋งทํ๊ฑฐ๋ ์ธํ๋ผ ๋๋ ํด๋ฌ์คํฐ๋ฅผ ๊ด๋ฆฌํ ํ์๊ฐ ์๋ค. ๋ฐ์ดํฐ์ ๋ํ ํ ์ด๋ธ์ ์ ์ํ๊ณ ํ์ค SQL์ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์์ํ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
Athena๋ Amazon S3์ ์ ์ฅ๋ ๋น์ ํ, ๋ฐ์ ํ ๋ฐ ์ ํ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๋ ๋ฐ ๋์์ด ๋๋ค : CSV, JSON ๋๋ ์ปฌ๋ผ ๋ฐฉ์ ๋ฐ์ดํฐ ํ์(ex: Apache Parquet ๋ฐ Apache ORC) ๋ฑ.
Athena๋ S3์์ ๋ฐ์ดํฐ์ ๋ํ ์ง์์ ๋ฉํ๋ฐ์ดํฐ ์คํ ์ด๋ฅผ ์ ๊ณตํ๋ AWS Glue Data Catalog์ ํตํฉ๋๋ค. Athena๋ AWS Glue Data Catalog๋ฅผ ์ฌ์ฉํด AWS ๊ณ์ ์ Amazon S3 ๋ฐ์ดํฐ์ ๋ํ ํ ์ด๋ธ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ฒ์ํ๋ค. Athena ์ฟผ๋ฆฌ ์์ง์ ํ ์ด๋ธ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ํตํด ์ฟผ๋ฆฌ ํ๋ ค๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ณ , ์ฝ๊ณ , ์ฒ๋ฆฌํ ๋ฐฉ๋ฒ์ ํ์ ํ๋ค.
AWS Glue๋?
AWS Glue๋ AWS์ ์์ ๊ด๋ฆฌํ ์ถ์ถ(Extract), ๋ณํ(Transform), ๋ก๋(Load) ์๋น์ค์ด๋ค. ์ฃผ์ ๊ธฐ๋ฅ ์ค ํ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๊ณ ๋ถ๋ฅํ๋ ๊ฒ์ด๋ค. Glue Data Catalog๋ ๋ฐ์ดํฐ ์์ค(S3)์ ๋์ ๊ฐ์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ฉํ๋ฐ์ดํฐ ์ ์ฅ์์ด๋ค. ํ ์ด๋ธ ์ ์, job ์ ์์ ๋ค๋ฅธ ๊ด๋ฆฌ ์ ๋ณด๋ฅผ ํฌํจํ๋ฉฐ, ๊ฐ AWS account๋ ๋ฆฌ์ ๋น ํ๋์ AWS Glue Data Catalog๋ฅผ ๊ฐ์ง ์ ์๋ค.
Glue data catalog
“ํ ์ด๋ธ์ ๋ฉํ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ์ฅ์๋ก๋ Hive metastore์์ ํ์๋ Glue data catalog๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. schema-on-write์ธ ์ผ๋ฐ์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ ๋ค๋ฅด๊ฒ schema-on-read์ธ ๋ฐ์ดํฐ ์นดํ๋ก๊ทธ์๋ ํ ์ด๋ธ ์ ๋ณด์ ์ค์ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ S3 ๊ฒฝ๋ก๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ๋๋ถ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ ์ฒด ๊ฒฝ๋ก๋ฅผ ์ง์ ์ ๋ ฅํ์ง ์๊ณ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ฆ๊ณผ ํ ์ด๋ธ ์ด๋ฆ์ผ๋ก ํ ์ด๋ธ์ ์ฐพ์ ์ฟผ๋ฆฌํ ์ ์์ต๋๋ค.” - ์ถ์ฒ
Athena์์ ๋ฐ์ดํฐ ๋ถํ (partitioning)
๋ฐ์ดํฐ๋ฅผ ๋ถํ (partition)ํ์ฌ Athena ์ฟผ๋ฆฌ๊ฐ ์ค์บํ๋ ๋ฐ์ดํฐ์ ์์ ์ ํํ์ฌ ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ํฅ์ํ๊ณ ๋น์ฉ์ ์ ๊ฐํ ์ ์๋ค. Apache Hive ์คํ์ผ์ partition์ ์ฌ์ฉํ ์๋ ์๊ณ , ๋น Hive ์คํ์ผ์ ํํฐ์ ์ฒด๊ณ๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค. Apache Hive์ ํธํ๋์ง ์๋ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ Athena์์๋ ALTER TABLE ADD PARTITION์(๋ฅผ) ์ฌ์ฉํ์ฌ ํํฐ์ ์ ์๋์ผ๋ก ์ถ๊ฐํ ์ ์๋ค. (์ฐธ๊ณ : Athena์์ ๋ฐ์ดํฐ ๋ถํ )
ex) CloudTrail ๋ก๊ทธ ๋ฐ Kinesis Data Firehose ์ ์ก ์คํธ๋ฆผ: data/2023/07/19/4 ge87b2.json๊ณผ ๊ฐ์ ๋ ์ง ๋ถ๋ถ์ ๋ํด ๋ณ๋์ ๊ฒฝ๋ก ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๋ค.
ALTER TABLE {database_name}.{table_name}
ADD IF NOT EXISTS PARTITION (partition_col_name = partition_col_value [,...])
LOCATION 's3://{bucket}/{partition_location}'".format(
database_name=AuditingGlueDatabaseName,
table_name=GlueTable,
account=account,
region=region,
date=date,
bucket=bucket,
partition_location=partition_location
);
*Athena์์ ์ฌ์ฉํ ํํฐ์ ์ ์์น(location)๋ s3 ํ๋กํ ์ฝ์ ์ฌ์ฉํด์ผ ํ๋ค.
๐ซ Partition Projection
Partition Projection์ด๋?
Athena์์ partition projection์ ์ฌ์ฉํ์ฌ partition๋ ํ ์ด๋ธ์ ์ฟผ๋ฆฌ ์ฒ๋ฆฌ ์๋๋ฅผ ๋์ด๊ณ ํํฐ์ ๊ด๋ฆฌ๋ฅผ ์๋ํํ ์ ์๋ค. Glue Data Catalog์์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ ํ์ ์์ด Athena์์ ํ์ํ ํํฐ์ ์ ๋ณด๋ฅผ ‘projection’ํ๊ฑฐ๋ ๊ฒฐ์ ํ ์ ์์ผ๋ฏ๋ก ์ฟผ๋ฆฌ ์คํ ์๊ฐ์ ํฌ๊ฒ ์ค์ผ ์ ์๋ค. ํํฐ์ ํ๋ก์ ์ ์์ Athena๋ AWS Glue ํ ์ด๋ธ์ ํ ์ด๋ธ ์์ฑ์์ ํํฐ์ ๊ฐ ๋ฐ ์์น๋ฅผ ๊ณ์ฐํ๋ค.
์ ์ฉ ๋ฐฉ๋ฒ
VPC Flowlogs๊ฐ ๊ธฐ์กด S3์ ๋ก๊น ๋๊ณ ์๋ค. ์ด flowlogs ๋ฐ์ดํฐ๋ฅผ Athena์์ ํจ์จ์ ์ผ๋ก ์ฟผ๋ฆฌํ ์ ์๋๋ก partition projection์ ์ ์ฉํด๋ณด์.
VPC Flowlogs๊ฐ ์ ์ฅ๋๋ S3 ๋ฒํท์ Data Store๋ก Glue table์ ์์ฑํ๋ค. Schema์๋ ์ค์ ๋ก ๋ฐ์ดํฐ ์์ฑ ์ด๋ฆ๊ณผ data type์ ์ง์ ํ๋ค. VPC Flowlogs ๊ธฐ๋ณธ ์ค์ ์ ๊ฒฝ์ฐ ํ๊ธฐ์ ๊ฐ์ ๊ฐ๋ค์ด ๋ฐ์ดํฐ์ ํฌํจ๋๊ณ ์ด ์์์ ๋ฐ๋ผ Schema๋ฅผ ์ง์ ํ๋ฉด ๋๋ค.
${version} ${account-id} ${interface-id} ${srcaddr} ${dstaddr} ${srcport} ${dstport} ${protocol} ${packets} ${bytes} ${start} ${end} ${action} ${log-status}
Glue Table์ advanced properties๋ฅผ ์๋์ ๊ฐ์ด ์ ์ฉํ๋ค.
FlowLogsTable:
Properties:
CatalogId: !Ref AWS::AccountId
DatabaseName: !Ref AuditingGlueDatabase
TableInput:
Description: !Sub
- "FlowLogs table for ${S3BucketName} bucket"
- S3BucketName: !Ref FlowLogsBucketName
Name: !Ref FlowLogsTableName
StorageDescriptor:
Columns:
- Name: version
Type: int
- Name: sourceaccount
Type: string
- Name: interfaceid
Type: string
- Name: sourceaddress
Type: string
- Name: destinationaddress
Type: string
- Name: sourceport
Type: int
- Name: destinationport
Type: int
- Name: protocol
Type: bigint
- Name: numpackets
Type: bigint
- Name: numbytes
Type: bigint
- Name: starttime
Type: bigint
- Name: endtime
Type: bigint
- Name: action
Type: string
- Name: logstatus
Type: string
InputFormat: org.apache.hadoop.mapred.TextInputFormat
OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
SerdeInfo:
SerializationLibrary: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
Parameters:
field.delim: " "
serialization.format: " "
Location: !Sub
- "s3://${S3BucketName}/"
- S3BucketName: !Ref FlowLogsBucketName
# NumberOfBuckets: -1
PartitionKeys:
- Name: account
Type: string
- Name: region
Type: string
- Name: date
Type: string
Parameters:
EXTERNAL: "TRUE"
skip.header.line.count: "1"
projection.enabled: true
projection.account.type: enum
projection.account.values: account-1, account-2, account-3
projection.region.type: enum
projection.region.values: us-east-1,us-east-2,us-west-1,us-west-2,ap-south-1,ap-northeast-1,ap-northeast-2,ap-northeast-3,ap-southeast-1,ap-southeast-2,ca-central-1,eu-central-1,eu-west-1,eu-west-2,eu-west-3,eu-north-1,sa-east-1
projection.date.type: date
projection.date.format: yyyy/MM/dd
projection.date.range: 2023/05/31,NOW
projection.date.interval: 1
projection.date.interval.unit: DAYS
storage.location.template: "s3://VPCFlowLogs-S3-bucket-name/AWSLogs/${account}/vpcflowlogs/${region}/${date}/"
TableType: EXTERNAL_TABLE
Type: AWS::Glue::Table
ํ์๋ ์์ ๊ฐ์ด CloudFormation์ผ๋ก ๋ฐฐํฌํ์ฌ ์๋์ ๊ฐ์ด ์ ์ฉ๋์๋ค.
S3 ๊ฐ์ฒด ๊ฒฝ๋ก ์ค region, account, date์ projection์ ํ๊ณ ๊ฐ type๊ณผ ๋ค์ด์ฌ ์ ์๋ ๊ฐ, ํ์์ ๋ช ์ํด์ฃผ๋ฉด ์์ฝ๊ฒ ํํฐ์ ๋์ด ์๋ํ๋๋ค.
ํํฐ์ ๋ ์๋ํ ์๋ฃ ~!
- AWS Docs: Athena์์ ๋ฐ์ดํฐ ๋ถํ
- AWS Docs: Amazon Athena๋ฅผ ์ฌ์ฉํ ํํฐ์ ํ๋ก์ ์
- AWS Docs: ํํฐ์ ํ๋ก์ ์ ์ ์ฌ์ฉํ์ฌ Amazon VPC ํ๋ฆ ๋ก๊ทธ์ ๋ํ ํ ์ด๋ธ ์์ฑ ๋ฐ ์ฟผ๋ฆฌ
- ๊ธฐ์ ๋ธ๋ก๊ทธ: AWS ATHENA ๋ก VPC FLOW LOG ๋ถ์ํ๊ธฐ – 1
- ๊ธฐ์ ๋ธ๋ก๊ทธ: AWS ATHENA ๋ก VPC FLOW LOG ๋ถ์ํ๊ธฐ – 2
- ๊ธฐ์ ๋ธ๋ก๊ทธ: [AWS] ๐ Athena - Partition Projection ํํฐ์ ๋ ์๋ํ ํ๊ธฐ
- AWS Docs: CloudFormation User Guide - AWS::Glue::Table StorageDescriptor
- AWS Docs: Amazon Athena๋ ๋ฌด์์ธ๊ฐ์?