Ongoing service disruptions
For the most recent update on ongoing service disruptions affecting the AWS Middle East (UAE) Region (ME-CENTRAL-1), refer to the AWS Health Dashboard. For information on AWS Service migration, see How do I migrate my services to another region?
バージョニングが有効な汎用バケットから削除した Amazon S3 オブジェクトを再取得する方法を教えてください。
バージョニングが有効な Amazon Simple Storage Service (Amazon S3) 汎用バケットから削除したオブジェクトを再取得したいと考えています。
簡単な説明
注: S3 バージョニングは汎用バケットでのみ使用できます。ディレクトリとテーブルバケットでは、S3 バージョニングはサポートされません。
バージョニングが有効なバケットからオブジェクトを削除すると、Amazon S3 はそのオブジェクトに削除マーカーを付与します。削除マーカーがオブジェクトの現行バージョンになり、そのオブジェクト自体は過去のバージョンになります。削除マーカーが付与されている場合、オブジェクトへリクエストが行われると、Amazon S3 はそのオブジェクトが削除されている場合と同様に応答します。たとえば、オブジェクトに GET リクエストを送信した場合、Amazon S3 はエラーを返します。
バージョニングが有効なバケットから削除したオブジェクトを再取得するには、次のいずれかの手順を実行します。
- 以前のバージョンのオブジェクトをダウンロードします。s3:GetObjectVersion 権限が必要です。
- s3:DeleteObjectVersion 権限を持つ AWS アカウントを使用して削除マーカーを取り消します。削除されていない最新のバージョンが現行バージョンとなり、バージョニングされたバケットから以前削除したオブジェクトにアクセスできるようになります。
- 注: バケットに多要素認証 (MFA) 削除が構成されている場合は、MFA 削除を使用して削除マーカーを取り消す必要があります。
解決策
重要: バケットから完全に削除したデータを復元することはできません。
Amazon S3 コンソールを使用してオブジェクトの以前のバージョンをダウンロードする
次の手順を実行します。
- Amazon S3 コンソールを開きます。
- ナビゲーションペインで [バケット] を選択し、削除したオブジェクトのバケットを選択します。
- オブジェクトのバージョンリストを表示するには、[バージョンを表示] を有効にします。
- 再取得する削除済みオブジェクトのバージョンを選択します。
- [アクション] を選択し、[ダウンロード] を選択します。
AWS CLI を使用して、オブジェクトの以前のバージョンをダウンロードする
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。次のコマンドの DOC-EXAMPLE-BUCKET をバケット名に置き換えてください。
次の手順を実行します。
-
list-object-versions コマンドを実行してオブジェクトのバージョンを一覧表示します。
aws s3api list-object-versions --bucket DOC-EXAMPLE-BUCKET --prefix examplefolder/注: 上記のコマンドには、結果を指定されたキー名のプレフィックスに絞り込むための --prefix オプションが指定されています。バケットに多数のオブジェクトバージョンが含まれている場合は、このオプションを使用して表示される結果を削減します。
-
コマンドの出力から、オブジェクトの以前のバージョンのバージョン ID を書き留めます。
-
get-object コマンドを実行してバージョンを取得します。
aws s3api get-object --bucket DOC-EXAMPLE-BUCKET --key example.txt --version-id example.d6tjAKF1iObKbEnNQkIMPjj filename.txt
Amazon S3 コンソールを使用して削除マーカーを取り消す
次の手順を実行します。
- 削除されたオブジェクトのバケットを所有するアカウントから、Amazon S3 コンソールを開きます。
- ナビゲーションペインで [バケット] を選択し、削除したオブジェクトのバケットを選択します。
- オブジェクトのバージョンリストを表示するには、[バージョンを表示] を有効にします。
- オブジェクトの削除マーカーを選択します。
重要: オブジェクト自体ではなく、削除マーカーを選択する必要があります。この方法以外では、オブジェクトを取得できません。 - [オブジェクトの削除] ページの [オブジェクトを完全に削除] に permanently delete を入力します。
- [削除] を選択します。
重要: Amazon S3 コンソールを使用してフォルダの削除を取り消すことはできません。これを行うには、AWS CLI または AWS SDK を使用する必要があります。
AWS CLI を使用して削除マーカーを削除する
AWS CLI を使用して、複数のオブジェクト、数千のオブジェクト、または数百万のオブジェクトの削除マーカーを削除できます。
複数のオブジェクトの削除マーカーを取り消す
次の手順を実行します。
-
次の list-object-versions コマンドを、--query パラメータを指定して実行します。
aws s3api list-object-versions --bucket DOC-EXAMPLE-BUCKET --prefix examplefolder/ --query 'DeleteMarkers[*].{Key: Key, VersionId: VersionId}'注: 上記のコマンドには、結果を指定されたキー名のプレフィックスに絞り込むための --prefix オプションが指定されています。
-
コマンド出力に表示される、削除マーカーのバージョン ID を書き留めます。
重要: 削除マーカーのバージョン ID を書き留めたことを確認してください。オブジェクトバージョンを削除した場合は、オブジェクトを再取得できません。 -
delete-object コマンドを実行して削除マーカーを取り消します。
aws s3api delete-object --bucket DOC-EXAMPLE-BUCKET --key example.txt --version-id 'example.d6tjAKF1iObKbEnNQkIMPjj' -
削除マーカーが取り消されたことを確認するには、ls コマンドを実行します。
aws s3 ls s3://DOC-EXAMPLE-BUCKET
数千単位の削除マーカーを取り消す
警告: 次の list-object-versions コマンドを実行する前に、データのバックアップをおすすめします。このコマンドは、s3api delete-object API アクションを使用することで、特定された削除マーカーのオブジェクトを削除します。オブジェクトの削除は永続的なアクションです。このコマンド構造を変更すると、意図しないデータ損失が発生する可能性があります。
次の手順を実行します。
- AWS CloudShell コンソールを開きます。
- list-object-versions コマンドを実行します。
注: 上記のコマンドは、jq ツールを使用して現行バージョンの DeleteMarkers の ListObjectVersions を解釈します。デフォルトでは、jq は AWS CloudShell にインストールされています。シェル環境と通信が行われない場合、シェルセッションは終了します。jq ツールの詳細については、jq のウェブサイトで ./jq を参照してください。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 -t aws s3api delete-object --bucket DOC-EXAMPLE-BUCKET
数百万単位のオブジェクトの削除マーカーを取り消す
バケット内の数百万単位のオブジェクトに対する削除マーカーを取り消す場合は、AWS SDK でカスタムスクリプトを使用します。[AWS SDK を使用する] タブを展開すると、詳細情報が表示されます。
注: 数百万単位のオブジェクトが含まれるバケットに list-object-versions を実行すると、タイムアウトが発生する可能性があります。
関連するコンテンツ
- 質問済み 9ヶ月前

