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 テーブルを作成するリージョンに置き換えます。
  • ユースケースに基づくテーブルの属性とプロパティ
  • ユースケースに基づく射影範囲 (例えば、2018 年以降の CloudTrail データのみが利用可能な場合は、パーティション列の [year] (年) の射影範囲を '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-2、および us-west-2 は、CloudTrail テーブルを作成するリージョンに置き換えます。
  • ユースケースに基づくテーブルの属性とプロパティ
  • ユースケースに基づく射影範囲 (例えば、2018 年以降の CloudTrail データのみが利用可能な場合は、パーティション列の [year] (年) の射影範囲を '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 バケットの名前に置き換えます。
  • ユースケースに基づく制約条件

上記の手順を実行した後でもタイムアウトの問題が発生する場合は、サービスクォータの引き上げをリクエストできます。


関連情報

AWS CloudTrail ログのクエリ

AWS公式
AWS公式更新しました 3年前
コメントはありません