파티션 프로젝션을 사용해 Athena 쿼리용 CloudTrail 테이블을 생성하려면 어떻게 해야 하나요?

4분 분량
0

Amazon Athena를 사용해 AWS CloudTrail 데이터를 쿼리할 때 시간이 오래 걸리거나 시간 제한이 초과됩니다.

해결 방법

런타임 쿼리를 줄이기 위해 CloudTrail 테이블을 분할하더라도 시간이 지나면 CloudTrail 로그 크기가 커질 수 있습니다. 분할이 많이 된 테이블의 경우 쿼리 계획 시간이 오래 걸리고 쿼리 완료도 느립니다.

시간 제한 문제를 해결하려면 파티션 프로젝션을 사용해 CloudTrail 테이블을 수동으로 생성하세요. 그러면 Athena에서 CloudTrail 테이블 값을 동적으로 계산하고 쿼리 런타임을 줄일 수 있습니다. 파티션 프로젝션을 사용하면 파티션 값과 위치가 구성에서 계산되므로 파티션을 관리할 필요가 없습니다.

파티션 프로젝션을 사용해 타임스탬프로 분할된 CloudTrail 테이블을 생성하려면 Anthena에서 파티션 프로젝트를 사용해 CloudTrail 로그용 테이블 생성을 참고하세요.

파티션 프로젝션으로 연도, 월, 일별로 분할된 CloudTrail 테이블을 여러 계정에서 만들려면 다음과 같은 명령을 사용하세요.

CREATE EXTERNAL TABLE ctrail_pp_ymd (eventversion STRING,
useridentity STRUCT<
               type:STRING,
               principalid:STRING,
               arn:STRING,
               accountid:STRING,
               invokedby:STRING,
               accesskeyid:STRING,
               userName:STRING,
sessioncontext:STRUCT<
attributes:STRUCT<
               mfaauthenticated:STRING,
               creationdate:STRING>,
sessionissuer:STRUCT<
               type:STRING,
               principalId:STRING,
               arn:STRING,
               accountId:STRING,
               userName:STRING>>>,
eventtime STRING,
eventsource STRING,
eventname STRING,
awsregion STRING,
sourceipaddress STRING,
useragent STRING,
errorcode STRING,
errormessage STRING,
requestparameters STRING,
responseelements STRING,
additionaleventdata STRING,
requestid STRING,
eventid STRING,
resources ARRAY<STRUCT<
               ARN:STRING,
               accountId:STRING,
               type:STRING>>,
eventtype STRING,
apiversion STRING,
readonly STRING,
recipientaccountid STRING,
serviceeventdetails STRING,
sharedeventid STRING,
vpcendpointid STRING
)
PARTITIONED BY (account string, region string, year string, month string, day string)
ROW FORMAT SERDE
  'com.amazon.emr.hive.serde.CloudTrailSerde'
STORED AS INPUTFORMAT
  'com.amazon.emr.cloudtrail.CloudTrailInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://doc_example_bucket/AWSLogs/'
TBLPROPERTIES (
  'projection.enabled'='true',
  'projection.day.type'='integer',
  'projection.day.range'='01,31',
  'projection.day.digits'='2',
  'projection.month.type'='integer',
  'projection.month.range'='01,12',
  'projection.month.digits'='2',
  'projection.region.type'='enum',
  'projection.region.values'='us-east-1,us-east-2,us-west-2',
  'projection.year.type'='integer',
  'projection.year.range'='2015,2021',
  'projection.account.type'='enum',
  'projection.account.values'='111122223334444,5555666677778888',  
  'storage.location.template'='s3://doc_example_bucket/AWSLogs/${account}/CloudTrail/${region}/${year}/${month}/${day}'
)

위 쿼리에서 다음 변수를 바꿔야 합니다.

  • ctrail_pp_ymd를 CloudTrail 테이블 이름으로 바꾸세요.
  • doc_example_bucket을 CloudTrail 테이블을 생성하고 싶은 Amazon Simple Storage Service(Amazon S3) 버킷 이름으로 바꾸세요.
  • 1111222233334444와 ** 5555666677778888**을 CloudTrail 테이블을 만들려는 계정의 계정 ID로 바꾸세요.
  • us-east-1,us-east-2,us-west-2를 CloudTrail 테이블을 만들려는 AWS 리전으로 바꾸세요.
  • 내 사용 사례에 맞는 테이블 속성과 값으로 바꾸세요.
  • 내 사용 사례에 맞는 프로젝션 범위로 바꾸세요. 예를 들어 2018년도부터 사용할 수 있는 CloudTrail 데이터의 경우 파티션 연도 열의 프로젝션 범위를 **'2018,2021'**로 바꾸면 됩니다.

같은 조직의 여러 계정에 CloudTrail 테이블을 생성하려면 다음과 같은 명령을 사용하세요.

