のぴぴのメモ

自分用のLinuxとかの技術メモ

バージョニングが有効なS3バケットをAWS CLIで空にする手順(オブジェクト1000個以下)

S3のバケットを削除する場合、まずバケットを空にする必要があります。ここではAWS CLIを利用しバケットを空にし、その後にバケットを削除する手順を記載します。

具体的には list-object-versionsでオブジェクトをリストアップし、delete-objectでオブジェクトを一つづつ削除します。なお記載する例は、バケットの中のオブジェクトが1000個未満の場合に利用できます。(list-object-versionsの1回の実行でリストされるオブジェクトの最大個数がデフォルトでは1000のため*1 )

ちなみにaws s3 rm s3://バケット名 --recursiveaws s3 rb s3://バケット名 --forceで最初試しましたが、バージョニングが有効な場合これらのコマンドでは削除マークが付くだけですし、バージョニングされた古いオブジェクトは何もされず、オブジェクトが消えないため、このようなやり方をする必要がありました。(ユーザーガイド*2にもバージョニングが有効で無い場合に限ってと注釈がありますね )

削除手順

前提

  • バケットの中のオブジェクトが1000個未満の場合(古いバージョン含めた合計)
  • bash上で、AWS CLIが実行可能であること
  • AWS CLIのプロファイル設定は実施済みであること

変数設定

PROFILE="<AWS CLIのプロファイルを指定する。デフォルトの場合はdefault>"
BUCKET_NAME="<対象のバケット名を設定する>"

バケットを空にする

# 削除マーカーがついているオブジェクトの削除
aws --profile ${PROFILE} --output text \
      s3api list-object-versions \
        --bucket ${BUCKET_NAME} \
    --query 'DeleteMarkers[].{Key:Key,VersionId:VersionId}' | while read key versionid
do
    aws --profile ${PROFILE} \
        s3api delete-object \
            --bucket ${BUCKET_NAME} \
            --key ${key} \
            --version-id ${versionid}
done 

# それ以外のオブジェクトの削除
aws --profile ${PROFILE} --output text \
      s3api list-object-versions \
        --bucket ${BUCKET_NAME} \
    --query 'Versions[].{Key:Key,VersionId:VersionId}' | while read key versionid
do
    aws --profile ${PROFILE} \
        s3api delete-object \
            --bucket ${BUCKET_NAME} \
            --key ${key} \
            --version-id ${versionid}
done 

バケットの削除

aws --profile ${PROFILE} \
    s3api delete-bucket \
        --bucket "${BUCKET_NAME}"