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

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

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

97b3cca999b52cb5296675ac0a5c12cd?s=128

emi

October 03, 2021
Tweet

Transcript

  1. バージョニング有効な S3バケットのオブジェクト削除 2021/10/7(木) JAWS-UG CLI専門支部 #230R AWS CLI環境入門(Cloud9)

  2. 事の発端 ~AWS SAMのチュートリアル~ 「AWS SAM触ってみた奮闘記」資料の後半をご参照ください https://speakerdeck.com/emiki/aws-samhong-tutemitafen-dou-ji

  3. S3バケットを含むCFnスタックが消せない • SAMチュートリアルで作られるS3バケットはデフォルトでバージョニング有効 aws s3 rb s3://{バケット名} --force ⇒バケットを削除する(空でなくても削除される) コマンドでも消せない

    --forceオプションをつければどんなバケットも消えると思っていた…
  4. バージョニング有効なS3の オブジェクトを CLIで削除したい

  5. バージョニング有効な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 を実行 し、オブジェクトを削除する
  6. バージョニング有効 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を用意しておきます
  7. バージョニング有効 S3バケット test1.txt の残骸。見えない test2.txt 削除マーカー (補足)削除マーカー • バージョニングが有効なS3バケットでオブジェクトを削除すると「削除 マーカー」が作られる

    • 削除マーカーを削除するとオブジェクトが復活する オブジェクトを 削除
  8. バージョニング有効 S3バケット test1.txt 復活する test2.txt 削除マーカー 削除マーカーを 削除 「削除した」という操作をなかったことにする (補足)削除マーカー

    • バージョニングが有効なS3バケットでオブジェクトを削除すると「削除 マーカー」が作られる • 削除マーカーを削除するとオブジェクトが復活する
  9. オブジェクトの バージョンIDを取得

  10. オブジェクトのバージョンIDを取得 • オブジェクトのバージョンIDを取得します • ① aws s3api list-object-versions バケット名を変数に格納 バケット名を指定し

    バージョンIDのリストを取得 Enter
  11. [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を取得
  12. [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 セクション
  13. オブジェクトのバージョンIDを取得 • 要素を見ていくと : : 1セット “Versions”セクション

  14. オブジェクトのバージョンIDを取得 • 要素を見ていくと : 1セット “DeleteMarkers”セクション(削除マーカーのこと) :

  15. オブジェクトを削除してみる

  16. オブジェクトの削除 • S3バケット名と取得したキーとバージョンIDを指定して実行す ればオブジェクトを削除できる • ②aws s3api delete-object ¥ •

    --bucket ${S3BUCKET_NAME} ¥ • --key ${KEY} ¥ • --version-id ${VER}
  17. オブジェクトを削除してみる • 削除マーカーがついていないオブジェクトを削除してみる ( folder2/cli_testyy.txt ) 削除マーカーとか 何もついていないオブジェクト

  18. 1⃣うわーーーと抽出した Versionsセクションから folder2のcli_testyy.txtを 探してきます 2⃣キーとバージョンIDを 変数に格納 3⃣aws s3api delete-objectコマンドの オプションにバケット名、キー、バージョンIDを

    指定し削除実行 オブジェクトを削除してみる • 削除マーカーがついていないオブジェクトを削除してみる ( folder2/cli_testyy.txt ) 抽出結果 実行コマンド
  19. オブジェクトを削除してみる • 実行結果↓ バージョンIDが表示され エラーなく終了すればOK

  20. オブジェクトを削除してみる • バージョン表示ONでも消えている • 削除マーカーは残らない folder2/cli_testyy.txtが 消えており削除マーカーもない

  21. オブジェクトを削除してみる バージョニング有効 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/ 削除マーカー 削除マーカー 削除マーカー 削除マーカー
  22. オブジェクトを削除してみる バージョニング有効 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が 消えており削除マーカーもない
  23. 削除マーカーを削除する

  24. 削除マーカーを削除する • 削除マーカーを削除してみる( folder2/cli_testxx.txt)

  25. 1⃣うわーーーと抽出した DeleteMarkersセクションから folder2のcli_testxx.txtを 探してきます 2⃣キーとバージョンIDを 変数に格納 3⃣aws s3api delete-objectコマンドの オプションにバケット名、キー、バージョンIDを

    指定し削除実行 削除マーカーを削除する • 削除マーカーを削除してみる( folder2/cli_testxx.txt) 抽出結果 実行コマンド
  26. 削除マーカーを削除する • 実行結果↓ エラーなく終了すればOK

  27. 削除マーカーを削除する • バージョン表示オフしてもcli_testxx.txtが見える • 削除マーカーを消すとcli_testxx.txtが復活するのが確認できた folder2/cli_testxx.txt 復活

  28. バージョニング有効 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/ 削除マーカー 削除マーカー 削除マーカー 削除マーカー 削除マーカーを削除する
  29. バージョニング有効 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復活 削除マーカーを削除する
  30. 削除マーカーがついている 古いバージョンの オブジェクトを削除する 挙動が気になるのでやってみた

  31. 削除マーカーがついている古いバージョンの オブジェクトを削除する • バケット直下のtest1.txt を削除する 削除マーカーは残したまま こっちの古いオブジェクトの方を 削除してみる

  32. 1⃣うわーーーと抽出した Versionsセクションから バケット直下のtest1.txtを 探してきます 2⃣キーとバージョンIDを 変数に格納 3⃣aws s3api delete-objectコマンドの オプションにバケット名、キー、バージョンIDを

    指定し削除実行 • バケット直下のtest1.txt を削除する 抽出結果 実行コマンド 削除マーカーがついている古いバージョンの オブジェクトを削除する
  33. • 実行結果↓ バージョンIDが表示され エラーなく終了すればOK 削除マーカーがついている古いバージョンの オブジェクトを削除する

  34. • 古いオブジェクトが消えて、削除マーカーだけが残っている 削除マーカーだけ残っている 削除マーカーがついている古いバージョンの オブジェクトを削除する

  35. バージョニング有効 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/ 削除マーカー 削除マーカー 削除マーカー 削除マーカーは残したまま 削除マーカーがついている古いバージョンの オブジェクトを削除する
  36. バージョニング有効 S3バケット test2.txt cli_text.txt cli_test - コピー.txt cli_testxx.txt cli_testzz.txt cli_test98.txt

    cli_test99.txt folder1/ folder2/ folder3/ 削除マーカー 削除マーカー 削除マーカー 削除マーカーだけ残っている • 古いオブジェクトが消えて、削除マーカーだけが残っている オブジェクトの残骸は消えている 削除マーカーがついている古いバージョンの オブジェクトを削除する
  37. 古いバージョンのオブジェクトがなく、 削除マーカーだけ残された状態の 削除マーカーを削除する 日本語で表現しづらい

  38. 残された削除マーカーを 削除してみる 古いバージョンのオブジェクトがなく 削除マーカーだけ残された状態の 削除マーカーを削除する

  39. 1⃣うわーーーと抽出した DeleteMarkersセクションから フォルダ直下のtest1.txtを 探してきます 2⃣キーとバージョンIDを 変数に格納 3⃣aws s3api delete-objectコマンドの オプションにバケット名、キー、バージョンIDを

    指定し削除実行 古いバージョンのオブジェクトがなく 削除マーカーだけ残された状態の 削除マーカーを削除する 抽出結果 実行コマンド
  40. エラーなく終了すればOK 古いバージョンのオブジェクトがなく 削除マーカーだけ残された状態の 削除マーカーを削除する

  41. 古いバージョンのオブジェクトがなく 削除マーカーだけ残された状態の 削除マーカーを削除する • 復活することもなく、完全に削除されている

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

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

    cli_testxx.txt cli_testzz.txt cli_test98.txt cli_test99.txt folder1/ folder2/ folder3/ 削除マーカー 削除マーカー 削除マーカーもオブジェクトも消えた 実験おわり
  44. (余談)過去にやってた 2020年10月8日 JAWS-UG CLI 専門支部 #169R S3基礎 バージョニング ちょうど1年前くらい

  45. • すごいおしゃれにバージョンID取得されてます • 実行結果↓ (余談)過去にやってた あんなに大量の出力が こんなに鮮やかに1行で… 一番新しいバージョンIDは[0] 二番目に新しいバージョンIDは[1] 三番目のバージョンIDは[2]

    :
  46. • 同様に削除マーカーも取得できる • 実行結果↓ (余談)過去にやってた

  47. バージョニング有効な S3バケット内に 何千もオブジェクトがあったら?

  48. バージョニング有効な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
  49. バージョニング有効なS3バケット内に何千も オブジェクトがあったら? • JQコマンドが使える https://stedolan.github.io/jq/manual/ • JSONから値を抜き出したり、集計したり、整形して表示したり できるコマンド • 今回のようなS3バケットの削除がもう少しスマートにできる

    • CloudShellだとJQコマンドがデフォルトで導入されているが Cloud9環境には導入されていない
  50. まとめ • バージョニング有効のS3バケット内オブジェクトの削除は ざっくり以下2ステップ ①バージョンIDの取得 aws s3api list-object-versions ②削除コマンド実行 aws

    s3api delete-object • 削除マーカーを削除するとオブジェクトは復活する • オブジェクトを完全に削除するには バージョンIDを指定して削除する • JAWS-UG CLI専門支部はすごい すごい
  51. 参考 • バージョニングが有効なバケットで削除された 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/