こんにちはますのです。
S3サーバアクセスログをCLIで設定する方法について調べていました。
GUIではすぐに設定が出来る箇所ですが、CLIだと少し詰まった箇所が出たためメモを残します。
概要
やりたいことはざっくり下図の通りです。
設定値
S3バケット「Bucket」に対して下記の設定を行います。
今回はAthenaでログ分析を行いたいため、ログオブジェクトキーの形式は「[DestinationPrefix][SourceAccountId]/[SourceRegion]/[SourceBucket]/[YYYY]/[MM]/[DD]/[YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]」が必須としています。
項目 | 値 |
サーバアクセスのログ記録 | 有効にする |
送信先 | s3://Bucket-Log/Prefix/ |
ログオブジェクトキーの形式 | [DestinationPrefix][SourceAccountId]/[SourceRegion]/[SourceBucket]/[YYYY]/[MM]/[DD]/[YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]
分析およびクエリのアプリケーションを高速化するには、この形式を使用します。 |
ログオブジェクトキーの形式で使用される日付のソース | S3 イベントの時刻 |
設定方法:S3サーバアクセスログ有効化
作業の順番としては下記流れになります。
- AWS CLIのバージョンを2.14以上にする
- 設定値を記載する「logging.json」ファイルを作成する
- 対象S3バケットに対してコマンドを実行する
AWS CLIバージョンが低いとエラー発生
当初、AWS CLIのバージョンが2.10.1で実行したところ、下記のエラーが出ました。
$ aws s3api put-bucket-logging --bucket Bucket --bucket-logging-status file://logging.json
Parameter validation failed:
Unknown parameter in BucketLoggingStatus.LoggingEnabled: "TargetObjectKeyFormat", must be one of: TargetBucket, TargetGrants, TargetPrefix
バージョン低いことがあるので最新化して実行すると幸せになれるかもです。
AWS CLIを2.14以上(or 最新)にアップデートする
ログオブジェクトキーの形式を「[DestinationPrefix][SourceAccountId]/[SourceRegion]/[SourceBucket]/[YYYY]/[MM]/[DD]/[YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]」に設定する場合、AWS CLIのバージョンが2.14以上である必要があります。
AWS CLI Command Reference:TargetObjectKeyFormatがあるか確認する。
・ ver2.14.0参照:TargetObjectKeyFormat有り
{
"LoggingEnabled": {
"TargetBucket": "string",
"TargetGrants": [
{
"Grantee": {
"DisplayName": "string",
"EmailAddress": "string",
"ID": "string",
"Type": "CanonicalUser"|"AmazonCustomerByEmail"|"Group",
"URI": "string"
},
"Permission": "FULL_CONTROL"|"READ"|"WRITE"
}
...
],
"TargetPrefix": "string",
"TargetObjectKeyFormat": {
"SimplePrefix": {
},
"PartitionedPrefix": {
"PartitionDateSource": "EventTime"|"DeliveryTime"
}
}
}
}
・ver2.13.0参照:TargetObjectKeyFormat無し
{
"LoggingEnabled": {
"TargetBucket": "string",
"TargetGrants": [
{
"Grantee": {
"DisplayName": "string",
"EmailAddress": "string",
"ID": "string",
"Type": "CanonicalUser"|"AmazonCustomerByEmail"|"Group",
"URI": "string"
},
"Permission": "FULL_CONTROL"|"READ"|"WRITE"
}
...
],
"TargetPrefix": "string"
}
}
「TargetObjectKeyFormat」を指定しなかった場合、ログオブジェクトキーの形式がAthena利用に適さない「[DestinationPrefix][YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]」で有効化されます。そのため、今回の要件では「TargetObjectKeyFormat」が利用できるver2.14以上が必須です。
logging.jsonを作成する
リファレンスの記載は下記の通りです。
{
"LoggingEnabled": {
"TargetBucket": "MyBucket",
"TargetPrefix": "Logs/"
}
}
}
今回はAWS公式のS3ユーザーガイドより参考に作成しました。
– AWS CLIの使用 > 例 – ログオブジェクトキーを S3 イベント時刻に設定した logging.json より
{
"LoggingEnabled": {
"TargetBucket": "Bucket-Log",
"TargetPrefix": "Prefix/",
"TargetObjectKeyFormat": {
"PartitionedPrefix": {
"PartitionDateSource": "EventTime"
}
}
}
}
logging.jsonは作業用フォルダなど、分かりやすいフォルダに保存します。
対象S3バケットに対してコマンドを実行する
下記のコマンドを実行します。
logging.jsonファイルが保存されているディレクトリへ移動して実行します。
$ aws s3api put-bucket-logging --bucket Bucket --bucket-logging-status file://logging.json
設定情報を確認します。
$ aws s3api get-bucket-logging --bucket Bucket
{
"LoggingEnabled": {
"TargetBucket": "Bucket-Log",
"TargetPrefix": "Prefix/",
"TargetObjectKeyFormat": {
"PartitionedPrefix": {
"PartitionDateSource": "EventTime"
}
}
}
}
上記の設定が返ってくれば設定完了です。
設定方法:S3サーバアクセスログ無効化
S3サーバアクセスログをAWS CLIでの無効化は、[–bucket-logging-status]で空のjsonドキュメントを指定すると可能なようです。
To enable logging, you use LoggingEnabled and its children request elements. To disable logging, you use an empty BucketLoggingStatus request element:
S3サーバアクセスログ無効化コマンド
例: aws s3api put-bucket-logging --bucket <bucket-name> --bucket-logging-status '{}'
今回の概要で記載すると以下になります。
$ aws s3api put-bucket-logging --bucket Bucket --bucket-logging-status '{}'
以上、S3サーバアクセスログをAWS CLIで有効・無効する方法でした。
GUIなら気にしない箇所でしたが、CLIで設定せざるを得ない環境の時に備えたいと思います。