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

バージョニング有効なS3バケットのオブジェクト削除

emi
October 03, 2021

 バージョニング有効なS3バケットのオブジェクト削除

2021/10/7(木)JAWS-UG CLI専門支部#230R AWS CLI環境入門(Cloud9)でのLTで発表したスライド+αです。
(参考)
バージョニングが有効なバケットで削除された Amazon S3 オブジェクトを取得するにはどうすればよいですか?
https://aws.amazon.com/jp/premiumsupport/knowledge-center/s3-undelete-configuration/
S3 オブジェクトの過去バージョンを一括削除する(AWS社員様のブログ)
https://yohei-a.hatenablog.jp/entry/20191020/1571504826
s3api
https://docs.aws.amazon.com/cli/latest/reference/s3api/
list-object-versions
https://docs.aws.amazon.com/cli/latest/reference/s3api/list-object-versions.html
delete-object
https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-object.html
JQコマンド
https://stedolan.github.io/jq/
JQコマンドリファレンス
https://stedolan.github.io/jq/manual/
2020年10月8日 JAWS-UG CLI専門支部 #169R S3基礎 バージョニング
https://jawsug-cli.connpass.com/event/188822/
AWS SAM触ってみた奮闘記
https://speakerdeck.com/emiki/aws-samhong-tutemitafen-dou-ji

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バケット 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/ 削除マーカー 削除マーカー 削除マーカー 削除マーカー (「folder」じゃなくて意味的には 「prefix」とかにした方がよかったかも) バージョニング有効なS3を用意しておきます
  3. バージョニング有効 S3バケット test1.txt 復活する test2.txt 削除マーカー 削除マーカーを 削除 「削除した」という操作をなかったことにする (補足)削除マーカー

    • バージョニングが有効なS3バケットでオブジェクトを削除すると「削除 マーカー」が作られる • 削除マーカーを削除するとオブジェクトが復活する
  4. [ec2-user@ip-10-0-0-31%]$ aws s3api list-object-versions ¥ > --bucket ${S3BUCKET_NAME} { "Versions":

    [ { "ETag": "¥"d41d8cd98f00b204e9800998ecf8427e¥"", "Size": 0, "StorageClass": "STANDARD", "Key": "folder1/", "VersionId": "OOVJiE5lBNPQ_AuNrlcGu8T0pBj8sNjp", "IsLatest": true, "LastModified": "2021-09-23T20:05:14.000Z", "Owner": { "DisplayName": "emixxxxxxxx", "ID": "" } }, { "ETag": "¥"d41d8cd98f00b204e9800998ecf8427e¥"", "Size": 0, "StorageClass": "STANDARD", "Key": "folder1/cli_test - コピー.txt", "VersionId": "NfCRi2U7m5DyZWQu0D3DnaGbmkzQaOrX", "IsLatest": true, "LastModified": "2021-09-23T20:06:15.000Z", "Owner": { "DisplayName": "emixxxxxxxx", "ID": "2772a153121e9cbe9581864de8f1361efbf95ad8dd8b78260" } }, { "ETag": "¥"d41d8cd98f00b204e9800998ecf8427e¥"", "Size": 0, "StorageClass": "STANDARD", "Key": "folder1/cli_test.txt", "VersionId": "cheFC4vtWokDYqTgkPtltszkZmg8HvVM", "IsLatest": true, "LastModified": "2021-09-23T20:06:15.000Z", "Owner": { "DisplayName": "emixxxxxxxx", "ID": "2772a153121e9cbe9581864de8f1361efbf95ad8dd8b7826009" } }, { "ETag": "¥"d41d8cd98f00b204e9800998ecf8427e¥"", "Size": 0, "StorageClass": "STANDARD", "Key": "folder2/", "VersionId": "O6U87cFpFSOiDuERWtfPF6hPnzvh9.Fw", "IsLatest": true, "LastModified": "2021-09-23T20:05:30.000Z", "Owner": { "DisplayName": "emixxxxxxxx", "ID": "2772a153121e9cbe9581864de8f1361efbf95ad8dd8b7826" } }, { "ETag": "¥"d41d8cd98f00b204e9800998ecf8427e¥"", "Size": 0, "StorageClass": "STANDARD", "Key": "folder2/cli_testxx.txt", "VersionId": "jIf_B6NsidsQQPiJ_lNRZHrkrulm6Ske", "IsLatest": false, "LastModified": "2021-09-23T20:06:30.000Z", "Owner": { "DisplayName": "emixxxxxxxx", "ID": "2772a153121e9cbe9581864de8f1361efbf95ad8dd8b7826" } }, { "ETag": "¥"d41d8cd98f00b204e9800998ecf8427e¥"", "Size": 0, "StorageClass": "STANDARD", "Key": "folder2/cli_testyy.txt", "VersionId": "wmYIzc8DqMObcus.EyH5WkVX1LxepO2l", "IsLatest": true, "LastModified": "2021-09-23T20:06:30.000Z", "Owner": { "DisplayName": "emixxxxxxxx", "ID": "2772a153121e9cbe9581864de8f1361efbf95ad8d" } }, { "ETag": "¥"d41d8cd98f00b204e9800998ecf8427e¥"", "Size": 0, "StorageClass": "STANDARD", "Key": "folder2/cli_testzz.txt", "VersionId": "ehTMB_gngE44z6Ygyo3MiATXKknndNbX", "IsLatest": true, "LastModified": "2021-09-23T20:06:30.000Z", "Owner": { "DisplayName": "emixxxxxxxx", "ID": "2772a153121e9cbe9581864de8f1361efbf95ad8dd8b782600" } }, { "ETag": "¥"d41d8cd98f00b204e9800998ecf8427e¥"", "Size": 0, "StorageClass": "STANDARD", "Key": "folder3/", "VersionId": "kqExb_gVDHJdxAK6WgU7P70uk2Jh_DlY", "IsLatest": false, "LastModified": "2021-09-23T20:05:36.000Z", "Owner": { "DisplayName": "emixxxxxxxx", "ID": "2772a153121e9cbe9581864de8f1361efbf95ad8dd8b782" } }, { "ETag": "¥"d41d8cd98f00b204e9800998ecf8427e¥"", "Size": 0, "StorageClass": "STANDARD", "Key": "folder3/cli_test98.txt", "VersionId": "AGVIuRnjfTPQbxI0Px77tQbE5niHhWyZ", "IsLatest": false, "LastModified": "2021-09-23T20:06:44.000Z", "Owner": { "DisplayName": "emixxxxxxxx", "ID": "2772a153121e9cbe9581864de8f1361efbf95ad8dd8b78260" } }, { "ETag": "¥"d41d8cd98f00b204e9800998ecf8427e¥"", "Size": 0, "StorageClass": "STANDARD", "Key": "folder3/cli_test99.txt", "VersionId": "NWmHhxn2VJAeTFocapox5_a_qEYbgsvt", "IsLatest": false, "LastModified": "2021-09-23T20:06:44.000Z", "Owner": { "DisplayName": "emixxxxxxxx", "ID": "2772a153121e9cbe9581864de8f1361efbf95ad8dd8b78260" } }, { "ETag": "¥"d41d8cd98f00b204e9800998ecf8427e¥"", "Size": 0, "StorageClass": "STANDARD", "Key": "test1.txt", "VersionId": "yjatJyJdz1WtMrqwv7GVEiukkxG8MHB9", "IsLatest": false, "LastModified": "2021-09-23T20:05:59.000Z", "Owner": { "DisplayName": "emixxxxxxxx", "ID": "2772a153121e9cbe9581864de8f1361efbf95ad8dd8b78" } }, { "ETag": "¥"d41d8cd98f00b204e9800998ecf8427e¥"", "Size": 0, "StorageClass": "STANDARD", "Key": "test2.txt", "VersionId": "o4oWEwvo_2P_c9_WCBrS.wSE5jguevMV", "IsLatest": true, "LastModified": "2021-09-23T20:05:59.000Z", "Owner": { "DisplayName": "emixxxxxxxx", "ID": "2772a153121e9cbe9581864de8f1361efbf95ad8d" } } ], "DeleteMarkers": [ { "Owner": { "DisplayName": "emixxxxxxxx", "ID": "2772a153121e9cbe9581864de8f1361efbf95" }, "Key": "folder2/cli_testxx.txt", "VersionId": "DuYgTonHE9aaHL2t0NJlI0WMB3aSau09", "IsLatest": true, "LastModified": "2021-09-23T20:07:23.000Z" }, { "Owner": { "DisplayName": "emixxxxxxxx", "ID": "2772a153121e9cbe9581864de8f1361efbf95ad8dd8b78260096d9a55e36c3f3" }, "Key": "folder3/cli_test98.txt", "VersionId": "IKhFzixbzCVFyOocNf58bboDBBESbnuK", "IsLatest": true, "LastModified": "2021-09-23T20:07:40.000Z" }, { "Owner": { "DisplayName": "emixxxxxxxx", "ID": "2772a153121e9cbe9581864de8f1361efbf95ad8dd8b78260096d9a55e36c3f3" }, "Key": "folder3/cli_test99.txt", "VersionId": "hpQ0ox92OeI7xSLOPL5gtvD5WM_ko45S", "IsLatest": true, "LastModified": "2021-09-23T20:07:40.000Z" }, { "Owner": { "DisplayName": "emixxxxxxxx", 8b78260096d9a55e36c3f3 "ID": "2772a153121e9cbe9581864de8f1361efbf95ad8dd" }, "Key": "test1.txt", "VersionId": "vM7BCcSGEZIDnhiT9h13OBECX.zE0tPZ", "IsLatest": true, "LastModified": "2021-09-23T20:06:59.000Z" } ] } [ec2-user@ip-10-0-0-31%]$ • うわーーーーーーー オブジェクトのバージョンIDを取得
  5. [ec2-user@ip-10-0-0-31%]$ aws s3api list-object-versions ¥ > --bucket ${S3BUCKET_NAME} { "Versions":

    [ { "ETag": "¥"d41d8cd98f00b204e9800998ecf8427e¥"", "Size": 0, "StorageClass": "STANDARD", "Key": "folder1/", "VersionId": "OOVJiE5lBNPQ_AuNrlcGu8T0pBj8sNjp", "IsLatest": true, "LastModified": "2021-09-23T20:05:14.000Z", "Owner": { "DisplayName": "emixxxxxxxx", "ID": "" } }, { "ETag": "¥"d41d8cd98f00b204e9800998ecf8427e¥"", "Size": 0, "StorageClass": "STANDARD", "Key": "folder1/cli_test - コピー.txt", "VersionId": "NfCRi2U7m5DyZWQu0D3DnaGbmkzQaOrX", "IsLatest": true, "LastModified": "2021-09-23T20:06:15.000Z", "Owner": { "DisplayName": "emixxxxxxxx", "ID": "2772a153121e9cbe9581864de8f1361efbf95ad8dd8b78260" } }, { "ETag": "¥"d41d8cd98f00b204e9800998ecf8427e¥"", "Size": 0, "StorageClass": "STANDARD", "Key": "folder1/cli_test.txt", "VersionId": "cheFC4vtWokDYqTgkPtltszkZmg8HvVM", "IsLatest": true, "LastModified": "2021-09-23T20:06:15.000Z", "Owner": { "DisplayName": "emixxxxxxxx", "ID": "2772a153121e9cbe9581864de8f1361efbf95ad8dd8b7826009" } }, { "ETag": "¥"d41d8cd98f00b204e9800998ecf8427e¥"", "Size": 0, "StorageClass": "STANDARD", "Key": "folder2/", "VersionId": "O6U87cFpFSOiDuERWtfPF6hPnzvh9.Fw", "IsLatest": true, "LastModified": "2021-09-23T20:05:30.000Z", "Owner": { "DisplayName": "emixxxxxxxx", "ID": "2772a153121e9cbe9581864de8f1361efbf95ad8dd8b7826" } }, { "ETag": "¥"d41d8cd98f00b204e9800998ecf8427e¥"", "Size": 0, "StorageClass": "STANDARD", "Key": "folder2/cli_testxx.txt", "VersionId": "jIf_B6NsidsQQPiJ_lNRZHrkrulm6Ske", "IsLatest": false, "LastModified": "2021-09-23T20:06:30.000Z", "Owner": { "DisplayName": "emixxxxxxxx", "ID": "2772a153121e9cbe9581864de8f1361efbf95ad8dd8b7826" } }, { "ETag": "¥"d41d8cd98f00b204e9800998ecf8427e¥"", "Size": 0, "StorageClass": "STANDARD", "Key": "folder2/cli_testyy.txt", "VersionId": "wmYIzc8DqMObcus.EyH5WkVX1LxepO2l", "IsLatest": true, "LastModified": "2021-09-23T20:06:30.000Z", "Owner": { "DisplayName": "emixxxxxxxx", "ID": "2772a153121e9cbe9581864de8f1361efbf95ad8d" } }, { "ETag": "¥"d41d8cd98f00b204e9800998ecf8427e¥"", "Size": 0, "StorageClass": "STANDARD", "Key": "folder2/cli_testzz.txt", "VersionId": "ehTMB_gngE44z6Ygyo3MiATXKknndNbX", "IsLatest": true, "LastModified": "2021-09-23T20:06:30.000Z", "Owner": { "DisplayName": "emixxxxxxxx", "ID": "2772a153121e9cbe9581864de8f1361efbf95ad8dd8b782600" } }, { "ETag": "¥"d41d8cd98f00b204e9800998ecf8427e¥"", "Size": 0, "StorageClass": "STANDARD", "Key": "folder3/", "VersionId": "kqExb_gVDHJdxAK6WgU7P70uk2Jh_DlY", "IsLatest": false, "LastModified": "2021-09-23T20:05:36.000Z", "Owner": { "DisplayName": "emixxxxxxxx", "ID": "2772a153121e9cbe9581864de8f1361efbf95ad8dd8b782" } }, { "ETag": "¥"d41d8cd98f00b204e9800998ecf8427e¥"", "Size": 0, "StorageClass": "STANDARD", "Key": "folder3/cli_test98.txt", "VersionId": "AGVIuRnjfTPQbxI0Px77tQbE5niHhWyZ", "IsLatest": false, "LastModified": "2021-09-23T20:06:44.000Z", "Owner": { "DisplayName": "emixxxxxxxx", "ID": "2772a153121e9cbe9581864de8f1361efbf95ad8dd8b78260" } }, { "ETag": "¥"d41d8cd98f00b204e9800998ecf8427e¥"", "Size": 0, "StorageClass": "STANDARD", "Key": "folder3/cli_test99.txt", "VersionId": "NWmHhxn2VJAeTFocapox5_a_qEYbgsvt", "IsLatest": false, "LastModified": "2021-09-23T20:06:44.000Z", "Owner": { "DisplayName": "emixxxxxxxx", "ID": "2772a153121e9cbe9581864de8f1361efbf95ad8dd8b78260" } }, { "ETag": "¥"d41d8cd98f00b204e9800998ecf8427e¥"", "Size": 0, "StorageClass": "STANDARD", "Key": "test1.txt", "VersionId": "yjatJyJdz1WtMrqwv7GVEiukkxG8MHB9", "IsLatest": false, "LastModified": "2021-09-23T20:05:59.000Z", "Owner": { "DisplayName": "emixxxxxxxx", "ID": "2772a153121e9cbe9581864de8f1361efbf95ad8dd8b78" } }, { "ETag": "¥"d41d8cd98f00b204e9800998ecf8427e¥"", "Size": 0, "StorageClass": "STANDARD", "Key": "test2.txt", "VersionId": "o4oWEwvo_2P_c9_WCBrS.wSE5jguevMV", "IsLatest": true, "LastModified": "2021-09-23T20:05:59.000Z", "Owner": { "DisplayName": "emixxxxxxxx", "ID": "2772a153121e9cbe9581864de8f1361efbf95ad8d" } } ], "DeleteMarkers": [ { "Owner": { "DisplayName": "emixxxxxxxx", "ID": "2772a153121e9cbe9581864de8f1361efbf95" }, "Key": "folder2/cli_testxx.txt", "VersionId": "DuYgTonHE9aaHL2t0NJlI0WMB3aSau09", "IsLatest": true, "LastModified": "2021-09-23T20:07:23.000Z" }, { "Owner": { "DisplayName": "emixxxxxxxx", "ID": "2772a153121e9cbe9581864de8f1361efbf95ad8dd8b78260096d9a55e36c3f3" }, "Key": "folder3/cli_test98.txt", "VersionId": "IKhFzixbzCVFyOocNf58bboDBBESbnuK", "IsLatest": true, "LastModified": "2021-09-23T20:07:40.000Z" }, { "Owner": { "DisplayName": "emixxxxxxxx", "ID": "2772a153121e9cbe9581864de8f1361efbf95ad8dd8b78260096d9a55e36c3f3" }, "Key": "folder3/cli_test99.txt", "VersionId": "hpQ0ox92OeI7xSLOPL5gtvD5WM_ko45S", "IsLatest": true, "LastModified": "2021-09-23T20:07:40.000Z" }, { "Owner": { "DisplayName": "emixxxxxxxx", 8b78260096d9a55e36c3f3 "ID": "2772a153121e9cbe9581864de8f1361efbf95ad8dd" }, "Key": "test1.txt", "VersionId": "vM7BCcSGEZIDnhiT9h13OBECX.zE0tPZ", "IsLatest": true, "LastModified": "2021-09-23T20:06:59.000Z" } ] } [ec2-user@ip-10-0-0-31%]$ オブジェクトのバージョンIDを取得 • 要素を見ていくと Versionsセクション DeleteMarkers セクション
  6. 1⃣うわーーーと抽出した Versionsセクションから folder2のcli_testyy.txtを 探してきます 2⃣キーとバージョンIDを 変数に格納 3⃣aws s3api delete-objectコマンドの オプションにバケット名、キー、バージョンIDを

    指定し削除実行 オブジェクトを削除してみる • 削除マーカーがついていないオブジェクトを削除してみる ( folder2/cli_testyy.txt ) 抽出結果 実行コマンド
  7. オブジェクトを削除してみる バージョニング有効 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/ 削除マーカー 削除マーカー 削除マーカー 削除マーカー
  8. オブジェクトを削除してみる バージョニング有効 S3バケット test1.txt test2.txt cli_text.txt cli_test - コピー.txt cli_testxx.txt

    cli_testzz.txt cli_test98.txt cli_test99.txt folder1/ folder2/ folder3/ 削除マーカー 削除マーカー 削除マーカー 削除マーカー folder2/cli_testyy.txtが 消えており削除マーカーもない
  9. バージョニング有効 S3バケット test1.txt test2.txt cli_text.txt cli_test - コピー.txt cli_testxx.txt cli_testzz.txt

    cli_test98.txt cli_test99.txt folder1/ folder2/ folder3/ 削除マーカー 削除マーカー 削除マーカー 削除マーカー 削除マーカーを削除する
  10. バージョニング有効 S3バケット test1.txt test2.txt cli_text.txt cli_test - コピー.txt cli_testxx.txt cli_testzz.txt

    cli_test98.txt cli_test99.txt folder1/ folder2/ folder3/ 削除マーカー 削除マーカー 削除マーカー 削除マーカーが消え folder2/cli_testxx.txt復活 削除マーカーを削除する
  11. 1⃣うわーーーと抽出した Versionsセクションから バケット直下のtest1.txtを 探してきます 2⃣キーとバージョンIDを 変数に格納 3⃣aws s3api delete-objectコマンドの オプションにバケット名、キー、バージョンIDを

    指定し削除実行 • バケット直下のtest1.txt を削除する 抽出結果 実行コマンド 削除マーカーがついている古いバージョンの オブジェクトを削除する
  12. バージョニング有効 S3バケット test1.txt の残骸 test2.txt cli_text.txt cli_test - コピー.txt cli_testxx.txt

    cli_testzz.txt cli_test98.txt cli_test99.txt folder1/ folder2/ folder3/ 削除マーカー 削除マーカー 削除マーカー 削除マーカーは残したまま 削除マーカーがついている古いバージョンの オブジェクトを削除する
  13. バージョニング有効 S3バケット test2.txt cli_text.txt cli_test - コピー.txt cli_testxx.txt cli_testzz.txt cli_test98.txt

    cli_test99.txt folder1/ folder2/ folder3/ 削除マーカー 削除マーカー 削除マーカー 削除マーカーだけ残っている • 古いオブジェクトが消えて、削除マーカーだけが残っている オブジェクトの残骸は消えている 削除マーカーがついている古いバージョンの オブジェクトを削除する
  14. 1⃣うわーーーと抽出した DeleteMarkersセクションから フォルダ直下のtest1.txtを 探してきます 2⃣キーとバージョンIDを 変数に格納 3⃣aws s3api delete-objectコマンドの オプションにバケット名、キー、バージョンIDを

    指定し削除実行 古いバージョンのオブジェクトがなく 削除マーカーだけ残された状態の 削除マーカーを削除する 抽出結果 実行コマンド
  15. 古いバージョンのオブジェクトがなく 削除マーカーだけ残された状態の 削除マーカーを削除する バージョニング有効 S3バケット test2.txt cli_text.txt cli_test - コピー.txt

    cli_testxx.txt cli_testzz.txt cli_test98.txt cli_test99.txt folder1/ folder2/ folder3/ 削除マーカー 削除マーカー 削除マーカー 残された削除マーカーを削除する
  16. 古いバージョンのオブジェクトがなく 削除マーカーだけ残された状態の 削除マーカーを削除する バージョニング有効 S3バケット test2.txt cli_text.txt cli_test - コピー.txt

    cli_testxx.txt cli_testzz.txt cli_test98.txt cli_test99.txt folder1/ folder2/ folder3/ 削除マーカー 削除マーカー 削除マーカーもオブジェクトも消えた 実験おわり
  17. バージョニング有効な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
  18. まとめ • バージョニング有効のS3バケット内オブジェクトの削除は ざっくり以下2ステップ ①バージョンIDの取得 aws s3api list-object-versions ②削除コマンド実行 aws

    s3api delete-object • 削除マーカーを削除するとオブジェクトは復活する • オブジェクトを完全に削除するには バージョンIDを指定して削除する • JAWS-UG CLI専門支部はすごい すごい
  19. 参考 • バージョニングが有効なバケットで削除された Amazon S3 オブジェクトを取得するにはどうすれば よいですか? https://aws.amazon.com/jp/premiumsupport/knowledge-center/s3-undelete-configuration/ • S3

    オブジェクトの過去バージョンを一括削除する(AWS社員様のブログ) https://yohei-a.hatenablog.jp/entry/20191020/1571504826 • s3api https://docs.aws.amazon.com/cli/latest/reference/s3api/ • list-object-versions https://docs.aws.amazon.com/cli/latest/reference/s3api/list-object-versions.html • delete-object https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-object.html • JQコマンド https://stedolan.github.io/jq/ • JQコマンドリファレンス https://stedolan.github.io/jq/manual/ • 2020年10月8日 JAWS-UG CLI専門支部 #169R S3基礎 バージョニング https://jawsug-cli.connpass.com/event/188822/