Cloud Storage for Firebaseで、bucketごとにセキュリティルールを割り当てる

こんにちは、ピリカ開発チームの九鬼です。

Firebaseを使ったサービスに関して、サービスによっては複数bucketを使いたい場合があります。デフォルトだと単一bucketしかセキュリティルールを割り当てられないのですが、.firebasercおよびfirebase.jsonの設定により対応できました。ここにその方法を記載します。

全体方針

以下の方針を満たすよう、設定を行います。

  • 開発環境/本番環境向けプロジェクトごとにセキュリティルールを割り当てるようにする
    • 開発環境デプロイ時に、本番環境のbucketのルールを書き換えないようにするため(逆も同様)

複数bucketへのセキュリティルール付与 構成例

1. デプロイターゲットの定義

以下のコマンドを実行し、開発環境/本番環境ごとにデプロイターゲットを定義します。デプロイターゲット名は任意の名前でOKです。

function create_storage_deploy_targets () {
  projectId=$1

  firebase use $projectId

# 開発環境のbucketごとにデプロイターゲットを追加する
# firebase target:apply storage デプロイターゲット名 bucket名

  firebase target:apply storage buckets_appspot_com ${projectId}.appspot.com
  firebase target:apply storage buckets_foo ${projectId}_foo
  firebase target:apply storage buckets_bar ${projectId}_bar
}

create_storage_deploy_targets (開発環境のプロジェクトID)
create_storage_deploy_targets (本番環境のプロジェクトID)

上記を実行すると、以下の様に.firebasercが更新されます。 (開発環境=some_dev, 本番環境=some_productionとして記載しています)

{
  "projects": {
    "default": "some_dev"
  },
  "targets": {
    "some_dev": {
      "storage": {
        "buckets_appspot_com": [
          "some_dev.appspot.com"
        ],
        "buckets_foo": [
          "some_dev_foo"
        ],
        "buckets_bar": [
          "some_dev_bar"
        ]
      }
    },
    "some_production": {
      "storage": {
        "buckets_appspot_com": [
          "some_production.appspot.com"
        ],
        "buckets_foo": [
          "some_production_foo"
        ],
        "buckets_bar": [
          "some_production_bar"
        ]
      }
    }
  }
}
  • 開発環境(some_dev)にデプロイするときは以下bucketが対象になる
  • 本番環境(some_production)にデプロイするときは以下bucketが対象になる
    • buckets_appspot_comターゲット: some_production.appspot.comバケット
    • buckets_fooターゲット: some_production_fooバケット
    • buckets_barターゲット: some_production_barバケット

2. デプロイターゲットごとのセキュリティルール割り当て

ターゲットごとに設定をfirebase.jsonに追記します。デプロイターゲットごとに、どのセキュリティルールを割り当てるかを記載します。

実例

{
  "storage": [
    {
      "target": "buckets_appspot_com",
      "rules": "storage_appspot_com.rules"
    },
    {
      "target": "buckets_foo",
      "rules": "storage_foo.rules"
    },
    {
      "target": "buckets_bar",
      "rules": "storage_bar.rules"
    }
  ],
}

以上により、デプロイ時に各バケットに対してセキュリティルールが適用されます。 プロジェクトごとに対象バケットを切り分けているので、意図せず別の環境にセキュリティルールは適用されません。


株式会社ピリカでは、我々と共に、大きく、 深刻で、とびきり面白いポイ捨てごみ問題の解決を一緒に取り組んでくださる方を募集しています。

現在、エンジニアを積極採用中です!!

ご興味がございましたら、ぜひ採用ページをご覧ください!

corp.pirika.org