🎃

FirebaseのデータをmicroCMSに移行する

2022/02/23に公開約3,400字

個人で作っているアプリで、Firestoreに保存していたデータの一部をmicroCMSに移行しました。
移行後の世界は今のところはなかなか良い感じで、今後他のアプリでもやりそうなので忘れないよう手順をメモします。

microCMSに移行する理由

今回は以下の理由から移行することにしました。

  • 全文検索に標準で対応している
    • FirestoreもAlgoliaなどを使えば実現できるが実装が必要
  • 入稿画面がわかりやすくデータを更新しやすい
  • データ件数が10,000件を超えないのでmicroCMSの無料プランで十分使える

今回移行したのはユーザー共通で利用するRead-onlyなメディアデータです。
書き込みなどはないためFirestoreで管理する必然性はなかったのですが、手頃なデータストアがなく慣れたFirestoreに置いていました。

その後ヘッドレスCMSの存在を知り、上記の理由で移行することにしました。

microCMSのAPIを作成する

まずはmicroCMSでAPIを作成します。Firestoreと同じスキーマ名・型にしておくとスムーズです。

Firestoreではドキュメントごとに異なる構造のデータを持てますが、microCMSではドキュメント共通のスキーマを持つことになります。

Firestoreを見ながらこのような形でポチポチとスキーマを定義しました。

Firestoreから全件データを取得する

Firestoreからデータを取得します。今回はPythonで実装しました。

import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore

cred = credentials.Certificate("credential.json")
firebase_admin.initialize_app(cred)

db = firestore.client()

stations = db.collection(u'stations').get()

# データ数を出力して確認
print(len(stations))

今回はローカルで動かすだけなので firebase_admin ライブラリを利用します。
詳しいセットアップは公式のドキュメントを参考にしてください。

この数行でデータを取得できました。

microCMSのWRITE APIを使う準備をする

APIキーにPUTリクエストの権限を与える

microCMSでAPI経由でデータを書き込むにはAPIの権限追加が必要です。

新規でコンテンツを追加したい場合はPOST、コンテンツのIDを指定して作成したい場合はPUTを使います。
今回はfirestoreのドキュメントIDとmicroCMSのコンテンツIDを一致させたいのでPUTにチェックをつけました。

コンテンツIDで大文字の英字を許可しておく

この手順はWRITE系のAPIの利用で必須なわけではないですが、今回はFirestoreのドキュメントIDをそのままコンテンツIDに使いたいので設定します。

Firestoreでランダムに振られるドキュメントIDは z5dgGae4L90 のように大小の英字と数字から構成されています。
microCMSのデフォルトで英語大文字は利用できません。

設定画面から変更できるので、「英語大文字」を有効にしておきましょう。

これで準備は完了です。

pythonでmicroCMS PUT APIを叩く

pythonで以下のように実装します。

def request_put(url, data_dict):
    try:
        headers = {"Content-Type": "application/json",
                   "X-WRITE-API-KEY": "<YOUR_API_KEY>"}

        data = json.dumps(data_dict).encode("utf-8")
        request = urllib.request.Request(url, data, method='PUT', headers=headers)
        response = urllib.request.urlopen(request)
        status_code = response.getcode()
        content = response.read().decode('utf-8')

        return status_code, content
    except Exception as e:
        raise e

ヘッダーにAPI-KEYをセットしています。 data_dict には書き込む内容を渡します。

どのようなデータを渡せば良いかはmicroCMSの管理画面のAPIプレビューから確認できます。

APIプレビューは実際のリクエストを入稿画面上で確認できる機能です。
Bodyに適当な値を入れてリクエストし、想定通りコンテンツが書き込みできるか確認しましょう。

FirestoreのデータをmicroCMSに移行する

FirestoreのデータをmicroCMSに移行します。

stations = db.collection(u'stations').get()

for station in stations:
    id = station.id
    dict = station.to_dict()

    url = "https://xxxxxxx.microcms.io/api/v1/stations/{id}"
    status_code, result = request_put(url, dict)

    print(status_code)

取得できたデータをfor文で回し、1件ずつmicroCMSに登録していきます。
しばらく待てば移行完了です。

データを確認する

microCMSに入稿されたデータを確認しましょう。

管理画面にコンテンツの合計件数が表示されているので、これが最初に確認したデータを一致していればOKです。

まとめ

FirestoreからmicroCMSにデータを移行し、データの運用をしやすい環境を整えました。
これまでRetoolにFirestoreを連携させて入稿画面のようなものを作ってたんですが、microCMSの方が数倍使いやすいです。運用が楽になりました。

microCMSの書き込み系のAPIについては以下をご参考ください。

https://document.microcms.io/content-api/post-content

Discussion

ログインするとコメントできます