【AWS_45】AWS CloudTrailを試してみる

AWS CloudTrailは、AWSアカウント内で実施されたほぼすべてのAPIリクエストとその結果を記録します。
マネジメントコンソール、CLI、SDKなどからの操作はAPIリクエストによるため、それらが記録(ログ)として残ります。
ログには、誰が、いつ、どこから、何に、何を要求して、どうなったかなどが記録されます。
CloudTrailを利用することで、「ユーザーの不正操作」や「システムの異常な動作」のトラブルシューティングに役立つとあります。
いろいろ記事を見ていると本番でも利用する機会が多いと感じました。少しでも見方に慣れておいたほうがよいと感じたので勉強したいと思います。
目次
イベント履歴を確認する
過去90日間に実行されたAPIの呼び出し内容を確認することができます。
この機能はデフォルトで有効になっており、確認のために料金は発生しません。
以下は参考にさせていただいたサイトです。その中でエラーコードの確認、調査範囲を絞る、JSONのダウンロードはよく使うとありましたので、その3点について検証してみました。
CloudTrail での個人的な調査方法 3 つ
https://zenn.dev/mn87/articles/b883d98a392472
AWSマネジメントコンソールで「cloudtrail」を検索します。
左ペインのイベント履歴をクリックすると画面中央に「イベント履歴」が表示されます。

「ルックアップ属性」を展開するといろいろな条件でフィルタできるようになっています。検証で「リソースタイプ」を選択してみます。

「リソースタイプ」選択後、その右側の検索ウィンドウで「AWS::S3::Bucket」を選択してみました。
おそらくS3バケットに対する操作記録が表示されていると思います。

エラーコードを確認する
CloudTrail ではデフォルトではエラーコードを表示する設定になっていないので、設定でエラーコードを表示します。
「イベント履歴」画面の右上にある設定アイコン(歯車)をクリックします。

「プリファレンス」ウィンドウで「エラーコード」をオンにして「確認」をクリックします。

「イベント履歴」画面に「エラーコード」の列が追加されました。
イベント名の左端にチェックを入れると画面下に詳細が表示されます。
イベント名、イベントソース、エラーコードより「EC2インスタンスの終了操作が許可されていないユーザーで終了操作を行った可能性がある」ことが推測されます。

調査範囲を絞る
CloudTrailのデフォルトでは、「読み取り専用」というフィルター名で、値が「false」になっています。
これは、読み取り専用ではないイベント、つまり書き込みイベントを表示しているという意味になります。

逆に、「読み取り専用」が「true」だと、読み取り専用イベントを表示しているという意味になります。
どのイベントが読み取り専用なのかどうかは、AWS 公式ドキュメントに記載されているそうですが、現時点ではあまり見方が理解できておりません・・・
AWS サービスのアクション、リソース、および条件キー
https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/reference_policies_actions-resources-contextkeys.html
参考サイトには、「読み取り専用かどうか以外にも、よく使うフィルターとしては、「イベント名」、「イベントソース」、「リソース名」があります。」とあります。

以下のような内容でAWS公式ドキュメント(AWS サービスのアクション、リソース、および条件キー)を駆使して調べていくようです。
1.イベント名が絞れていれば AWS 公式ドキュメントも確認しつつ、イベント名でエラーの有無を調べる。
2.イベント名が分からない場合には、イベントソースを選択し、広い範囲から調べていく。
3.リソース名が分かっているときにはリソース名から調べ始める。
また、日付でのフィルターも可能です。「相対範囲」、「絶対範囲」の2種類があります。
・相対範囲: 現在時刻を基準にした時間範囲
・絶対時間: 特定の日付の時間範囲


JSON でダウンロードして確認する
イベントや日付を絞っても、コンソールで確認することが大変な場合もあります。
そんな時には、「イベントをダウンロード」から「JSON 形式でダウンロード」を選択します。

「event_history.json」ファイルとしてダウンロードされました。

「event_history.json」ファイルをテキストエディタで開くと一行の文字の羅列で見にくかったので「JSON Editor Online」に貼り付けて成型すると見やすくなりました。
ログの中身を検索すると今回記事に挙げているログは、以下が該当するかと思います。

