ストレージバックアップ
Google Cloud StorageとFirestoreのバックアップ・リストア手順をまとめています。
バックアップ
Section titled “バックアップ”# Dev環境にバックアップされたFirestoreのバックアップ# 日付を変更してダウンロードgsutil -m cp -r gs://apptemplate-dev-nck.appspot.com/firestoreBackup/2023-03-08 .アップロード
Section titled “アップロード”# Prod環境のtestストレージにアップロードgcloud storage cp -r 2023-03-08 gs://apptemplate-nck.appspot.com/testFirestoreバックアップ手順
Section titled “Firestoreバックアップ手順”単一コレクションのバックアップ
Section titled “単一コレクションのバックアップ”# 開発プロジェクトにセットgcloud config set project nerikosodev
# storageの/firestore_export/handlebar配下を削除gsutil rm -r gs://nerikosodev.appspot.com/firestore_export/handlebargsutil rm -r gs://nerikosodev.appspot.com/firestore_export/handlebarDefinition
# エクスポート(handlebarはコレクション名)gcloud firestore export gs://nerikosodev.appspot.com/firestore_export/handlebar --collection-ids=handlebargcloud 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=handlebargcloud firestore import gs://nerikosostg.appspot.com/firestore_export/handlebarDefinition --collection-ids=handlebarDefinition全コレクションのバックアップ
Section titled “全コレクションのバックアップ”# 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/allGoogle Cloud SDKのインストール
Section titled “Google Cloud SDKのインストール”brew install --cask google-cloud-sdksource /Users/sakurai.yuki/google-cloud-sdk/path.zsh.incgcloud --version初期セットアップ
Section titled “初期セットアップ”# ログインgcloud auth login
# プロジェクトリストgcloud projects list
# プロジェクトのコンフィグgcloud config list
# プロジェクト切替gcloud config set project nerikosodev自動バックアップスクリプト
Section titled “自動バックアップスクリプト”日次バックアップスクリプト
Section titled “日次バックアップスクリプト”#!/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} fidone環境間同期スクリプト
Section titled “環境間同期スクリプト”#!/bin/bash
# プロジェクト設定DEV_PROJECT="nerikosodev"STG_PROJECT="nerikosostg"PROD_PROJECT="nerikosoprod"
# 同期する環境を選択read -p "ソース環境を選択 (dev/stg): " SOURCE_ENVread -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 0fi
# タイムスタンプ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 “リストア手順”特定日時のバックアップからリストア
Section titled “特定日時のバックアップからリストア”# バックアップ一覧の確認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=usersgcloud firestore import ${BACKUP_PATH}/posts --collection-ids=postsベストプラクティス
Section titled “ベストプラクティス”- 定期バックアップ: cronやCloud Schedulerで自動化
- 世代管理: 古いバックアップは自動削除
- 検証: バックアップ後の整合性チェック
- ドキュメント化: バックアップ・リストア手順の文書化
- アクセス制御: バックアップデータへの適切な権限設定
トラブルシューティング
Section titled “トラブルシューティング”エクスポート/インポートが失敗する場合
Section titled “エクスポート/インポートが失敗する場合”# 操作のステータス確認gcloud firestore operations list
# 詳細なエラーログgcloud firestore operations describe [OPERATION_NAME]
# 権限の確認gcloud projects get-iam-policy [PROJECT_ID]ストレージ容量の確認
Section titled “ストレージ容量の確認”# バケットの使用量gsutil du -s gs://your-bucket
# 詳細な使用量gsutil du -h gs://your-bucket/**