コンテンツにスキップ

ストレージバックアップ

Google Cloud StorageとFirestoreのバックアップ・リストア手順をまとめています。

Terminal window
# Dev環境にバックアップされたFirestoreのバックアップ
# 日付を変更してダウンロード
gsutil -m cp -r gs://apptemplate-dev-nck.appspot.com/firestoreBackup/2023-03-08 .
Terminal window
# Prod環境のtestストレージにアップロード
gcloud storage cp -r 2023-03-08 gs://apptemplate-nck.appspot.com/test

単一コレクションのバックアップ

Section titled “単一コレクションのバックアップ”
Terminal window
# 開発プロジェクトにセット
gcloud config set project nerikosodev
# storageの/firestore_export/handlebar配下を削除
gsutil rm -r gs://nerikosodev.appspot.com/firestore_export/handlebar
gsutil rm -r gs://nerikosodev.appspot.com/firestore_export/handlebarDefinition
# エクスポート(handlebarはコレクション名)
gcloud firestore export gs://nerikosodev.appspot.com/firestore_export/handlebar --collection-ids=handlebar
gcloud firestore export gs://nerikosodev.appspot.com/firestore_export/handlebarDefinition --collection-ids=handlebarDefinition
# dev から stg にバケット間でコピー
gcloud storage cp -r gs://nerikosodev.appspot.com/firestore_export/handlebar gs://nerikosostg.appspot.com/firestore_export/
gcloud storage cp -r gs://nerikosodev.appspot.com/firestore_export/handlebarDefinition gs://nerikosostg.appspot.com/firestore_export/
# stgプロジェクトにセット
gcloud config set project nerikosostg
# storage からコレクションにインポート
gcloud firestore import gs://nerikosostg.appspot.com/firestore_export/handlebar --collection-ids=handlebar
gcloud firestore import gs://nerikosostg.appspot.com/firestore_export/handlebarDefinition --collection-ids=handlebarDefinition

全コレクションのバックアップ

