🔥

Firestore の __name__ フィールドインデックスをCLIでデプロイできない問題と解決方法

に公開

Firestoreのインデックスを手動管理からCLI管理に移行しようとしたところ、__name__ フィールドで思わぬ問題に遭遇した話です。

発生の経緯

プロジェクト開始時は Firebase コンソール(GUI)からインデックスを手動で作成していましたが、私がプロジェクトにジョインしたタイミングで「インデックス更新もCI/CDで反映したい」と考え、CLIでファイル管理に移行を試みました。

問題の発覚

既存のインデックス構成を確認するため、エクスポートしてみました。

% firebase firestore:indexes

出力されたインデックスを反映しようとした際に409エラーが発生しました。

% firebase deploy --only firestore:indexes

i  firestore: The following indexes are defined in your project but are not present in your firestore indexes file:
        (dummy) -- (id,ASCENDING) (created_at,ASCENDING)
        (dummy) -- (id,ASCENDING) (created_at,ASCENDING)

Error: Request had HTTP Error: 409, index already exists

原因の調査

エクスポートされたJSONを確認すると以下のように重複された情報が出力されていました。

{
  "indexes": [
    {
      "collectionGroup": "dummy",
      "queryScope": "COLLECTION",
      "fields": [
        {
          "fieldPath": "id",
          "order": "ASCENDING"
        },
        {
          "fieldPath": "created_at",
          "order": "ASCENDING"
        }
      ]
    },
    {
      "collectionGroup": "dummy",
      "queryScope": "COLLECTION",
      "fields": [
        {
          "fieldPath": "id",
          "order": "ASCENDING"
        },
        {
          "fieldPath": "created_at",
          "order": "ASCENDING"
        }
      ]
    }
  ]
}

実際にはGUIで以下のようなインデックスを作成しています。

__name__ フィールドのソート順序のみが異なるインデックスの設定

Firestore インデックス設定

__name__ フィールドの情報が完全に失われ、同じ定義のインデックスが2つ出力されるという状況でした。

解決策

__name__ フィールドをインデックス管理から除外し、CLIから反映できるインデックスのみファイル管理することにしました。

firestore.indexes.json の整理

重複インデックスを1つにまとめ、__name__ フィールドを除外しました。

{
  "indexes": [
    {
      "collectionGroup": "dummy",
      "queryScope": "COLLECTION",
      "fields": [
        {
          "fieldPath": "id",
          "order": "ASCENDING"
        },
        {
          "fieldPath": "created_at",
          "order": "ASCENDING"
        }
      ]
    }
  ]
}

CI/CD設定

インデックス変更時に自動反映するよう設定しました。

firebase deploy --only firestore:indexes

まとめ

FirestoreでもGUIとCLIで差分があることがわかりましたが、根本原因を把握して解決することができました。プロジェクトルールとして __name__ フィールドはインデックスに含めない 方針に統一し、CUIで管理できる範囲でインデックス設計を行うようにしました。

参考資料

Discussion