CloudTrail Lakeを検証する
イベントデータストアに取り込まれるデータ量、データの保持期間、データに対してクエリを実行した際のスキャンしたデータ量によって料金が発生するので注意してください。
ただし、AWS公式サイトには以下のような情報もありましたので新規利用で30日以内、無料使用量の範囲内であれば無料の可能性もあります。
新規のお客様の場合は、CloudTrail Lake を 30 日間追加費用なしでお試しいただけます。この期間中、お客様はすべての機能セットをご利用いただけます。30 日間の無料トライアル期間中は、以下の制限があります。
30 日が経過するか、無料使用量の上限に達するか、いずれか早いほうの時点で無料トライアルは終了となります。
・最大 5 GB のデータを取り込み
・最大 5 GB のデータをスキャン
・追加費用なしでデータを保持
この機能はデフォルトでは利用できません。イベントデータストアを作成して対象イベントを選択することでS3バケットやAthenaの構築、管理は必要なくSQLクエリが利用できるようになります。
以下が参考にさせていただいたサイトです。
AWS CloudTrail Lakeを触ってみた
https://qiita.com/ozakir-intellilink/items/0d339dc41a674661c1e5
イベントデータストアの作成
AWSマネジメントコンソールで「cloudtrail」を検索します。
左ペインのLakeをクリックし、画面中央の「イベントデータストアを作成」をクリックします。

「イベントデータストアの設定」画面で以下を設定します。
イベントデータストア名: 任意の名前
料金オプション: 「1年間の延長可能な保持料金」を選択しました
保存期間: 「カスタム期間」で「7日」としました(1日にするとエラーになりました)
暗号化: デフォルトのままアンチェックとしました

Lakeクエリーフェデレーション、リソースポリシー、タグは、デフォルト設定のまま「次へ」をクリックします。

「イベントの選択」画面で以下を選択します。
イベントタイプ:AWSイベント
※補足 「統合」は、AWS外のイベントを取り込む機能のようです。
AWS イベントのタイプ:CloudTrail イベント

今回は、「管理イベント」、「データイベント」、「イベントを取り込む」へチェックを入れます。
・CloudTrail イベント:管理イベント(デフォルトでチェックあり)
・データイベント(デフォルトでチェックなしだが今回はチェックを入れる)
・イベントを取り込む(デフォルトでチェックあり)

取り込むイベントの詳細設定です。今回はデフォルトのままにしておきます。

今回は以下の一つを指定します。
・データイベントタイプ:S3
・ログセレクターテンプレート:すべてのイベントをログに記録する
・セレクター名 – オプション:(空欄のまま)

イベントをエンリッチ化画面は何も設定せずに「次へ」をクリックします。

確認と作成画面で設定値を確認し、問題なければ右下の「イベントデータストアの作成」を選択します。



イベントデータストアが作成されました。

イベントデータストア名をクリックした時の表示は、以下のとおりです。

クエリを実行する
クエリを実行する前にログを確認しやすくするため、S3バケットを作成し、CSVファイルをアップロードしてみました。

AWSマネジメントコンソールで「cloudtrail」を検索します。
左ペインのLake > クエリをクリックすると、画面中央に「クエリ」画面が表示されます。
利用するクエリは「CloudTrail Lake SQL」という言語を用いるようです。
SQLクエリを実行する際に「イベントデータストアID」が必要となるためひかえておきます。

参考サイトによると「「SELECT * FROM テーブル名」は、イベントデータストア内のすべてのデータをスキャンするため、コストを抑えるため、クエリに開始および終了 eventTime タイムスタンプを追加することで、クエリを制限することをお勧めします」とありました。
参考サイトを参考に以下のSELECT文で検索したいと思います。乱数は、イベントデータストアIDとなります。
※時刻はUniversal time coordinated(協定世界時)表示のため、クエリする時は意識しておく必要があります。
SELECT * FROM 24ee0015-90f8-4a9b-9293-ac6cd3d774eb WHERE eventtime >=’2025-08-21 02:15:00′ ;
SELECT文を入力し、「Run」をクリックして実行します。

クエリ結果には、S3バケットやCloudtrailに関する情報が出力されていることがわかります。

検証後のリソースの削除
簡単にですが、作成したリソースの削除について記載します。
S3バケット
・ファイルの削除
・バケットの削除
CloudTrail
・イベントデータストア > アクション > 取り込みを停止
・イベントデータストア > アクション > 終了保護の変更 > 無効
・イベントデータストア > アクション > 削除
※イベントデータストアの削除について(AWS公式より)
イベントデータストアを削除すると、イベントデータストアのステータスは PENDING_DELETION に変化し、7 日間その状態が続きます。PENDING_DELETION 状態の間、料金は発生しません。
まとめ
今回は、CloudTrailのイベント履歴とCloudTrail Lake の使い方を検証してみました。使い方もそうですが、表示される項目の意味を理解していかないとCloudTrailを見ても意味がわからないなと思いました。AWS公式ドキュメントの見方も慣れていく必要がありそうです。
証跡については、また後日検証してみたいと思います。
以下、他の記事をまとめた一覧です。AWSもまとめています。