【小ネタ】S3バケットのバージョニング有無とライフサイクルルール有無をAWS CLIで棚卸しする

【小ネタ】S3バケットのバージョニング有無とライフサイクルルール有無をAWS CLIで棚卸しする

Clock Icon2025.01.29

バージョニングが設定されていて、ライフサイクルルールが無効になっているS3バケットを洗い出したいです。 古いバージョンのオブジェクトがチリツモでコストになるケースがあるためです。

https://dev.classmethod.jp/articles/costly-oversizes-s3bucket/

洗い出しには Security Hub の [S3.10] コントロール が使えますが、 AWS基礎セキュリティのベストプラクティス標準には入っていません。

このためだけに NIST SP 800-53 Rev. 5標準を有効化するのも手間とコストになるので、 今回は AWS CLIにてS3バケットを棚卸ししてみます

作成したスクリプト

以下 bash スクリプトを作成しました。S3バケットのバージョニング設定有無とライフサイクルルール設定有無を Markdownテーブルで出力します。

inventory-s3-versioning-and-lifecycle.sh
#!/bin/bash

echo "| S3 bucket | Versioning | Lifecycle rules |"
echo "| -- | -- | -- |"

aws s3api list-buckets --query "Buckets[].[Name]" --output text \
| while read bucket; do
    # バージョニングの設定有無チェック
    versioning="No"
    test "$(aws s3api get-bucket-versioning --bucket $bucket --query Status --output text)" = "Enabled" \
      && versioning="Yes"

    # ライフサイクルルールの設定有無チェック
    lifecycle="No"
    aws s3api get-bucket-lifecycle-configuration --bucket $bucket > /dev/null 2>&1 \
      && lifecycle="Yes"

    # 出力
    echo "| $bucket | $versioning | $lifecycle |"
  done

バージョニングを取得するコマンド(get-bucket-versioning)は、 バージョニングが有効になっていれば "Status:Enabled" が出力されるので、 その値で判別します。

### バージョニングが有効である場合 ###
aws s3api get-bucket-versioning --bucket DOC-EXAMPLE-1 --output text
# Enabled

### バージョニング無効の場合 ###
aws s3api get-bucket-versioning --bucket DOC-EXAMPLE-2 --output text
# (出力無し)

ライフサイクルルールを取得するコマンド(get-bucket-lifecycle-configuration)は、 ルールが設定されていない場合、エラーになります。 正常に終了するか、しないかで判別できます。

### 正常に終了する場合 ###
aws s3api get-bucket-lifecycle-configuration --bucket DOC-EXAMPLE-1 --output yaml
# Rules:
# - Expiration:
#     Days: 1095
#   Filter:
#     Prefix: ''
#   ID: RetentionRule
#   NoncurrentVersionExpiration:
#     NoncurrentDays: 1095
#   Status: Enabled
# TransitionDefaultMinimumObjectSize: varies_by_storage_class

### エラーになる場合 ###
aws s3api get-bucket-lifecycle-configuration --bucket DOC-EXAMPLE-2 --output yaml
# An error occurred (NoSuchLifecycleConfiguration) when calling the GetBucketLifecycleConfiguration operation: The lifecycle configuration does not exist

実行サンプル

以下に実行サンプルを記載します。

./inventory-s3-versioning-and-lifecycle.sh
# | S3 bucket | Versioning | Lifecycle rules |
# | -- | -- | -- |
# | aws-controltower-logs-111111111111-ap-northeast-1 | Yes | Yes |
# | aws-controltower-s3-access-logs-111111111111-ap-northeast-1 | Yes | Yes |
# | cf-templates-1111111111111-ap-northeast-1 | No | No |
# | rain-artifacts-111111111111-ap-northeast-1 | No | Yes |
# | custom-cloudtrail-logs-111111111111-ap-northeast-1 | Yes | Yes |
S3 bucket Versioning Lifecycle rules
aws-controltower-logs-111111111111-ap-northeast-1 Yes Yes
aws-controltower-s3-access-logs-111111111111-ap-northeast-1 Yes Yes
cf-templates-1111111111111-ap-northeast-1 No No
rain-artifacts-111111111111-ap-northeast-1 No Yes
custom-cloudtrail-logs-111111111111-ap-northeast-1 Yes Yes

おわりに

S3バケットのバージョニング/ライフサイクルルール設定を棚卸してみました。 サクッと1アカウント内のS3設定を確認したいときに役に立つと思います。

以上、参考になれば幸いです。

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.