CREATE EXTERNAL TABLE ctrail_pp_ymd_org (eventversion STRING,
useridentity STRUCT<
               type:STRING,
               principalid:STRING,
               arn:STRING,
               accountid:STRING,
               invokedby:STRING,
               accesskeyid:STRING,
               userName:STRING,
sessioncontext:STRUCT<
attributes:STRUCT<
               mfaauthenticated:STRING,
               creationdate:STRING>,
sessionissuer:STRUCT<
               type:STRING,
               principalId:STRING,
               arn:STRING,
               accountId:STRING,
               userName:STRING>>>,
eventtime STRING,
eventsource STRING,
eventname STRING,
awsregion STRING,
sourceipaddress STRING,
useragent STRING,
errorcode STRING,
errormessage STRING,
requestparameters STRING,
responseelements STRING,
additionaleventdata STRING,
requestid STRING,
eventid STRING,
resources ARRAY<STRUCT<
               ARN:STRING,
               accountId:STRING,
               type:STRING>>,
eventtype STRING,
apiversion STRING,
readonly STRING,
recipientaccountid STRING,
serviceeventdetails STRING,
sharedeventid STRING,
vpcendpointid STRING
)
PARTITIONED BY (account string, region string, year string, month string, day string)
ROW FORMAT SERDE
  'com.amazon.emr.hive.serde.CloudTrailSerde'
STORED AS INPUTFORMAT
  'com.amazon.emr.cloudtrail.CloudTrailInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://doc_example_bucket/AWSLogs/doc_example_orgID/'
TBLPROPERTIES (
  'projection.enabled'='true',
  'projection.day.type'='integer',
  'projection.day.range'='01,31',
  'projection.day.digits'='2',
  'projection.month.type'='integer',
  'projection.month.range'='01,12',
  'projection.month.digits'='2',
  'projection.region.type'='enum',
  'projection.region.values'='us-east-1,us-east-2,us-west-2',
  'projection.year.type'='integer',
  'projection.year.range'='2010,2100',
  'projection.account.type'='enum',
  'projection.account.values'='111122223334444,5555666677778888',  
  'storage.location.template'='s3://doc_example_bucket/AWSLogs/doc_example_orgID/${account}/CloudTrail/${region}/${year}/${month}/${day}'
)

참고: 2010년 이전 CloudTrail 데이터를 쿼리해야 하는 경우 rojection.year.range 속성에서 연도 범위를 업데이트해야 합니다.

위 쿼리에서 다음 변수를 바꿔야 합니다.

  • ctrail_pp_ymd_org을 CloudTrail 테이블 이름으로 바꾸세요.
  • doc_example_bucket을 CloudTrail 테이블을 생성하려는 Amazon S3 버킷 이름으로 바꾸세요.
  • doc_example_orgID을 조직 ID로 바꾸세요.
  • 1111222233334444와 ** 5555666677778888**을 CloudTrail 테이블을 만들려는 계정의 계정 ID로 바꾸세요.
  • us-east-1, us-east-2, us-west-2를 CloudTrail 테이블을 만들려는 AWS 리전으로 바꾸세요.
  • 내 사용 사례에 맞는 테이블 속성과 값으로 바꾸세요.
  • 내 사용 사례에 맞는 프로젝션 범위로 바꾸세요. 예를 들어 2018년도부터 사용할 수 있는 CloudTrail 데이터의 경우 파티션 연도 열의 프로젝션 범위를 **'2018,2021'**로 바꾸면 됩니다.

쿼리를 실행할 때는 쿼리의 파티션 열에 제한 조건을 포함해야 합니다. 그러면 Athena에서 스캔하는 데이터 규모가 적어지고 쿼리 처리 시간을 줄일 수 있습니다.

예를 들어 S3 버킷에 GetObject 요청을 한 작업자를 보려면 다음과 같은 명령을 실행할 수 있습니다. 이 쿼리 테이블은 년, 월, 일 파티션 형식을 사용합니다.

참고: CloudTrail에 Amazon S3 이벤트 로깅을 활성화되어 있는지 확인하세요.

SELECT useridentity.arn, eventtime  FROM "ctrail_pp_ymd"where eventname = 'GetObject'
and year = '2021'
and month = '05'
and region = 'us-east-1'
and cast(json_extract(requestparameters, '$.bucketName')as varchar) ='doc_example_bucket'

위 쿼리에서 다음 변수를 바꿔야 합니다.

  • ctrail_pp_ymd를 CloudTrail 테이블 이름으로 바꾸세요.
  • doc_example_bucket을 CloudTrail 테이블을 생성하려는 S3 버킷 이름으로 바꾸세요.
  • 사용 사례에 따른 제한 조건

시간 제한 문제가 발생하면 Athena를 사용해 CloudTrail 데이터를 쿼리할 때 발생하는 시간 제한 문제를 어떻게 해결하나요?를 참고하세요.

자세한 내용은 AWS CloudTrail 로그 쿼리Athena에서 분할된 테이블을 생성하고 사용하려면 어떻게 해야 하나요?를 참고하세요.

관련 정보

Athena에서 테이블을 쿼리할 때 나타나는 파티션 프로젝션 오류 "INVALID_TABLE_PROPERTY"를 해결하려면 어떻게 해야 하나요?

Athena 문제 해결

AWS 공식
AWS 공식업데이트됨 8달 전