Above & Beyond

日々のアウトプット記録

S3バケットの設定を適度にダンプするAWS CLIをシェルにした

RSSリーダーの記事を消化していて、そういえばこういうのをやらなきゃいけなかったんだったと思い出したのでシェルにした。

dev.classmethod.jp

だいたいこんな感じ。 各バケットに対してサブコマンドをバンバン発行して、それをファイルに出力する。

出力は {日付(YYYYMMDD)}/{プロファイル名}/{バケット名}/ の下に サブコマンド毎に出力。

#!/bin/bash

#   呼び出したいS3apiサブコマンドを定義
### ---------------------------------------------------------------------------
FUNCS=$(cat << EOS
get-bucket-acl
get-bucket-encryption
get-bucket-lifecycle-configuration
get-bucket-location
get-bucket-logging
get-bucket-notification-configuration
get-bucket-ownership-controls
get-bucket-policy
get-bucket-policy-status
get-bucket-replication
get-bucket-request-payment
get-bucket-tagging
get-bucket-versioning
get-bucket-website
get-public-access-block
EOS
)

#   定数定義
### ---------------------------------------------------------------------------
# s3api コマンド
S3CMD="aws s3api --profile ${1}"

# メイン処理
### ---------------------------------------------------------------------------
# 引数チェック
if [ $# != 1 ]; then
  echo "Usage: ${0} [profilename]"
  exit 0
fi

# 最初にバケット一覧を取得
BUCKETS=`${S3CMD} list-buckets --query "Buckets[].Name" --output text`

# S3apiサブコマンドを各バケットに対して実行
for BUCKET in ${BUCKETS}; do
  # 処理日付取得(YYYYMMDD)
  OUTDIR=`date +"%Y%m%d"`/${1}/${BUCKET}

  # 出力ディレクトリ作成
  if [ ! -d ${OUTDIR} ] ; then
    mkdir -p ${OUTDIR}
  fi

  printf "[%60s] を処理中 " ${BUCKET}
  for FUNC in ${FUNCS}; do
    printf "."
    # 属性が未設定の場合はエラーになるが、ここでは無視
    ${S3CMD} ${FUNC} --bucket ${BUCKET} > ${OUTDIR}/${FUNC}.json 2> /dev/null
  done
  printf "\n"
done

設定をバックアップしておいて、何かあった時に確認する感じ。 何でこういうのが必要かといえば、こーどかIaaS化されずに構築された環境がありまして、という話です。