Upgrade to Pro — share decks privately, control downloads, hide ads and more …

バージョニング有効なS3バケットのオブジェクト一括削除(JQコマンド)

emi
October 03, 2021

 バージョニング有効なS3バケットのオブジェクト一括削除(JQコマンド)

2021/10/14(木)JAWS-UG CLI専門支部 #231R AWS CLI入門でのLTで発表したスライドです。意図せず座学パートの内容にちょっと関連できててよかったです。
(参考)
バージョニングが有効なバケットで削除された Amazon S3 オブジェクトを取得するにはどうすればよいですか?
https://aws.amazon.com/jp/premiumsupport/knowledge-center/s3-undelete-configuration/
S3 オブジェクトの過去バージョンを一括削除する(AWS社員様のブログ)
https://yohei-a.hatenablog.jp/entry/20191020/1571504826
2020年10月8日 JAWS-UG CLI専門支部 #169R S3基礎 バージョニング
https://jawsug-cli.connpass.com/event/188822/
JQコマンド
https://stedolan.github.io/jq/
JQコマンドリファレンス
https://stedolan.github.io/jq/manual/
jq コマンドを使う日常のご紹介
https://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af
jq コマンドの Linux への速攻インストール
https://qiita.com/wnoguchi/items/70a808a68e60651224a4
Argument list too long
https://www.ecoop.net/memo/archives/2010-01-26-1.html

emi

October 03, 2021
Tweet

More Decks by emi

Other Decks in Technology

Transcript

  1. S3オブジェクトの過去バージョンを 削除するには ①aws s3api list-object-versions https://docs.aws.amazon.com/cli/latest/reference/s3api/list-object-versions.html • aws s3api list-object-versionsを実行し、削除対象となるオブジェ

    クトのバージョン ID を取得する ②aws s3api delete-object https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-object.html • ①で得たバージョン ID に基づいて aws s3api delete-object を実行 し、オブジェクトを削除する
  2. バージョニング有効なS3バケット内に何千も オブジェクトがあったら? • 過去のJAWS-UG CLI専門支部ではオブジェクトを全部消すため for文を回すというとてもおしゃれなやり方をしてました • for i in

    $( • aws s3api list-object-versions --bucket ${S3_BUCKET_NAME} ¥ • --prefix ${S3_OBJECT_KEY} ¥ • --query "Versions[].VersionId" --output text ¥ • ); do • aws s3api delete-object --bucket ${S3_BUCKET_NAME} ¥ • --key ${S3_OBJECT_KEY} --version-id ${i} • done ① ②
  3. 余談 • プログラムの実行引数の制限 https://www.ecoop.net/memo/archives/2010-01-26-1.html • 伝統的に ARG_MAX というマクロ定数で定義されている、らし い •

    制限にひっかかると「Argument list too longエラー」 • xargsコマンドなどで回避 xargsはARG_MAXの値を把握しているので、引数がARG_MAXを超えそう になると自動的に複数回に分割して実行するらしい
  4. バージョニング有効 S3バケット test1.txt test2.txt cli_text.txt cli_test - コピー.txt cli_testxx.txt cli_testyy.txt

    cli_testzz.txt cli_test98.txt cli_test99.txt folder1/ folder2/ folder3/ 削除マーカー 削除マーカー 削除マーカー 削除マーカー バージョニング有効なS3を用意しておきます
  5. S3オブジェクトのすべてのバージョンIDを一括取得 • aws s3api list-object-versions ¥ • --bucket ${S3BUCKET_NAME}|jq -r

    '.Versions[]|@text "¥(.Key) ¥(.VersionId)“’ -r:ダブルクォーテーションの削除 Versionsセクションから text形式で「Key」「VersionId」を抽出
  6. S3オブジェクトのすべてのバージョンIDを一括取得 バージョニング有効 S3バケット test1.txt test2.txt cli_text.txt cli_test - コピー.txt cli_testxx.txt

    cli_testyy.txt cli_testzz.txt cli_test98.txt cli_test99.txt folder1/ folder2/ folder3/ 削除マーカー 削除マーカー 削除マーカー 削除マーカー • 実行結果↓ 削除マーカー以外のオブジェクトバージョンIDを抽出できている
  7. • aws s3api list-object-versions ¥ • --bucket ${S3BUCKET_NAME}|jq -r '.DeleteMarkers[]|@text

    "¥(.Key) ¥(.VersionId)"' DeleteMarkersセクションから S3バケット内のすべての削除マーカーの バージョンIDを一括取得
  8. バージョニング有効 S3バケット test1.txt test2.txt cli_text.txt cli_test - コピー.txt cli_testxx.txt cli_testyy.txt

    cli_testzz.txt cli_test98.txt cli_test99.txt folder1/ folder2/ folder3/ 削除マーカー 削除マーカー 削除マーカー 削除マーカー 削除マーカー S3バケット内のすべての削除マーカーの バージョンIDを一括取得 • 実行結果↓ 削除マーカーのオブジェクトバージョンIDを抽出できている フォルダの削除マーカーは マネコンから見えない
  9. • aws s3api list-object-versions ¥ • --bucket ${S3BUCKET_NAME}|jq -r '.Versions[]|select(.IsLatest==false)|@text

    "¥(.Key) ¥(.VersionId)"' (参考)S3オブジェクトの過去バージョンのみ一括取得 過去バージョンのみ抽出 古いオブジェクトの ”IsLatest” 項目は false となっている
  10. S3オブジェクトのすべてを一括削除 aws s3api list-object-versions ¥ --bucket ${S3BUCKET_NAME}|jq -r '.Versions[]|@text "¥(.Key)

    ¥(.VersionId)"'|while read KEY VER do aws s3api delete-object --bucket "${S3BUCKET_NAME}" --key "${KEY}" --version-id "${VER}" done 条件が満されているあいだ処理を繰り返す while [ 条件式 ] do 処理… done
  11. バージョニング有効 S3バケット test1.txt cli_testxx.txt cli_test98.txt cli_test99.txt folder2/ folder3/ 削除マーカー 削除マーカー

    削除マーカー 削除マーカー • 削除マーカー以外のオブジェクトが削除された 削除マーカー S3オブジェクトのすべてを一括削除
  12. S3オブジェクトのすべての削除マーカーを 一括削除 aws s3api list-object-versions ¥ --bucket ${S3BUCKET_NAME}|jq -r '.DeleteMarkers[]|@text

    "¥(.Key) ¥(.VersionId)"'|while read KEY VER do aws s3api delete-object --bucket "${S3BUCKET_NAME}" --key "${KEY}" --version-id "${VER}" done
  13. 参考 • バージョニングが有効なバケットで削除された Amazon S3 オブジェクトを取得するにはどうすれば よいですか? https://aws.amazon.com/jp/premiumsupport/knowledge-center/s3-undelete-configuration/ • S3

    オブジェクトの過去バージョンを一括削除する(AWS社員様のブログ) https://yohei-a.hatenablog.jp/entry/20191020/1571504826 • 2020年10月8日 JAWS-UG CLI専門支部 #169R S3基礎 バージョニング https://jawsug-cli.connpass.com/event/188822/ • JQコマンド https://stedolan.github.io/jq/ • JQコマンドリファレンス https://stedolan.github.io/jq/manual/ • jq コマンドを使う日常のご紹介 https://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af • jq コマンドの Linux への速攻インストール https://qiita.com/wnoguchi/items/70a808a68e60651224a4 • Argument list too long https://www.ecoop.net/memo/archives/2010-01-26-1.html