指定のライフサイクルルールが付与されていないS3バケットをチェックするスクリプトを作成してみた

2021.07.30

7月からアノテーション テクニカルサポートチームにJOINしました 川崎です。

S3のライフサイクル設定

S3のライフサイクル設定を使用すると、バケット内のオブジェクトのライフサイクル管理を指定することができます。

S3バケットの数が増えてくると、どのバケットにどのようなライフサイクル設定を行ったか、把握するのが難しくなってきます。

AWS CLIの s3api を使用して、単体のS3バケットに対して、指定のライフサイクルルールが付与されているかどうか確認するには、 下記のコマンドを実行します。(複数のバケットに対して、一括してチェックする仕組みは今のところありません)

aws s3api get-bucket-lifecycle-configuration --bucket [bucket_name]

S3バケットは日々増えていきますので、都度、手動で確認するのはとても非効率です。 上記のコマンドをスクリプト化し、指定のライフサイクルルールが付与されていないバケットの一覧を取得できるようにします。

スクリプト作成

バケット一覧は下記のコマンドで取得します。

aws s3 ls | awk '{print $3}'

取得したバケットリストに対して、ループ処理を行い、 ライフサイクル設定を取得します。

結果はJSON形式で返ってきますので、jqコマンドを利用して、必要な情報だけをフィルタします。

s3-lifecycle-conf.bash

#!/bin/bash

# 検索するライフサイクル・ルール名を指定
rule="bucket-lifecycle-7days"

# AWSアカウントの全てのバケットを参照する
for bucket in $(aws s3 ls | awk '{print $3}');
# 動作確認時はアンコメント、「bucket_list.txt」ファイルにバケット名を記述するとそのバケットだけチェックします
#for bucket in $(cat bucket_list.txt);
do
  # バケット名を表示
  echo -ne $bucket "\t"
  # バケットのライフサイクル・ルールを確認
  result=$(aws s3api get-bucket-lifecycle-configuration --bucket $bucket 2>&1 | jq -r --arg rule $rule '.Rules[] | select(.ID==$rule) | .ID' 2>&1)
  exit_status=$?
  if [ $exit_status -eq 0 -a "$result" != "" ]; then
    # 指定したライフサイクル・ルールが存在する場合
    echo "success";
  else
    # 指定したライフサイクル・ルールが存在しない場合
    echo "failure";
  fi; 
done
  • 環境変数「AWS_DEFAULT_PROFILE」を指定して、スクリプトを実行してください (export AWS_DEFAULT_PROFILE=dev)
  • スクリプトの4行目で、検索するライフサイクルルール名を指定してください
  • JSONパーサー「jq」を使用しておりますので、jqがインストールされた環境で実行してください

実行結果の例

# 実行例
$ bash s3-lifecycle-conf.bash
bucket-a    success
bucket-b    failure
[bucket名]    [success or failure]
...

実行結果の各行の先頭にバケット名が表示され、その後ろにsuccessもしくはfailureと表示されます

success: 指定のライフサイクルポリシー名が付与されている
failure: 指定のライフサイクルポリシー名が付与されていない

まとめ

指定のライフサイクルルールが付与されていないS3バケットをチェックするs3apiコマンドを、jqコマンドを活用する形で、スクリプト化してみました。

日々の運用の効率化に役立てていただけたら幸いです。