Firebase Authentication Backup for Firebase Cloud Functions
npm install --save @sonicgarden/auth-backup-firebase-functions
// or
yarn add @sonicgarden/auth-backup-firebase-functionsGoogle Cloud のリソースの作成を行う。
パッケージと共にインストールされる auth-backup-firebase-setup というスクリプトで作成可能。
auth-backup-firebase-setup <PROJECT_ID> [<KMS_LOCATION> <BUCKET_LOCATION>]
手動で作る場合は以下を参照。
バックアップを KMS で暗号化するための初期設定を行う。
$ export PROJECT_ID=<YOUR_PROJECT_ID>
$ gcloud services enable cloudkms.googleapis.com --project "${PROJECT_ID}"
$ gcloud kms keyrings create --location=asia-northeast1 firebase-authentication-keyring --project "${PROJECT_ID}"
$ gcloud kms keys create --location=asia-northeast1 \
--keyring=firebase-authentication-keyring \
--purpose=encryption \
--rotation-period=90d \
--next-rotation-time="$(date -I -d "90 days")T00:00:00Z" \
firebase-authentication-backup-key \
--project "${PROJECT_ID}"バックアップの保存先である Storage のバケットを作成する。
$ gcloud storage buckets create "gs://${PROJECT_ID}-authentication-backups" \
--project="${PROJECT_ID}" \
--default-storage-class=COLDLINE \
--location=ASIA \
--uniform-bucket-level-accessバケットのライフサイクルの設定を行う。 「オブジェクトが作成されてから 30 日以降」の条件で、「オブジェクトの削除」をするよう設定する。
$ echo '{ "lifecycle": { "rule": [{ "action": { "type": "Delete" }, "condition": { "age": 30 } }] } }' > lifecycle.json
$ gcloud storage buckets update "gs://${PROJECT_ID}-authentication-backups" --lifecycle-file=lifecycle.jsonFunctions を実行するサービスアカウントを作成します。 (もしくは Functions を実行する既存のサービスアカウントに以下ロールを付与する)
# サービスアカウント作成
$ gcloud iam service-accounts create backup-auth --display-name="backup-auth" --project "${PROJECT_ID}"
# バックアップ用カスタムロールを作成
$ gcloud iam roles create firebaseAuthBackup \
--project "${PROJECT_ID}" \
--title="Firebase Auth backup" \
--description="Custom role for Firebase Auth backup" \
--permissions="firebaseauth.users.get,firebaseauth.configs.getHashConfig" \
--stage=GA
# 作成したサービスアカウントにバックアップ用カスタムロールを付与
$ gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
--member "serviceAccount:backup-auth@${PROJECT_ID}.iam.gserviceaccount.com" \
--role "projects/${PROJECT_ID}/roles/firebaseAuthBackup"
# 作成したサービスアカウントに「Storage オブジェクト作成者」を付与
$ gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
--member "serviceAccount:backup-auth@${PROJECT_ID}.iam.gserviceaccount.com" \
--role roles/storage.objectCreator
# 作成したサービスアカウントに「クラウド KMS 暗号鍵の暗号化ロール」を付与
$ gcloud kms keys \
add-iam-policy-binding \
--location=asia-northeast1 \
--keyring=firebase-authentication-keyring \
firebase-authentication-backup-key \
--member="serviceAccount:backup-auth@${PROJECT_ID}.iam.gserviceaccount.com" \
--role=roles/cloudkms.cryptoKeyEncrypter \
--project "${PROJECT_ID}"Restore を実行するためのサービスアカウントを作成。 Restoreが必要になった時に、このサービスアカウントを作成し、そのサービスアカウントを利用してscript等でRestore関数を実行する。
# サービスアカウント作成
$ gcloud iam service-accounts create restore-auth --display-name="restore-auth" --project "${PROJECT_ID}"
# 作成したサービスアカウントに「Identity Platform 管理者」を付与
$ gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
--member "serviceAccount:restore-auth@${PROJECT_ID}.iam.gserviceaccount.com" \
--role roles/identityplatform.admin
# 作成したサービスアカウントに「Storage オブジェクト閲覧者」を付与
$ gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
--member "serviceAccount:restore-auth@${PROJECT_ID}.iam.gserviceaccount.com" \
--role roles/storage.objectViewer
# 作成したサービスアカウントに「クラウド KMS 暗号鍵の暗号化ロール」を付与
$ gcloud kms keys \
add-iam-policy-binding \
--location=asia-northeast1 \
--keyring=firebase-authentication-keyring \
firebase-authentication-backup-key \
--member="serviceAccount:restore-auth@${PROJECT_ID}.iam.gserviceaccount.com" \
--role=roles/cloudkms.cryptoKeyEncrypterDecrypter \
--project "${PROJECT_ID}"import { backupAuth as _backupAuth } from '@sonicgarden/auth-backup-firebase-functions';
import { onSchedule } from 'firebase-functions/v2/scheduler';
export const backupAuth = onSchedule(
{
schedule: '0 1 * * *',
region: 'asia-northeast1',
timeZone: 'Asia/Tokyo',
serviceAccount: `backup-auth@${process.env.GCLOUD_PROJECT}.iam.gserviceaccount.com`,
},
async (event) => {
await _backupAuth({ region: 'asia-northeast1' });
}
);| parameter | required | default value | description |
|---|---|---|---|
| region | required | - | KMS のリージョン |
| projectId | optional | process.env.GCLOUD_PROJECT | プロジェクト ID |
| bucketName | optional | ${process.env.GCLOUD_PROJECT}-authentication-backups | GCS バケット名 |
| encrypt | optional | true | バックアップファイルを暗号化するか |
| keyringName | optional | firebase-authentication-keyring | KMS キーリング名 |
| keyName | optional | firebase-authentication-backup-key | KMS キー名 |
| parameter | required | default value | description |
|---|---|---|---|
| region | required | - | KMS のリージョン |
| backupFilePath | required | - | GCS 内のバックアップファイルパス |
| projectId | optional | process.env.GCLOUD_PROJECT | プロジェクト ID |
| bucketName | optional | ${process.env.GCLOUD_PROJECT}-authentication-backups | GCS バケット名 |
| encrypted | optional | true | バックアップファイルが暗号化されているか |
| keyringName | optional | firebase-authentication-keyring | KMS キーリング名 |
| keyName | optional | firebase-authentication-backup-key | KMS キー名 |
| destinationProjectId | optional | process.env.GCLOUD_PROJECT | リストア先のプロジェクト ID |
| hashParams | optional | - | パスワードハッシュのパラメータ(hashAlgo, hashKey, saltSeparator, rounds, memCost) |
git tag -a v1.0.0 -m "My first version v1.0.0"
git push origin tags/v1.0.0
npm publish --access=publicnpm version patch # or minor or magor
git push origin tags/v1.0.1
npm publish --access=public