Save 37% off PRO during our Black Friday Sale! »

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

97b3cca999b52cb5296675ac0a5c12cd?s=47 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

97b3cca999b52cb5296675ac0a5c12cd?s=128

emi

October 03, 2021
Tweet

Transcript

  1. バージョニング有効な S3バケットのオブジェクト一括削除 (JQコマンド) 2021/10/14(木) JAWS-UG CLI専門支部 #231R AWS CLI入門

  2. バージョニング有効な S3バケット内に たくさんオブジェクトがあったら 消すのが大変

  3. 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 を実行 し、オブジェクトを削除する
  4. バージョニング有効な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 ① ②
  5. 余談 • プログラムの実行引数の制限 https://www.ecoop.net/memo/archives/2010-01-26-1.html • 伝統的に ARG_MAX というマクロ定数で定義されている、らし い •

    制限にひっかかると「Argument list too longエラー」 • xargsコマンドなどで回避 xargsはARG_MAXの値を把握しているので、引数がARG_MAXを超えそう になると自動的に複数回に分割して実行するらしい
  6. バージョニング有効なS3バケット内に何千も オブジェクトがあったら? • JQコマンドが使える https://stedolan.github.io/jq/manual/ ⇒JSONから値を抜き出したり、集計したり、 整形して表示したりできるコマンド • CloudShell:JQコマンドがデフォルトで導入されている •

    Cloud9環境:導入されていない
  7. JQコマンドをCloud9環境に インストール

  8. JQコマンドをCloud9環境にインストール • Cloud9環境(Amazon Linux2)へのJQコマンドインストール • sudo yum -y install jq

    • 実行結果↓ :(途中省略)
  9. バージョンIDの一括取得

  10. バージョニング有効 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を用意しておきます
  11. S3オブジェクトのすべてのバージョンIDを一括取得 • aws s3api list-object-versions ¥ • --bucket ${S3BUCKET_NAME}|jq -r

    '.Versions[]|@text "¥(.Key) ¥(.VersionId)“’ -r:ダブルクォーテーションの削除 Versionsセクションから text形式で「Key」「VersionId」を抽出
  12. S3オブジェクトのすべてのバージョンIDを一括取得 • 実行結果↓ 削除マーカー以外のオブジェクトバージョンIDを抽出できている

  13. 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を抽出できている
  14. • aws s3api list-object-versions ¥ • --bucket ${S3BUCKET_NAME}|jq -r '.DeleteMarkers[]|@text

    "¥(.Key) ¥(.VersionId)"' DeleteMarkersセクションから S3バケット内のすべての削除マーカーの バージョンIDを一括取得
  15. • 実行結果↓ 削除マーカーのオブジェクトバージョンIDを抽出できている フォルダの削除マーカーは マネコンから見えない S3バケット内のすべての削除マーカーの バージョンIDを一括取得

  16. バージョニング有効 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を抽出できている フォルダの削除マーカーは マネコンから見えない
  17. フォルダの削除マーカーは マネコンから見えない S3バケット内のすべての削除マーカーの バージョンIDを一括取得

  18. • aws s3api list-object-versions ¥ • --bucket ${S3BUCKET_NAME}|jq -r '.Versions[]|select(.IsLatest==false)|@text

    "¥(.Key) ¥(.VersionId)"' (参考)S3オブジェクトの過去バージョンのみ一括取得 過去バージョンのみ抽出 古いオブジェクトの ”IsLatest” 項目は false となっている
  19. オブジェクトの一括削除

  20. 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
  21. S3オブジェクトのすべてを一括削除 :(途中省略) Key に半角スペースを含む オブジェクトだけ失敗してしまった 他は削除成功

  22. S3オブジェクトのすべてを一括削除 Key に半角スペースを含む オブジェクトだけ個別に指定して削除

  23. バージョニング有効 S3バケット test1.txt cli_testxx.txt cli_test98.txt cli_test99.txt folder2/ folder3/ 削除マーカー 削除マーカー

    削除マーカー 削除マーカー • 削除マーカー以外のオブジェクトが削除された 削除マーカー S3オブジェクトのすべてを一括削除
  24. S3オブジェクトのすべてを一括削除

  25. S3オブジェクトのすべてを一括削除

  26. S3オブジェクトのすべてを一括削除

  27. 削除マーカーしか入っていないバケットは 削除できるか? • ここまでですべてのオブジェクトは削除されていて、削除マー カーのみ残っている状態 • この状態でS3バケットを削除できるのか? • だめでした

  28. 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
  29. S3オブジェクトのすべての削除マーカーを 一括削除

  30. S3オブジェクトのすべての削除マーカーを 一括削除 S3バケット内の すべてのオブジェクトと すべての削除マーカーが 削除できた

  31. S3バケットを削除 • aws s3 rb s3://${S3BUCKET_NAME} • ようやくバケットが削除できました

  32. まとめ • バージョニング有効なS3バケットの削除は 過去バージョンを含むオブジェクト本体の削除と 削除マーカーの削除が必要 ※過去バージョンがある状態で削除マーカーを削除するとオブジェクトが復活してしまうので注意 • JQコマンド:JSONから値を抜き出したり、集計したり、 整形して表示したりできるコマンド •

    CloudShell:JQコマンド導入済 • Cloud9環境:デフォルトでJQコマンド未導入のためインストー ルが必要
  33. 参考 • バージョニングが有効なバケットで削除された 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