マニュアルにはないfirestoreのバックアップに関する勘所

こんにちは。[virapture株式会社](https://virapture.com)の[もぐめっと](https://mogmet.com)です。

![8FE77B53-58C5-424A-9D84-74C634874158.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/87ea364b-fbd8-9122-5b4d-5ef2f6792c5a.jpeg)


最近山梨で合宿をしたので写真をたくさんとってもらえて素材がたくさんできて嬉しいです。
しばらく山梨の写真が続くと思われます。

前回firestoreのバックアップしたもののリストアについて記事にさせてもらいましたが、

https://qiita.com/mogmet/items/44ab5fd4e1be48e17b36

本日はマニュアルには載ってないfirestoreのバックアップに関してのコツということで、

- バックアップの場所
- expire設定

の2点について紹介させていただきます。

## バックアップの場所

みなさんcloud storageに保存してる方が多数いられると思います。

しかし、**デフォルトで作られるcloud storageにそのまま保存しちゃってませんか？**

実はfirebaseでは複数のバケットを管理することができるので、バックアップ用のバケットを作ってそこに保存することをおすすめします！

理由としては2点あります。

**1. 万が一ルールに穴があろうとバックアップが漏洩する危険を減らせる**

cloud storageにはアクセスできるルールを記載することができます。
同じバケットにしていた場合、運用中にルールの記述ミスによってバックアップ先までアクセスできるように公開してしまったということにもなりかねません。
バケットを別にすることで一回設定すればもうルールを編集することがなくなるので、運用中のミスを軽減できます。
（バケット作ってすぐのルール設定でミスってたらどうしようもないのでそこはどうしようもありませんが、、、気をつけましょう！！）

**2. expireの設定がしやすい**

後述しますが、別バケットにするとexpireの設定がしやすいです。

### 別バケットの作成方法

利点があることがわかったところで早速どうやって別バケットを作成するかを解説します。

cloud storageのコンソール画面にいきましょう。
既に初期バケットを作っていると思います。
右上にある3点リーダーを押下して「バケットを追加」を押下します。

![20E56B0A-CBA2-4E96-88B0-6A56A3332AEA.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/f84f9800-dc4d-7a66-6e12-ce5e52da8fd5.jpeg)


バケット名を入力してバックアップ用のバケットを作成します。
ロケーションはfirestoreに合わせとくといいと思います。
1番大事なのはアクセス頻度をアーカイブにしておきましょう！保存コストが削減できます。
![F1E82200-B1CE-4F71-A3AA-D50B66617E47.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/7fad1418-b655-c879-20c7-97fd59b0b72b.jpeg)

とりあえず続行で作成だけしちゃいます。
![4DCFB24D-DD0E-451A-9543-F67D66F9A3BA.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/9143df63-1973-6300-9ab3-a67088ad361d.jpeg)

バケットを作成できたらすぐにルールを書き換えちゃいましょう。CloudFunctionsで書き込むので何人もアクセスさせる必要ありません。

```
rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if false;
    }
  }
}
```


これで無事バケットを作成することができました！
あとはバックアップする時のバケットの指定でこのバケットを指定するだけです。

## expire設定

普通にバックアップを取ると無限に保存してしまってストレージの使用料だけで請求額が右肩上がりになってしまいます。
それを防ぐために、expire設定をつけてあげて、直近何日までしかデータを保存しないなどの設定をつけるようにしてあげましょう。
実はコマンド一つでこの有効期限をバケット単位でつけることができます！
バケット単位で**簡単**にできるので、分けることによるメリットがここで生きてきます。


### expireの設定方法

まずはライフサイクル設定用のファイルを作ります。

```gs-lifecycle.json
{
  "lifecycle": {
    "rule":
    [
      {
        "action": {"type": "Delete"},
        "condition": {"age": 7}
      }
    ]
  }
}
```

上記設定は作成したオブジェクトは7日保管する設定に指定しています。

他に設定できる細かい項目に関しては下記を参照。

https://cloud.google.com/storage/docs/lifecycle

設定ファイルを作ったら、あとは下記コマンドを打つだけ！
```
gsutil lifecycle set ./gs-lifecycle.json gs://バックアップ先のバケット名
```

※gsutilコマンドはあらかじめ使えるようにしておきましょう。

https://cloud.google.com/sdk/docs/install

一応brewでも入れられます。

https://zenn.dev/phi/articles/gcloud-setup-with-homebrew-on-mac


## まとめ

バックアップの勘所として、バックアップする場所とexpire設定について紹介しました。
簡単にまとめると、

- バックアップ場所は別バケットに作成する。
- expire設定をgsutilコマンドでバケットに設定すると削除処理が簡単。

という紹介でした！

是非これでみなさんのバックアップライフを快適にできたら幸いです。

最後に、[ワンナイト人狼オンライン](https://online.1nite-jinro.com/link/blog)というゲームを作ってます！よかったら遊んでね！

https://online.1nite-jinro.com/link/blog

他にも[Camecon](https://camecon.me/)や[Offcha](https://offcha.com/)といったサービスも作ってるのでよかったら使ってね！

https://camecon.me/

https://offcha.com/

また、チームビルディングや技術顧問、Firebaseの設計やアドバイスといったお話も受け付けてますので御用の方は弊社までお問い合わせください。

https://virapture.com/