目次
1.Athenaとは
S3に保存したデータを、SQLで検索・集計するサービスです。
EC2などの検索用サーバーを用意する必要はありません。
CloudTrailのログをS3に置いたまま調査できます。
一般的な従量課金のSQLクエリでは、読み取ったデータ量に応じて料金が発生します。
検索結果を保存するS3の料金などは別途発生します。
2.データソース・テーブル・ワークグループ
| 要素 | 役割 |
|---|---|
| S3 | CloudTrailのログ本体を保存する場所 |
| AwsDataCatalog | 標準のデータカタログ。実体はAWS Glue Data Catalogで、テーブルなどの定義を管理 |
| データベース | テーブルをまとめる入れ物。例:default |
| 外部テーブル | S3の場所・列・形式など、ログの読み方を定義 |
| ビュー | テーブルを検索するSQL文を保存したもの |
| ワークグループ | 実行履歴、結果の保存先、暗号化、クエリのスキャン量上限などを管理する単位 |
ワークグループはテーブルの入れ物ではありません。権限があれば、同じテーブルを複数のワークグループから検索できます。
3.CloudTrailを検索する準備
- CloudTrailの証跡でログの保存先S3を確認する。
- CloudTrailの「イベント履歴」から「Athenaテーブルを作成」を選び、保存先を指定する。
- Athenaのクエリエディタで、データソース「AwsDataCatalog」と対象データベースを選ぶ。
- 結果保存用のS3と、必要な読み書き権限を設定する。
- SQLを実行する。
イベント履歴に表示されるだけでは、この外部テーブル方式では検索できません。S3に配信済みのログが必要です。
4.SQLの検索例
テーブル名・日時・IPアドレスを実際の値に変更してください。
SELECT eventtime, eventsource, eventname,
useridentity.arn, sourceipaddress, errorcode
FROM cloudtrail_logs
WHERE sourceipaddress = '203.0.113.10'
AND eventtime >= '2026-10-29T00:00:00Z'
AND eventtime < '2026-10-30T00:00:00Z'
ORDER BY eventtime DESC
LIMIT 100;
| 用語 | 正式名称 |
|---|---|
| eventtime | 操作日時(UTC) |
| eventsource | AWSサービス。例:ec2.amazonaws.com |
| eventname | 操作名。例:RunInstances |
| useridentity.arn | 操作したユーザー・ロールなどのARN |
| sourceipaddress | 接続元IPアドレス、またはサービス名など |
| errorcode | 失敗した場合のエラーコード |
CloudTrailから作成したテーブルでは、eventtimeは通常string型です。
CloudTrailの統一されたUTC形式のままなら、文字列比較で時間範囲を指定できます。
eventtime >= '2026-10-29T00:00:00Z'
AND eventtime < '2026-10-30T00:00:00Z'
5.S3の範囲を絞る・年/月/日のパーティションの例
1つのテーブルに日付とS3フォルダの対応を登録し、読むフォルダをSQLで指定します。
以下は、1アカウント・東京リージョンのCloudTrailログを検索する、必要な列だけの簡単なSQL全文です。
① パーティション付きテーブルを作成する(最初の1回)
CREATE EXTERNAL TABLE cloudtrail_logs_partitioned (
eventtime string,
eventsource string,
eventname string,
sourceipaddress string,
eventid string,
errorcode string
)
PARTITIONED BY (
year string,
month string,
day string
)
ROW FORMAT SERDE
'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS INPUTFORMAT
'com.amazon.emr.cloudtrail.CloudTrailInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 's3://example-cloudtrail-bucket/AWSLogs/123456789012/CloudTrail/ap-northeast-1/';
この例では6列のみ定義しています。useridentity.arnなど、この例で定義していない列を検索するには列定義の追加が必要です。
LOCATIONとPARTITIONED BYの意味
LOCATIONは、読み取るデータのあるS3の場所を指定するSQLの句です。単独で実行するコマンドではありません。①では東京リージョンのフォルダを指定し、②でその配下の特定の日付のフォルダを登録します。
PARTITIONED BYはyear・month・dayを区画の識別用の列として定義します。
② 検索したい日付のS3フォルダを登録する
ALTER TABLE cloudtrail_logs_partitioned
ADD IF NOT EXISTS
PARTITION (year='2026', month='10', day='29')
LOCATION 's3://example-cloudtrail-bucket/AWSLogs/123456789012/CloudTrail/ap-northeast-1/2026/10/29/';
「year=2026・month=10・day=29」の区画を、S3の「2026/10/29/」に対応付けます。S3のログのコピー・移動は行いません。
③ 登録した日付だけを検索する
SELECT eventtime, eventname, sourceipaddress
FROM cloudtrail_logs_partitioned
WHERE year='2026'
AND month='10'
AND day='29'
ORDER BY eventtime DESC
LIMIT 100;
この条件では、②で登録した29日のフォルダだけを読み取ります。year・month・dayは読み取るS3フォルダを絞り、eventtimeはログ内の操作日時を絞ります。
別の日付も調べたい場合
テーブルを作り直す必要はありません。②のSQLの日付とLOCATIONを変更して登録し、③の日付条件を変更します。登録済みの区画は次のSQLで確認できます。
SHOW PARTITIONS cloudtrail_logs_partitioned;
6.Glacierから復元したログを検索する
復元しただけでは、Athenaが検索時にスキップする場合があります。
S3 Glacier Flexible Retrieval・Deep Archiveの復元済みオブジェクトを読むには、テーブルごとに次を設定します。
ALTER TABLE cloudtrail_logs
SET TBLPROPERTIES (
'read_restored_glacier_objects' = 'true'
);
- 対象オブジェクトの復元が完了し、復元の有効期間内であること。
- ワークグループでAthenaエンジンバージョン3を使用すること。
- 通常のCloudTrail用外部テーブルなど、Hive形式のテーブルであること。
テーブルの作り直しは不要です。パーティション用テーブルを別に作った場合は、そのテーブルにも設定します。Athena自身が自動で復元するわけではありません。
7.S3にあるのに検索で見つからない場合
まず日時条件を外し、手で見つけたログのeventIDで検索します。
SELECT eventtime, eventid, "$path" AS s3_file
FROM cloudtrail_logs
WHERE eventid = '対象ログのeventID';
| 確認する点 | 内容 |
|---|---|
| Glacier | 復元完了・有効期限・read_restored_glacier_objectsの設定 |
| LOCATION | 対象ファイルがテーブルの参照先配下か |
| パーティション | 対象日が登録済みか。射影なら範囲・パステンプレートが正しいか |
| 時刻 | UTCと日本時間を混同していないか |
| 他の条件 | IPアドレスや操作名などの条件で除外されていないか |
eventID検索で見つかれば、日時や他のWHERE条件を確認します。見つからなければ、読み取り対象・復元・定義などを確認します。
関連の記事
