Athenaのクエリの実行履歴を、実行ユーザと紐付ける方法です。
CloudTrailからAthenaの実行イベントを取得
こちらのコマンドを利用します。
lookup-events — AWS CLI 1.16.96 Command Reference
EventSource=athena.amazonaws.com
EventName=StartQueryExecution
で検索かけてます。--start-time
はUNIXタイムスタンプ入れます。今回は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 }
参考
www.slideshare.net