如何使用分區投射來為 Athena 查詢建立 CloudTrail 表格?
當我使用 Amazon Athena 查詢 AWS CloudTrail 資料時,查詢會花費長時間來執行或發生逾時。
解決方法
CloudTrail 日誌的大小會隨著時間而增加,即使您對 CloudTrail 表格進行分割以減少查詢的執行時期。針對高度分割表格的查詢有很長的計劃時間,而且無法快速完成。
若要解決逾時問題,請使用分區投射以手動建立 CloudTrail 表格。這允許 Athena 動態計算 CloudTrail 表格的值,從而縮短查詢執行時期。使用分區投射,您不需要管理分區,因為分區值和位置是根據組態而計算。
若要依分區投射的時間戳記建立 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}' )
請務必在前面的查詢中取代下列變數:
- 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 資料,請務必更新 projection.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 表格的區域。
- 表格屬性和屬性是根據您的使用案例。
- 根據使用案例的投射範圍。例如,如果只能從 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 中建立和使用分區表格?
相關資訊
相關內容
- AWS 官方已更新 3 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 3 年前