Athena를 사용하여 CloudTrail 데이터를 쿼리 시 시간 초과 문제를 어떻게 해결합니까?

최종 업데이트 날짜: 2021-05-26

Amazon Athena를 사용하여 AWS CloudTrail 데이터를 쿼리 시 쿼리를 실행하는 데 시간이 오래 걸리거나 초과됩니다.

해결 방법

CloudTrail 로그는 CloudTrail 테이블을 분할하여 쿼리의 실행 시간을 줄이더라도 크기가 시간에 따라 커질 수 있습니다. 고도로 분할된 테이블에 대한 쿼리는 계획 시간이 길게 소요되고 빠르게 완료되지 않습니다.

시간 초과 문제를 해결하려면 파티션 프로젝션을 사용하여 CloudTrail 테이블을 수동으로 생성할 수 있습니다. 이를 통해 Athena는 대량의 파티션 목록을 스캔하는 대신 CloudTrail 테이블의 값을 동적으로 계산할 수 있습니다. 파티션 프로젝션을 사용하면 파티션 값과 위치가 구성에서 계산되므로 파티션을 관리할 필요가 없습니다.

파티션 프로젝션을 사용하여 timestamp로 분할된 CloudTrail 테이블을 생성하려면 파티션 프로젝션을 사용하여 Athena에서 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}'
)

앞의 쿼리를 다음과 같이 수정합니다.

  • CloudTrail 테이블의 이름을 포함하는 ctrail_pp_ymd
  • CloudTrail 테이블을 생성하려는 Amazon S3(단순 스토리지 서비스) 버킷의 이름을 포함하는 doc_example_bucket
  • 다음을 포함하는 CloudTrail 테이블을 생성하려는 계정의 계정 ID를 포함하는 11112222333344445555666677778888
  • 다음을 포함하는 CloudTrail을 생성하려는 리전을 포함하는 us-east-1,us-east-2,us-west-2
  • 사용 사례에 따른 테이블 속성 및 특성
  • 사용 사례에 따른 프로젝션 범위 (예: CloudTrail 데이터를 2018년부터만 사용할 수 있다면 파티션 열 연도의 프로젝션 범위를 '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 데이터를 쿼리해야 하려면 projection.year.range 내 연도 범위를 업데이트해야 합니다.

위의 쿼리를 다음과 같이 수정합니다.

  • CloudTrail 테이블의 이름을 포함하는 ctrail_pp_ymd_org
  • CloudTrail 테이블을 생성하려는 지점의 Amazon S3 버킷을 포함하는 doc_example_bucket
  • 조직 ID를 포함하는 doc_example_orgID
  • 다음을 포함하는 CloudTrail 테이블을 생성하려는 계정의 계정 ID를 포함하는 11112222333344445555666677778888
  • CloudTrail 테이블을 생성하려는 리전을 포함하는 us-east-1, us-east-2, 및 us-west-2
  • 사용 사례에 따른 테이블 속성 및 특성
  • 사용 사례에 따른 프로젝션 범위 (예: CloudTrail 데이터를 2018년부터만 사용할 수 있다면 파티션 열 연도의 프로젝션 범위를 '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'

위의 쿼리를 다음과 같이 수정합니다.

  • CloudTrail 테이블의 이름을 포함하는 ctrail_pp_ymd
  • CloudTrail 테이블을 생성하려는 S3 버킷의 이름을 포함하는 doc_example_bucket
  • 사용 사례에 따른 제한적 조건

위의 단계를 구현한 후에도 시간 초과 문제가 발생하면 서비스 할당량 증가를 요청할 수 있습니다.


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?