Section titled “全コレクションのバックアップ”
Terminal window
# DEVにセット
gcloud config set project nerikosodev
# 全コレクションエクスポート
gcloud firestore export gs://nerikosostg.appspot.com/firestore_export/all
# DEV から STG にバケット間でコピー
gcloud storage cp -r gs://nerikosodev.appspot.com/firestore_export/all gs://nerikosostg.appspot.com/firestore_export/all
# STGプロジェクトにセット
gcloud config set project nerikosostg
# 全コレクションインポート
gcloud firestore import gs://nerikosostg.appspot.com/firestore_export/all
Terminal window
brew install --cask google-cloud-sdk
source /Users/sakurai.yuki/google-cloud-sdk/path.zsh.inc
gcloud --version
Terminal window
# ログイン
gcloud auth login
# プロジェクトリスト
gcloud projects list
# プロジェクトのコンフィグ
gcloud config list
# プロジェクト切替
gcloud config set project nerikosodev
#!/bin/bash
# 設定
SOURCE_PROJECT="nerikosodev"
TARGET_BUCKET="gs://backup-storage"
DATE=$(date +%Y-%m-%d)
COLLECTIONS=("users" "posts" "comments" "settings")
echo "=== Firestoreバックアップ開始: ${DATE} ==="
# ソースプロジェクトに切り替え
gcloud config set project ${SOURCE_PROJECT}
# 各コレクションをエクスポート
for collection in "${COLLECTIONS[@]}"; do
echo "エクスポート中: ${collection}"
gcloud firestore export \
${TARGET_BUCKET}/firestore_backup/${DATE}/${collection} \
--collection-ids=${collection}
done
echo "=== バックアップ完了 ==="
# 古いバックアップの削除(30日以上前)
echo "=== 古いバックアップの削除 ==="
gsutil ls ${TARGET_BUCKET}/firestore_backup/ | while read backup_dir; do
backup_date=$(basename ${backup_dir})
if [[ $(date -d "${backup_date}" +%s 2>/dev/null) -lt $(date -d "30 days ago" +%s) ]]; then
echo "削除: ${backup_dir}"
gsutil rm -r ${backup_dir}
fi
done
#!/bin/bash
# プロジェクト設定
DEV_PROJECT="nerikosodev"
STG_PROJECT="nerikosostg"
PROD_PROJECT="nerikosoprod"
# 同期する環境を選択
read -p "ソース環境を選択 (dev/stg): " SOURCE_ENV
read -p "ターゲット環境を選択 (stg/prod): " TARGET_ENV
# プロジェクトとバケットの設定
case ${SOURCE_ENV} in
"dev")
SOURCE_PROJECT=${DEV_PROJECT}
SOURCE_BUCKET="gs://${DEV_PROJECT}.appspot.com"
;;
"stg")
SOURCE_PROJECT=${STG_PROJECT}
SOURCE_BUCKET="gs://${STG_PROJECT}.appspot.com"
;;
*)
echo "無効な環境です"
exit 1
;;
esac
case ${TARGET_ENV} in
"stg")
TARGET_PROJECT=${STG_PROJECT}
TARGET_BUCKET="gs://${STG_PROJECT}.appspot.com"
;;
"prod")
TARGET_PROJECT=${PROD_PROJECT}
TARGET_BUCKET="gs://${PROD_PROJECT}.appspot.com"
;;
*)
echo "無効な環境です"
exit 1
;;
esac
# 確認
echo "========================================="
echo "ソース: ${SOURCE_PROJECT} (${SOURCE_ENV})"
echo "ターゲット: ${TARGET_PROJECT} (${TARGET_ENV})"
echo "========================================="
read -p "続行しますか? (y/n): " CONFIRM
if [[ ${CONFIRM} != "y" ]]; then
echo "キャンセルしました"
exit 0
fi
# タイムスタンプ
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
# ソースプロジェクトでエクスポート
echo "=== エクスポート開始 ==="
gcloud config set project ${SOURCE_PROJECT}
gcloud firestore export ${SOURCE_BUCKET}/firestore_sync/${TIMESTAMP}
# バケット間コピー
echo "=== データ転送中 ==="
gcloud storage cp -r \
${SOURCE_BUCKET}/firestore_sync/${TIMESTAMP} \
${TARGET_BUCKET}/firestore_sync/
# ターゲットプロジェクトでインポート
echo "=== インポート開始 ==="
gcloud config set project ${TARGET_PROJECT}
gcloud firestore import ${TARGET_BUCKET}/firestore_sync/${TIMESTAMP}
echo "=== 同期完了 ==="

特定日時のバックアップからリストア

Section titled “特定日時のバックアップからリストア”
Terminal window
# バックアップ一覧の確認
gsutil ls gs://backup-storage/firestore_backup/
# 特定の日付のバックアップを選択
BACKUP_DATE="2024-01-15"
BACKUP_PATH="gs://backup-storage/firestore_backup/${BACKUP_DATE}"
# リストア先のプロジェクトに切り替え
gcloud config set project target-project
# コレクションごとにインポート
gcloud firestore import ${BACKUP_PATH}/users --collection-ids=users
gcloud firestore import ${BACKUP_PATH}/posts --collection-ids=posts
  1. 定期バックアップ: cronやCloud Schedulerで自動化
  2. 世代管理: 古いバックアップは自動削除
  3. 検証: バックアップ後の整合性チェック
  4. ドキュメント化: バックアップ・リストア手順の文書化
  5. アクセス制御: バックアップデータへの適切な権限設定

エクスポート/インポートが失敗する場合

Section titled “エクスポート/インポートが失敗する場合”
Terminal window
# 操作のステータス確認
gcloud firestore operations list
# 詳細なエラーログ
gcloud firestore operations describe [OPERATION_NAME]
# 権限の確認
gcloud projects get-iam-policy [PROJECT_ID]
Terminal window
# バケットの使用量
gsutil du -s gs://your-bucket
# 詳細な使用量
gsutil du -h gs://your-bucket/**