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バケットのオブジェクト削除
    2021/10/7(木)
    JAWS-UG CLI専門支部
    #230R AWS CLI環境入門(Cloud9)

    View Slide

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

    View Slide

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

    View Slide

  4. バージョニング有効なS3の
    オブジェクトを
    CLIで削除したい

    View Slide

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

    View Slide

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

    View Slide

  7. バージョニング有効
    S3バケット
    test1.txt
    の残骸。見えない
    test2.txt
    削除マーカー
    (補足)削除マーカー
    • バージョニングが有効なS3バケットでオブジェクトを削除すると「削除
    マーカー」が作られる
    • 削除マーカーを削除するとオブジェクトが復活する
    オブジェクトを
    削除

    View Slide

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

    View Slide

  9. オブジェクトの
    バージョンIDを取得

    View Slide

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

    View Slide

  11. [[email protected]%]$ 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"
    }
    ]
    }
    [[email protected]%]$
    • うわーーーーーーー
    オブジェクトのバージョンIDを取得

    View Slide

  12. [[email protected]%]$ 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"
    }
    ]
    }
    [[email protected]%]$
    オブジェクトのバージョンIDを取得
    • 要素を見ていくと
    Versionsセクション DeleteMarkers
    セクション

    View Slide

  13. オブジェクトのバージョンIDを取得
    • 要素を見ていくと
    :
    :
    1セット
    “Versions”セクション

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  17. オブジェクトを削除してみる
    • 削除マーカーがついていないオブジェクトを削除してみる
    ( folder2/cli_testyy.txt )
    削除マーカーとか
    何もついていないオブジェクト

    View Slide

  18. 1⃣うわーーーと抽出した
    Versionsセクションから
    folder2のcli_testyy.txtを
    探してきます
    2⃣キーとバージョンIDを
    変数に格納
    3⃣aws s3api delete-objectコマンドの
    オプションにバケット名、キー、バージョンIDを
    指定し削除実行
    オブジェクトを削除してみる
    • 削除マーカーがついていないオブジェクトを削除してみる
    ( folder2/cli_testyy.txt )
    抽出結果
    実行コマンド

    View Slide

  19. オブジェクトを削除してみる
    • 実行結果↓
    バージョンIDが表示され
    エラーなく終了すればOK

    View Slide

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

    View Slide

  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/
    削除マーカー
    削除マーカー
    削除マーカー
    削除マーカー

    View Slide

  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が
    消えており削除マーカーもない

    View Slide

  23. 削除マーカーを削除する

    View Slide

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

    View Slide

  25. 1⃣うわーーーと抽出した
    DeleteMarkersセクションから
    folder2のcli_testxx.txtを
    探してきます
    2⃣キーとバージョンIDを
    変数に格納
    3⃣aws s3api delete-objectコマンドの
    オプションにバケット名、キー、バージョンIDを
    指定し削除実行
    削除マーカーを削除する
    • 削除マーカーを削除してみる( folder2/cli_testxx.txt)
    抽出結果
    実行コマンド

    View Slide

  26. 削除マーカーを削除する
    • 実行結果↓
    エラーなく終了すればOK

    View Slide

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

    View Slide

  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/
    削除マーカー
    削除マーカー
    削除マーカー
    削除マーカー
    削除マーカーを削除する

    View Slide

  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復活
    削除マーカーを削除する

    View Slide

  30. 削除マーカーがついている
    古いバージョンの
    オブジェクトを削除する
    挙動が気になるのでやってみた

    View Slide

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

    View Slide

  32. 1⃣うわーーーと抽出した
    Versionsセクションから
    バケット直下のtest1.txtを
    探してきます
    2⃣キーとバージョンIDを
    変数に格納
    3⃣aws s3api delete-objectコマンドの
    オプションにバケット名、キー、バージョンIDを
    指定し削除実行
    • バケット直下のtest1.txt を削除する
    抽出結果
    実行コマンド
    削除マーカーがついている古いバージョンの
    オブジェクトを削除する

    View Slide

  33. • 実行結果↓
    バージョンIDが表示され
    エラーなく終了すればOK
    削除マーカーがついている古いバージョンの
    オブジェクトを削除する

    View Slide

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

    View Slide

  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/
    削除マーカー
    削除マーカー
    削除マーカー
    削除マーカーは残したまま
    削除マーカーがついている古いバージョンの
    オブジェクトを削除する

    View Slide

  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/
    削除マーカー
    削除マーカー
    削除マーカー
    削除マーカーだけ残っている
    • 古いオブジェクトが消えて、削除マーカーだけが残っている
    オブジェクトの残骸は消えている
    削除マーカーがついている古いバージョンの
    オブジェクトを削除する

    View Slide

  37. 古いバージョンのオブジェクトがなく、
    削除マーカーだけ残された状態の
    削除マーカーを削除する
    日本語で表現しづらい

    View Slide

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

    View Slide

  39. 1⃣うわーーーと抽出した
    DeleteMarkersセクションから
    フォルダ直下のtest1.txtを
    探してきます
    2⃣キーとバージョンIDを
    変数に格納
    3⃣aws s3api delete-objectコマンドの
    オプションにバケット名、キー、バージョンIDを
    指定し削除実行
    古いバージョンのオブジェクトがなく
    削除マーカーだけ残された状態の
    削除マーカーを削除する
    抽出結果
    実行コマンド

    View Slide

  40. エラーなく終了すればOK
    古いバージョンのオブジェクトがなく
    削除マーカーだけ残された状態の
    削除マーカーを削除する

    View Slide

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

    View Slide

  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/
    削除マーカー
    削除マーカー
    削除マーカー
    残された削除マーカーを削除する

    View Slide

  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/
    削除マーカー 削除マーカー
    削除マーカーもオブジェクトも消えた
    実験おわり

    View Slide

  44. (余談)過去にやってた
    2020年10月8日
    JAWS-UG CLI 専門支部 #169R S3基礎 バージョニング
    ちょうど1年前くらい

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  50. まとめ
    • バージョニング有効のS3バケット内オブジェクトの削除は
    ざっくり以下2ステップ
    ①バージョンIDの取得 aws s3api list-object-versions
    ②削除コマンド実行 aws s3api delete-object
    • 削除マーカーを削除するとオブジェクトは復活する
    • オブジェクトを完全に削除するには
    バージョンIDを指定して削除する
    • JAWS-UG CLI専門支部はすごい
    すごい

    View Slide

  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/

    View Slide