如何使用分區投射來為 Athena 查詢建立 CloudTrail 表格?

3 分的閱讀內容
0

當我使用 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) 儲存貯體的名稱。
  • 11112222333344445555666677778888 取代為您要為其建立 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。
  • 11112222333344445555666677778888 取代為您要為其建立 CloudTrail 表格的帳戶 ID
  • us-east-1us-east-2us-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 中建立和使用分區表格?

相關資訊

當我查詢 Athena 中的表格時,如何解決分區投射錯誤 "INVALID_TABLE_PROPERTY"?

在 Athena 中進行疑難排解

AWS 官方
AWS 官方已更新 8 個月前