バージョニングが有効なバケットで削除された Amazon S3 オブジェクトを取得するにはどうすればよいですか?

最終更新日: 2021 年 8 月 26 日

バージョニングが有効になっている Amazon Simple Storage Service (Amazon S3) バケットから削除されたオブジェクトを取得したいと考えています。どうすればそれができますか?

簡単な説明

バージョニング対応のバケットからオブジェクトを削除すると、Amazon S3 はそのオブジェクトの削除マーカーを作成します。削除マーカーがオブジェクトの最新バージョンになり、実際のオブジェクトが以前のバージョンになります。削除マーカーを使用すると、Amazon S3 はオブジェクトが削除されたかのようにオブジェクトのリクエストに応答します。例えば、オブジェクトの GET リクエストを送信すると、Amazon S3 はエラーを返します。

バージョニング対応のバケットから削除されたオブジェクトは、次のいずれかの方法で取得できます。

  • 以前のバージョンのオブジェクトをダウンロードする: 以前のバージョンのオブジェクト (実際のオブジェクト) をダウンロードするには、s3:GetObjectVersion に対するアクセス許可が必要です。
  • 削除マーカーを削除する: 削除マーカーを削除すると、実際のオブジェクトがオブジェクトの最新バージョンになります。削除マーカーを削除するには、s3:DeleteObjectVersion へのアクセス許可が必要です。また、バケットを所有または作成した AWS アカウントを使用して削除マーカーを削除する必要があります。
    注意: バケットに [MFA Delete-enabled] がある場合、指定した Multi-Factor Authentication (MFA) を使用して削除マーカーを削除する必要があります。

解決方法

Amazon S3 コンソールを使用してオブジェクトの以前のバージョンをダウンロードする

1.    Amazon S3 コンソールを開きます。

2.    バケット一覧から、削除されたオブジェクトのバケットを開きます。

3.    削除されたオブジェクトのフォルダに移動します。

4.    [バージョンのリスト表示] をオンにします。

5.    検索バーに、削除したオブジェクトの名前を入力します。

6.    オブジェクトの以前のバージョン (削除マーカーではなく実際のオブジェクト) を選択します。[アクション] を選択してから、[ダウンロード] をクリックします。

AWS Command Line Interface (AWS CLI) を使用して、オブジェクトの以前のバージョンをダウンロードする

注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

1.    バケットで list-object-versions コマンドを実行します。

ヒント: 次のコマンドの例には、--prefix オプションが含まれており、指定したキー名のプレフィックスに結果をフィルタリングします。このオプションにより、バケットに大量のオブジェクトバージョンが含まれている場合、結果の数を減らして時間を節約できます。

aws s3api list-object-versions --bucket DOC-EXAMPLE-BUCKET --prefix example.txt

2.    コマンド出力から、オブジェクトの以前のバージョン ID (削除マーカーではなく実際のオブジェクト) をコピーします。

3.    前のステップでコピーしたバージョン ID に対して get-object コマンドを実行します。

aws s3api get-object --bucket DOC-EXAMPLE-BUCKET --key example.txt --version-id example.d6tjAKF1iObKbEnNQkIMPjj

Amazon S3 コンソールを使用して削除マーカーを削除する

1.    削除されたオブジェクトのバケットを所有または作成した AWS アカウントから Amazon S3 コンソールを開きます。

2.    バケット一覧から、削除されたオブジェクトのバケットを開きます。

3.    削除されたオブジェクトのフォルダに移動します。

4.    [バージョンのリスト表示] をオンにします。

5.    検索バーに、削除したオブジェクトの名前を入力します。

6.    オブジェクトの削除マーカーを選択します。

警告: 選択内容を慎重に確認し、削除マーカーであることを確認します。オブジェクトバージョンを削除した場合は取得できません。

7.    [削除] を選択します。

8.    [オブジェクトの削除] ページで、正しい削除マーカーが一覧表示されていることを確認します。次に、「permanently delete」と入力して削除を確定します。

9.    [オブジェクトの削除 ] を選択します。

重要: Amazon S3 コンソールを使ってフォルダの削除を取り消すことはできません。これを行うには、AWS CLI または AWS SDK を使用する必要があります。

AWS CLI を使用して削除マーカーを削除する

複数のオブジェクトの削除マークを削除する

1.    次の --query パラメータを使用して list-object-versions コマンドを実行します。

ヒント: 次のコマンドの例には、--prefix オプションが含まれており、指定したキー名のプレフィックスに結果をフィルタリングします。これにより、バケットに多数の削除マーカーが含まれている場合、結果の数を減らし、時間を節約できます。

aws s3api list-object-versions --bucket DOC-EXAMPLE-BUCKET --prefix example.txt --query 'DeleteMarkers[?IsLatest==`true`]'

2.    このコマンドは、バケット内で削除されたすべてのオブジェクトを返します。コマンド出力から、取得するオブジェクトの削除マーカーのバージョン ID をコピーします。

警告: バージョン ID が削除マーカーのバージョン ID であることを確認してください。オブジェクトバージョンを削除した場合は取得できません。

3.    前のステップでコピーしたバージョン ID に対して delete-object コマンドを実行します。

aws s3api delete-object --bucket DOC-EXAMPLE-BUCKET --key example.txt --version-id 'example.d6tjAKF1iObKbEnNQkIMPjj'

4.    削除マーカーを削除すると、バケット内のオブジェクトを一覧表示するときに実際のオブジェクトが返されます。削除マーカーが削除されたことを確認するには、ls コマンドを実行します。

aws s3 ls s3://DOC-EXAMPLE-BUCKET

何千ものオブジェクトの削除マーカーを削除する

1.    AWS CloudShell に移動します。

2.    以下の AWS CLI コマンドを実行します。

aws s3api list-object-versions --bucket DOC-EXAMPLE-BUCKET --prefix examplefolder/ --output json --query 'DeleteMarkers[?IsLatest==`true`].[Key, VersionId]' | jq -r '.[] | "--key '\''" + .[0] + "'\'' --version-id " + .[1]' | xargs -L1 aws s3api delete-object --bucket DOC-EXAMPLE-BUCKET

注: この例では、JQ ツールを使用して、現在のバージョンである DeleteMarkerListObjectVersions レスポンスを解析します。デフォルトでは、JQ は AWS CloudShell にインストールされます。さらに、キーボードまたはポインタを使用してシェル環境を 20~30 分間操作しない場合、シェルセッションは終了します。

何百万ものオブジェクトの削除マーカーを削除する

バケットに何百万ものオブジェクトがある場合、LIST コールの実行にコストがかかり、タイムアウトが発生する可能性があります。したがって、AWS SDK でカスタムスクリプトを使用することを検討してください。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?