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

所要時間2分
0

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

簡単な説明

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

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

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

解決方法

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

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

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

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

4.    [Show versions] (バージョンを表示) をオンにします。

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

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

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

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

1.    バケットで list-object-versions コマンドを実行します。DOC-EXAMPLE-BUCKET をバケットの名前に置き換えます。

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

注意: この例には、指定されたキー名プレフィックスに結果をフィルタリングする --prefix オプションが含まれています。このオプションは結果の数を減らすのに役立ち、バケットに大量のオブジェクトバージョンが含まれている場合は時間を短縮できます。

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

3.    前のステップでコピーしたバージョン ID に対して get-object コマンドを実行します。DOC-EXAMPLE-BUCKET をバケットの名前に置き換えます。

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

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

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

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

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

4.    [Show versions] (バージョンを表示) をオンにします。

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

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

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

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

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

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

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

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

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

1.    次の --query パラメータを使用して list-object-versions コマンドを実行します。DOC-EXAMPLE-BUCKET をバケットの名前に置き換えます。

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

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

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

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

3.    前のステップでコピーしたバージョン ID に対して delete-object コマンドを実行します。DOC-EXAMPLE-BUCKET をバケットの名前に置き換えます。

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

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

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

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

1.    AWS CloudShell に移動します。

2.    次の AWS CLI コマンドを実行します。DOC-EXAMPLE-BUCKET をバケットの名前に置き換えます。

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

注意: この例では、GitHub の JQ ツールを使用して、現在のバージョンの DeleteMarkersListObjectVersions レスポンスを解析します。このカスタムスクリプト例は、特定のユースケースに基づいて変更できます。デフォルトでは、JQ は AWS CloudShell にインストールされます。シェル環境とインタラクションしないと、シェルセッションは終了します。

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

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


AWS公式
AWS公式更新しました 2年前