AWS Athenaのユーザごとのクエリ実行履歴を分析するためのデータをAWS CLIで収集

Athenaのクエリの実行履歴を、実行ユーザと紐付ける方法です。

CloudTrailからAthenaの実行イベントを取得

こちらのコマンドを利用します。

lookup-events — AWS CLI 1.16.96 Command Reference

  • EventSource=athena.amazonaws.com EventName=StartQueryExecution で検索かけてます。

  • --start-timeUNIXタイムスタンプ入れます。今回は date +%s --date "1 day ago" で一日前からのクエリを指定。

  • 結果は CloudTrailEvent というキーにJSONが入っているので --output text として jq に流すとキレイに取れます
  • ユーザ名として .userIdentity.arn と Athenaのクエリ履歴と紐付けるIDとして .responseElements.queryExecutionId を取得します
$ aws cloudtrail lookup-events --lookup-attributes "AttributeKey=EventSource,AttributeValue=athena.amazonaws.com,AttributeKey=EventName,AttributeValue=StartQueryExecution" --start-time "$(date +%s --date "1 day ago")" --query "Events[].CloudTrailEvent" --output text | jq
{  "eventVersion": "1.06",  
   "userIdentity": 
     {    "type": "IAMUser",
省略

Athena実行履歴とqueryExecutionIdで紐づけ

取得した queryExecutionId を利用して以下のコマンドを呼び出します。

これでユーザとクエリの実行時間、取得データサイズなどを紐付けられます。

get-query-execution — AWS CLI 1.16.96 Command Reference

$ aws athena get-query-execution --query-execution-id $queryId

ワンライナー

Bashで一発で紐付けるワンライナー置いておきます。が・・適当に組んだので、まぁ普通にスクリプト組んだほうが良いと思います。

$ aws cloudtrail lookup-events --lookup-attributes "AttributeKey=EventSource,AttributeValue=athena.amazonaws.com,AttributeKey=EventName,AttributeValue=StartQueryExecution" --start-time "$(date +%s --date "1 day ago")" --query "Events[].CloudTrailEvent" --output text | jq -r '[.userIdentity.arn,.responseElements.queryExecutionId] | @csv'|sed s/\"//g | while IFS=, read arn queryId;do aws athena get-query-execution --query-execution-id $queryId --query "QueryExecution | {User:\`$arn\`,QueryExecutionId:QueryExecutionId,SubmissionDateTime:Status.SubmissionDateTime,DataBase:QueryExecutionContext.Database,Query:Query,State:Status.State,ExecutionTimeInMillis:Statistics.EngineExecutionTimeInMillis,DataScannedInBytes:Statistics.DataScannedInBytes}";done
{
  "User": "arn:aws:iam::123456789012:user/otomoy",
  "QueryExecutionId": "d05a7336-6abd-43bb-8b39-820a35c4af60",
  "SubmissionDateTime": 1549081964.277,
  "DataBase": "elblogsample",
  "Query": "SELECT * FROM \"elblogsample\".\"elb_parquet\" limit 10",
  "State": "SUCCEEDED",
  "ExecutionTimeInMillis": 8114,
  "DataScannedInBytes": 18182307
}
{
  "User": "arn:aws:iam::123456789012:user/otomoy",
  "QueryExecutionId": "0918bc7f-72d6-4898-8034-b09edcff5cbf",
  "SubmissionDateTime": 1549077950.785,
  "DataBase": "elblogsample",
  "Query": "SELECT * FROM \"elblogsample\".\"elb_parquet\" limit 10",
  "State": "SUCCEEDED",
  "ExecutionTimeInMillis": 7819,
  "DataScannedInBytes": 5009027
}

参考

docs.aws.amazon.com

www.slideshare.net