AWS re:Postを使用することにより、以下に同意したことになります AWS re:Post 利用規約

パーティションプロジェクションを使用して 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 wは、CloudTrail テーブルを作成する Amazon S3 バケットの名前に置き換えます。
  • doc_example_orgID は、組織 ID と置き換えます。
  • 11112222333344445555666677778888 は、CloudTrail テーブルを作成するアカウントのアカウント ID に置き換えます。
  • us-east-1us-east-2us-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 バケットの名前に置き換えます。
  • ユースケースに基づく制限条件。

タイムアウトの問題が発生した場合は、Athena を使用して CloudTrail データをクエリするときに発生するタイムアウトの問題をトラブルシューティングするにはどうすればよいですか?を参照してください。

詳細については、AWS CloudTrail ログのクエリAmazon Athena でパーティションテーブルを作成して使用するにはどうすればよいですか? を参照してください。

関連情報

How do I resolve the partition projection error "INVALID_TABLE_PROPERTY" when I query a table in Athena?

Athena のトラブルシューティング

AWS公式
AWS公式更新しました 10ヶ月前
コメントはありません