📦

Firebase Storage に bucket を追加する

2021/01/06に公開

動機

Firebase は利用を始めると勝手に Cloud Storage の bucket がアサインされ、特に何も考えずに使うことができます。
しかし、bucket 毎の細かな権限管理をしたい場合、ライフサイクルを適用してテンポラリな bucket を使いたいときなど、bucket 自体を増やしたいケースも出てくると思います。
Firebase SDK のドキュメントには別の bucket を使うコードも載っているのですが、Rules を個別に管理する方法等、少し悩む部分があったので記事を書くことにしました。

bucket の追加

コンソール
右上の三点アイコンを押下します
bucket を追加ボタン
まず、bucket を追加するのは非常にかんたんです。コンソールを開き、Storage のページに移動した上で右上の三点アイコンを押すと、「バケットを追加」というボタンが表示されるのでそこからは既存の bucket を利用するなり、新規作成するなりどちらでも構いません。

Rules をそれぞれに適用する

悩んだのはこの部分です。現状のプロジェクトだと、***-production***-staging という 2 つの環境を用意しており、それぞれに 2 つずつ bucket が存在している状況です。この場合に、Firebase CLI から Rules をデプロイする方法がわからず、しばらく悩みました、
結果としては、.firebasercfirebase.json に以下のような記述をすると、それぞれに Rules を適用することができました。

.firebaserc
{
  "projects": {
    "staging": "***-staging",
    "production": "***-production"
  },
  "targets": {
    "***-staging": {
      "storage": {
        "bucket-group-1": [
          "***-staging-bucket-1"
        ],
        "bucket-group-2": [
          "***-staging-bucket-2"
        ]
      }
    },
    "***-production": {
      "storage": {
        "bucket-group-1": [
          "***-production-bucket-1"
        ],
        "bucket-group-2": [
          "***-production-bucket-2"
        ]
      }
    }
  }
}

まずはこのような感じで、デプロイターゲットを設定します。この設定は、ドキュメントのこの部分で、CLI から設定する内容が記載されていますが、結果としては、.firebaserc に上記内容が追加されるのと同義のようです。

次に firebase.json にそれぞれのグループにどのルールを適応するかを記載します。

firebase.json
{
  "storage": [
    {
      "target": "bucket-group-1",
      "rules": "storage.group1.rules"
    },
    {
      "target": "bucket-group-2",
      "rules": "storage.group2.rules"
    }
  ],
}

これでそれぞれの Rules を読み込んだ上でデプロイしてくれます。

クライアントから bucket を切り替える

デフォルトの(init 時から自動で適応されている) bucket については、何も考えずに、

const storage = firebase.storage();

で利用できます。追加した bucket については、

const storage = firebase.app().storage("gs://bucket-name");

とすると利用できます。注意点としては、bucket 名の先頭に gs:// を付与する必要があるということです。後述の admin SDK ではこれが必要ないので混同ポイントではあります。

Admin SDK から bucket を切り替える

デフォルトの bucket については、

const storage = admin.storage();

これで大丈夫です。追加した bucket については、

const storage = admin.storage().bucket("bucket-name");

これで利用できます。

Discussion