Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

バージョニング有効な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 ① ②

Slide 5

Slide 5 text

余談 • プログラムの実行引数の制限 https://www.ecoop.net/memo/archives/2010-01-26-1.html • 伝統的に ARG_MAX というマクロ定数で定義されている、らし い • 制限にひっかかると「Argument list too longエラー」 • xargsコマンドなどで回避 xargsはARG_MAXの値を把握しているので、引数がARG_MAXを超えそう になると自動的に複数回に分割して実行するらしい

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

バージョンIDの一括取得

Slide 10

Slide 10 text

バージョニング有効 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を用意しておきます

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

オブジェクトの一括削除

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

参考 • バージョニングが有効なバケットで削除された 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