Infinito Nirone 7

白羽の矢を刺すスタイル

Firebase Storage にある複数の Bucket の Rules を Git で管理するための手順

Firebase Storage には Firestore や Realtime Database のようにルールの設定があり、JSON でパスやファイルごとに読み書きの権限設定を変更できます。 Firebase Storage は複数のバケットを作ることができます。おそらくは保管するファイルの用途ごとに使用するバケットを変える(公開用と非公開用とか)ような使い方を想定しているように思いますが、Firebase Storage のルールはこのバケットごとに設定可能な点が他のプロダクトと異なります。

Firebase にはfirebase-toolsというCLIコマンドがあり、このコマンドのdeployオプションを使うとCLIからルールを変更できます。ルールはテキストファイルに書き出したものをデプロイするので、ルールを Git の管理下に置いてバージョン管理できるようになります。

ここで何も考えずにルールのJSONをファイルに書き出して、次のようにfirebase.jsonを設定すると、デフォルトのバケットのみにルールが適用されます。

# storage.rules.json
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}
# firebase.json
{
  "storage": {
    "rules": "storage.rules.json"
  }
}

複数バケットがある場合はバケットごとのルールを書き出した個別のファイルを用意し、デプロイ時にはそれらを対応するバケットに適用されるよう設定するには、firebase-toolsのデプロイターゲットを使います。

$ firebase target:apply storage <name> <resource_name>

たとえば、バケットURI がそれぞれ、デフォルト=gs://myproject.appspot.com, 追加したもの=gs://myproject-a89ee.appspot.comだとすると

$ firebase target:apply storage main myproject.appspot.com
$ firebase target:apply storage sub myproject-a89ee.appspot.com

とします。<name>は好きなものを選びます。 これらのコマンドで、.firebasercに次のような差分が生成されます。

...
+  },
+  "targets": {
+    "myproject": {
+      "storage": {
+        "main": [
+          "myproject.appspot.com"
+        ],
+        "sub": [
+          "myproject-a89ee"
+        ]
+      }
+    }
... 

これをもとに、firebase.jsonを次のように書き換えます。

# firebase.json
{
  "storage": [
    {
      "target": "main"
      "rules": "storage.rules.json"
    },
    {
      "target": "sub"
      "rules": "storage_sub.rules.json"
    }
  ]
}

これで、storage.rules.jsonはデフォルトのバケット用に、storage_sub.rules.jsonは追加したバケット用にそれぞれルールを定義できるようになります。