🔥
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__
フィールドのソート順序のみが異なるインデックスの設定
__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