Google Cloud Storage で削除されたフォルダを復元する

2023.04.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは!エノカワです。

Google Cloud Storage(GCS)は、高い信頼性と柔軟性を提供するクラウドストレージサービスです。

GCSでは、オブジェクトはフラットな名前空間に保存され、フォルダは存在しません。
ですが、オブジェクト名にスラッシュ(/)を含めることで、仮想的なフォルダ構造を表現することができます。
GCSのコンソール上では、このスラッシュを使ってフォルダとして扱われるようになります。

フォルダ単位で削除操作が可能ですが、もし誤ってフォルダを削除してしまった場合、どのようにしてフォルダを復元できるでしょうか?

この記事では、削除されたフォルダを復元する方法をご紹介します。

前提条件

フォルダの復元が可能であるためには、以下の条件が満たされている必要があります。

  1. バケットでオブジェクトバージョニングが有効になっている
  2. 削除されたフォルダ内のオブジェクトに以前のバージョンが存在する

オブジェクトバージョニングが有効でない場合、削除されたフォルダの復元はできません。

オブジェクトの復元手順

まずは、オブジェクトを復元する手順を見てみましょう。

my-file.txtを選択し、[削除]を実行します。

my-file.txtが削除されました。

コンソールで復元

ここから復元操作を行いますが、復元するには削除されたオブジェクトにアクセスする必要があります。
[削除されたデータを表示]ONにします。

先ほど削除したmy-file.txtが表示されました。
バージョン履歴列に[1個の非現行バージョン]と表示されているので、クリックします。

バージョン履歴画面が表示されました。
表示されている非現行バージョンが復元対象となりますので、[Restore]をクリックします。

確認ダイアログが表示されますので、[確認]をクリックします。

my-file.txtが復元されました!

コマンドラインで復元

gcloud storagegsutilコマンドでも復元が可能です。

gsutilコマンドを使用する場合は以下のようになります。

gsutil cp -A gs://versioning_trial/my-file.txt#1682824268440842 gs://versioning_trial/my-file.txt
  • 復元するオブジェクトのバージョンをコピーし、元の場所に復元しています。
  • 非現行バージョンをコピーするため、-Aフラグを使用します。

フォルダの復元手順

それでは、フォルダの復元を試してみましょう。

以下のような構成を持つフォルダを削除して復元してみます。

$ gsutil ls gs://versioning_trial/my-folder/**
gs://versioning_trial/my-folder/
gs://versioning_trial/my-folder/my-file1.txt
gs://versioning_trial/my-folder/my-file2.txt
gs://versioning_trial/my-folder/my-file3.txt
gs://versioning_trial/my-folder/sub-folder/
gs://versioning_trial/my-folder/sub-folder/sub-file1.txt
gs://versioning_trial/my-folder/sub-folder/sub-file2.txt
gs://versioning_trial/my-folder/sub-folder/sub-file3.txt

my-folder/を選択し、[削除]を実行します。

my-folder/が削除されました。

コンソールで復元

復元する手順はオブジェクトの復元と同じです。

[削除されたデータを表示]ONにします。

先ほど削除したmy-folder/が表示されました。
ですが、バージョン履歴列には何も表示されていません。

復元操作は、my-folder/配下のmy-file1.txtなどのオブジェクトのバージョン履歴から行います。

フォルダ配下の個々のオブジェクトを復元することで、フォルダも含めて復元することができます。

コマンドラインで復元

コマンドラインで行う場合も、考え方はオブジェクトの復元と同じです。

以下のコマンドで削除されたオブジェクトとそのバージョンアップをリストアップします。

gsutil ls -a gs://versioning_trial/my-folder/** | grep '#' 

gs://versioning_trial/my-folder/#1682825373510384  
gs://versioning_trial/my-folder/my-file1.txt#1682825507895443  
gs://versioning_trial/my-folder/my-file2.txt#1682825520547652  
gs://versioning_trial/my-folder/my-file3.txt#1682825525804584  
gs://versioning_trial/my-folder/sub-folder/#1682825434354717  
gs://versioning_trial/my-folder/sub-folder/sub-file1.txt#1682825543604243  
gs://versioning_trial/my-folder/sub-folder/sub-file2.txt#1682825554218340  
gs://versioning_trial/my-folder/sub-folder/sub-file3.txt#1682825559341198

復元する各オブジェクトのバージョンをコピーし、元の場所に復元します。

gsutil cp -A gs://versioning_trial/my-folder/#1682825373510384 gs://versioning_trial/my-folder/
gsutil cp -A gs://versioning_trial/my-folder/my-file1.txt#1682825507895443 gs://versioning_trial/my-folder/my-file1.txt
gsutil cp -A gs://versioning_trial/my-folder/my-file2.txt#1682825520547652 gs://versioning_trial/my-folder/my-file2.txt
gsutil cp -A gs://versioning_trial/my-folder/my-file3.txt#1682825525804584 gs://versioning_trial/my-folder/my-file3.txt
gsutil cp -A gs://versioning_trial/my-folder/sub-folder/#1682825434354717 gs://versioning_trial/my-folder/sub-folder/
gsutil cp -A gs://versioning_trial/my-folder/sub-folder/sub-file1.txt#1682825543604243 gs://versioning_trial/my-folder/sub-folder/sub-file1.txt
gsutil cp -A gs://versioning_trial/my-folder/sub-folder/sub-file2.txt#1682825554218340 gs://versioning_trial/my-folder/sub-folder/sub-file2.txt
gsutil cp -A gs://versioning_trial/my-folder/sub-folder/sub-file3.txt#1682825559341198 gs://versioning_trial/my-folder/sub-folder/sub-file3.txt

フォルダ内のすべてのオブジェクトを一括で復元

フォルダ内のオブジェクトを個別に復元するのは面倒、、、ということでシェルスクリプトで自動化してみました。
(こちらが、今回の記事でご紹介したかった内容になります!)

シェルスクリプトで復元

Cloud Shellで以下のシェルスクリプトを実行します。

restore_gcs_folder.sh

#!/bin/bash

# バケット名とフォルダ名を指定
bucket_name="versioning_trial"
folder_name="my-folder"

# すべての削除されたオブジェクトとそのバージョンをリストアップ
DELETED_OBJECTS=$(gsutil ls -a "gs://${bucket_name}/${folder_name}/**" | grep '#')

# 削除された各オブジェクトを復元
for object in $DELETED_OBJECTS; do
  gsutil cp -A "${object}" "${object%%#*}"
  echo "File ${object%%#*} restored."
done

echo "All files restored."

削除されたフォルダ内のすべてのオブジェクトを一括で復元することができました!

まとめ

以上、Google Cloud Storage で削除されたフォルダを復元する方法をご紹介しました。

フォルダ全体を復元したいけれど、個別のオブジェクトを1つずつ復元するのは手間だと感じる方々(私自身も含め)のお助けになれば幸いです!
ただし、オブジェクトが多数ある場合やバージョン履歴が長い場合、復元処理にそれなりの時間がかかることがあります。参考としてお使いいただければ!

参考