[メモ]AWS CloudTrailログをS3バケットに転送し、一定期間経過したログはS3ストレージクラスを移行する
前提
AWS CloudTrailのイベントログは90日で削除されます。AWSを利用するプロジェクトの仕様 (セキュリティ規約への準拠など) により、CloudTrailのログを数年単位で保持しなければならない場合があります。CloudTrailのログを90日以上保存する方法の1つは、Amazon S3バケットに保存することです。
またAmazon S3には複数のストレージクラスが存在します。長期間大量のログを管理するためコストもそれなりにかかります。そこで適切なストレージクラスにオブジェクトを移行し、コスト適正化を考える必要があります。S3にはライフサイクルという機能があり、設定したルールに従いオブジェクトをストレージクラスに自動的に移行できます。
CloudTrailログをS3バケットに保存する
CloudTrailログをS3バケットに保存するには「証跡」という機能を利用します。
証跡にはマルチリージョンと単一リージョンの2種類が存在します。デフォルト及び推奨はマルチリージョン、AWS CLIから作成すると単一リージョンになります。
ここではAWSマネジメントコンソールからCloudTrailメニューに移動し、「証跡」→「証跡の作成」を選択します。

作成画面から必要な情報を入力します。
-
証跡属性の選択
証跡名-
ストレージの場所: 新規/既存のS3バケットを指定します。- 新規作成時は
aws-cloudtrail-logs-<AWSアカウント>-<文字列>というバケット名 - 保存場所は
aws-cloudtrail-logs-<AWSアカウント>-<文字列>/AWSLogs/<AWSアカウント>
- 新規作成時は
-
ログファイルのSSE-KMS有効化: ログファイル保存時の暗号化を SSE-S3 / SSE-KMSから選択。デフォルトではSSE-KMSが選択されている。-
カスタマー管理のAWS KMSキー: 新規/既存のCMKを選択
-
-
その他の設定-
ログファイルの検証: CloudTrailが配信後にログファイルの変更・削除がないかを判断するため、ログファイルの整合性の検証を行います。 -
SNS通知の配信: S3バケットにログファイルが配信されるたびにSNSに通知します。
-
-
CloudWatch Logs - オプション: ログをCloudWatchに転送し、特定の語句や値をメトリクスフィルターでひっかける、通知することが可能です。


-
ログイベントの選択
-
イベント: CloudTrailで取得可能なイベントのうち、AWSアカウント中のリソースのAPI履歴を記録します。-
管理イベント: AWSアカウント内のリソースに対して実行される管理操作 -
データイベント: リソース上またはリソース内で実行されたリソース操作 -
Insightsイベント: CloudTrailによって検出された、アカウントの通常の使用パターンと大きく異なる操作 -
ネットワークアクティビティイベント: VPC endpoint経由で実行されたリソース操作
-
-
管理イベント: 記録する管理イベントの種類を選択します。読み取り書き込み-
AWS KMSイベントの除外: 大容量のイベントとなることの多いKMSイベント (EncryptDecryptGenerateDataKeyなど) を除外します。 -
Amazon RDSのデータAPIイベントを除外: データAPIイベントにはDB名 / Schema名 / SQLなどは含まれないため、不要な場合は除外できます。
-
データイベント: 記録するデータイベントを選択します。-
データイベントタイプ: 記録するリソースタイプを選択します。 -
ログセレクターテンプレート: 取得するイベントの条件を、テンプレート or カスタマイズから選択します。
-
-
Insightsイベント: 取得するイベントの種類を選択します。-
APIコールレート: ある基準値に対して1分あたりに発生する書き込み専用管理APIの呼び出し回数の測定値。 -
APIエラー率: エラーコードを生成する管理API呼び出し回数の測定値。
-
-
ネットワークアクティビティイベント: 記録するイベントを選択します。-
ネットワークアクティビティのイベントソース: 記録するリソースタイプを選択します。 -
ログセレクターテンプレート: 取得するイベントの条件を、テンプレート or カスタマイズから選択します。
-
-



証跡を作成すると以下のように表示されます。


S3バケットに移動すると以下のようにログが保存されることを確認できます。
- CloudTrail: 記録したCloudTrailログを格納します。
- ファイル構成:
<バケット>/AWSLogs/<AWSアカウント>/CloudTrail/<Region>/<年>/<月>/<日>/<ファイル> - ファイル名:
<AWSアカウント>_CloudTrail_<Region>_<timestamp>_<文字列>.json.gz
- ファイル構成:
- CloudTrail-Digest: ログファイルの整合性を検証するためのファイルが配置されます。
- ファイル構成:
<バケット>/AWSLogs/<AWSアカウント>/CloudTrail-Digest/<Region>/<年>/<月>/<日>/<ファイル> - ファイル名:
<AWSアカウント>_CloudTrail-Digest_<Region>_<証跡名>_<Region>_<timestamp>.json.gz
- ファイル構成:

S3ストレージクラスを移行する
S3バケットに配置されたオブジェクトを別のストレージクラスに移行するため、ライフサイクルを設定します。なお移行できるストレージクラスには制限があります。
ライフサイクルの作成はS3バケット画面の 管理 から行います。

作成画面から必要な値を設定します。
ライフサイクルルール名-
ルールスコープを選択: 一部のオブジェクトか、全てのオブジェクトに適用するか選択します。-
フィルタータイプ-
プレフィックス: ルールの適用範囲をバケット内のフォルダ名やオブジェクト名などで指定します。 -
オブジェクトタグ: ルールの適用範囲をオブジェクトに付与されたタグに指定します。 -
オブジェクトサイズ: ルールの適用範囲をオブジェクトサイズで指定します。最小オブジェクトサイズを指定最大オブジェクトサイズを指定
-
-
-
ライフサイクルルールのアクション現行バージョンのオブジェクトをストレージクラス間で移行する非現行バージョンのオブジェクトをストレージクラス間で移行するオブジェクトの現行バージョンを有効期限切れにするオブジェクトの非現行バージョンを完全に削除有効期限切れのオブジェクト削除マーカーまたは不完全なマルチパートアップロードを削除


ここでは以下のように設定しました。
-
ライフサイクルルール名: test_20250102 -
ルールスコープを選択-
フィルタータイプ-
プレフィックス: AWSLogs/ -
オブジェクトサイズ-
最小オブジェクトサイズを指定: 10 KB
-
-
-
-
ライフサイクルルールのアクション-
現行バージョンのオブジェクトをストレージクラス間で移行する- ストレージクラスの移行を選択: Intelligent-Tiering
- オブジェクト作成後の日数: 1
-



数日するとストレージクラスの移行を確認できました。

ログの整合性チェック
CloudTrailのログの整合性は以下のようにAWS CLIから確認できます。
[cloudshell-user@ip-10-130-52-207 ~]$ aws cloudtrail validate-logs --trail-arn arn:aws:cloudtrail:ap-northeast-1:<AWSアカウント>:trail/test_20250102 --start-time 20250101T00:00:00Z
Validating log files for trail arn:aws:cloudtrail:ap-northeast-1:<AWSアカウント>:trail/test_20250102 between 2025-01-01T00:00:00Z and 2025-01-02T02:32:26Z
Results requested for 2025-01-01T00:00:00Z to 2025-01-02T02:32:26Z
Results found for 2025-01-02T01:02:02Z to 2025-01-02T02:02:02Z:
1/1 digest files valid
[cloudshell-user@ip-10-130-52-207 ~]$
Discussion