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バケットのオブジェクト一括削除
    (JQコマンド)
    2021/10/14(木)
    JAWS-UG CLI専門支部 #231R AWS CLI入門

    View full-size slide

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

    View full-size slide

  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 を実行
    し、オブジェクトを削除する

    View full-size slide

  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


    View full-size slide

  5. 余談
    • プログラムの実行引数の制限
    https://www.ecoop.net/memo/archives/2010-01-26-1.html
    • 伝統的に ARG_MAX というマクロ定数で定義されている、らし

    • 制限にひっかかると「Argument list too longエラー」
    • xargsコマンドなどで回避
    xargsはARG_MAXの値を把握しているので、引数がARG_MAXを超えそう
    になると自動的に複数回に分割して実行するらしい

    View full-size slide

  6. バージョニング有効なS3バケット内に何千も
    オブジェクトがあったら?
    • JQコマンドが使える
    https://stedolan.github.io/jq/manual/
    ⇒JSONから値を抜き出したり、集計したり、
    整形して表示したりできるコマンド
    • CloudShell:JQコマンドがデフォルトで導入されている
    • Cloud9環境:導入されていない

    View full-size slide

  7. JQコマンドをCloud9環境に
    インストール

    View full-size slide

  8. JQコマンドをCloud9環境にインストール
    • Cloud9環境(Amazon Linux2)へのJQコマンドインストール
    • sudo yum -y install jq
    • 実行結果↓
    :(途中省略)

    View full-size slide

  9. バージョンIDの一括取得

    View full-size slide

  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を用意しておきます

    View full-size slide

  11. S3オブジェクトのすべてのバージョンIDを一括取得
    • aws s3api list-object-versions ¥
    • --bucket ${S3BUCKET_NAME}|jq -r '.Versions[]|@text "¥(.Key) ¥(.VersionId)“’
    -r:ダブルクォーテーションの削除
    Versionsセクションから
    text形式で「Key」「VersionId」を抽出

    View full-size slide

  12. S3オブジェクトのすべてのバージョンIDを一括取得
    • 実行結果↓ 削除マーカー以外のオブジェクトバージョンIDを抽出できている

    View full-size slide

  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を抽出できている

    View full-size slide

  14. • aws s3api list-object-versions ¥
    • --bucket ${S3BUCKET_NAME}|jq -r '.DeleteMarkers[]|@text "¥(.Key) ¥(.VersionId)"'
    DeleteMarkersセクションから
    S3バケット内のすべての削除マーカーの
    バージョンIDを一括取得

    View full-size slide

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

    View full-size slide

  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を抽出できている
    フォルダの削除マーカーは
    マネコンから見えない

    View full-size slide

  17. フォルダの削除マーカーは
    マネコンから見えない
    S3バケット内のすべての削除マーカーの
    バージョンIDを一括取得

    View full-size slide

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

    View full-size slide

  19. オブジェクトの一括削除

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  23. バージョニング有効
    S3バケット
    test1.txt
    cli_testxx.txt
    cli_test98.txt cli_test99.txt
    folder2/
    folder3/
    削除マーカー
    削除マーカー
    削除マーカー
    削除マーカー
    • 削除マーカー以外のオブジェクトが削除された
    削除マーカー
    S3オブジェクトのすべてを一括削除

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  29. S3オブジェクトのすべての削除マーカーを
    一括削除

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide