AWS CloudTrailの証跡を個別のリージョンからすべてのリージョンに移行した後の作業まとめ

すべてのリージョンに適用される証跡へ移行後に行う既存ログのコピー、既存ログのバケット削除の方法を紹介します。なお、これらの作業は移行したから必須というものではありません。必要に応じて行ってください。
2018.10.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。サービスグループの武田です。

AWSには、AWSアカウントの操作を記録し監査を支援するAWS CloudTrailというサービスがあり、証跡を作成して有効化することで操作を記録できます。作成できる証跡は次の2種類です。

  • 作成したリージョンのみを記録する「1つのリージョンに適用される」証跡(以下、個別リージョン証跡)
  • すべてのリージョンを記録する「すべてのリージョンに適用される」証跡(以下、全リージョン証跡)

個別リージョン証跡から全リージョン証跡への移行については、過去に虎塚がエントリを書いていますので参考にしてください。

CloudTrail全リージョン有効化の詳細と個別リージョン設定からの移行

このエントリでは、全リージョン証跡へ移行後(上記エントリの手順4完了)に行う既存ログのコピー、既存ログのバケット削除の方法を紹介します。なお、これらの作業は移行したから必須というものではありません。必要に応じて行ってください。

環境

次の環境で検証しています。

$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.13.6
BuildVersion:	17G65

$ aws --version
aws-cli/1.16.34 Python/3.7.0 Darwin/17.7.0 botocore/1.12.24

$ jq --version
jq-1.5

またAWS CLI用のdefaultプロファイルが設定されています。

既存ログのコピー(または移動)

個別リージョン証跡で記録していたログは、おそらく証跡と同じリージョンに個別にバケットを作成して保存しているかと思われます。全リージョン証跡の場合、ひとつのバケットにすべてのリージョンのログが保存されます。そのため、Amazon Athenaなどでログ分析したいケースなどを想定すると、既存ログを全リージョン証跡のバケットにコピー(または移動)しておくと便利そうです。

既存ログのバケット名をcloudtrail-${region}-${aws_account_id}、新規ログのバケット名をcloudtrail-all-region-${aws_account_id}とすると、次のコマンドでコピーできます。

aws_account_id=$(aws sts get-caller-identity | jq -r '.Account')
regions=$(aws ec2 describe-regions | jq -r '.Regions[].RegionName')

for region in $regions; do
  aws s3 cp --recursive "s3://cloudtrail-${region}-${aws_account_id}/AWSLogs/${aws_account_id}/CloudTrail/" "s3://cloudtrail-all-region-${aws_account_id}/AWSLogs/${aws_account_id}/CloudTrail/"
done

移動の場合はmvコマンドを使います。また&を付けて全リージョン並列なんてこともできますね。

aws_account_id=$(aws sts get-caller-identity | jq -r '.Account')
regions=$(aws ec2 describe-regions | jq -r '.Regions[].RegionName')

for region in $regions; do
  aws s3 mv --recursive "s3://cloudtrail-${region}-${aws_account_id}/AWSLogs/${aws_account_id}/CloudTrail/" "s3://cloudtrail-all-region-${aws_account_id}/AWSLogs/${aws_account_id}/CloudTrail/" &
done

一点注意としては、CloudTrailの移行時に、一時的に証跡の重複期間があります。出力されるファイル名は異なるため、コピーをして上書きされるということはありません。一方でコピー時にその重複ログを排除するのは難しいと考えますので、そこは許容する必要があります。

既存ログのバケット削除

既存ログのコピーができたらそのバケットは不要ですので削除します。一度削除してしまうと復元することはできませんので、必ずコピーできていることを確認してください。前述と同様、既存ログのバケット名をcloudtrail-${region}-${aws_account_id}とすると、次のコマンドで削除できます。

aws_account_id=$(aws sts get-caller-identity | jq -r '.Account')
regions=$(aws ec2 describe-regions | jq -r '.Regions[].RegionName')

for region in $regions; do
  aws s3 rb --force s3://cloudtrail-${region}-${aws_account_id}
done

その他

SNSやCloudWatch Logsと連携させていた場合はそれらの設定も必要となります。またDatadogやSplunk、Sumo Logicなどのサードパーティー製品を利用してCloudTrailの証跡ログを監視・分析している場合なども、忘れずに設定を変更してください。

まとめ

全リージョン証跡がリリースされてからしばらく経ちましたが、個別リージョン証跡を利用している方も多いのではないでしょうか。全リージョン証跡の機能がリリースされた当時は、証跡とバケットのリージョンが異なっているとリージョン間転送費がかかっていました。現在はこの転送費がかからないため、費用を懸念して個別リージョン証跡を利用していた方は全リージョン証跡への移行を検討してみてはいかがでしょうか。