Think Big Act Local

microCMSのWRITE APIを使ってFirebaseのデータをmicroCMSに移行する

開発日誌

microCMSのWRITE APIを使ってFirebase FirestoreのデータをmicroCMSに移行する

アプリのバックエンドのデータストアにFirestoreを使っていましたが、microCMSに移行を考えています。
Firestoreに保存してあるデータを取得し、microCMSのWRITE APIを使ってそのデータをmicroCMS側に移す実装について紹介します。

microCMSに移行する理由

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

  • 全文検索に標準で対応している(FirestoreはAlgolia + Cloud Functionsなどの実装が必要)
  • ダッシュボードがわかりやすくデータを入稿しやすい
  • データ件数は10,000件以下で今後超える予定もないので、microCMSでも無料で使える


今回移行するデータはユーザー共通で使うメディアデータです。
そのためFirestoreで管理する必須の理由はなかったのですが、手頃なデータストアがなくFirestoreに置いていました。

microCMSの存在を知り、使い勝手が良さそうに感じたので移行を試すことにしました。

microCMSのAPIを作成する

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

Firestoreではドキュメントごとに異なる構造のデータを持てますが、microCMSではドキュメント共通のスキーマを持つことになります。
このあと使うmicroCMSのPUT APIでは、スキーマに存在しないkeyのデータを送るとエラーになるので気をつけましょう。

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を使う準備をする

WRITE APIを許可

microCMSにデータを書き込むにはWRITE APIを利用します。
WRITE APIはデフォルトではオフになっているので、設定から利用できるよう変更しましょう。

新規でコンテンツを追加したい場合はPOST、コンテンツのIDを指定したい場合はPUTを使います。

今回はfirestoreのドキュメントIDとmicroCMSのコンテンツIDを一致させたいのでPUT APIを利用します。

WRITE-API-KEYを取得

書き込みのためのAPI KEYを取得します。デフォルトでは生成されてないので生成しましょう。

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

このステップは必須ではありませんが、今回のようにFirestoreのドキュメントIDをそのままコンテンツIDに使いたい場合は必要です。
Firestoreでランダムに振られるドキュメントIDはz5dgGae4L90 のように大小の英字と数字から構成されています。

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

これで準備は完了です。

pythonでmicroCMS PUT APIを叩く

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

def request_put(url, data_dict):
    try:
        headers = {"Content-Type": "application/json",
                   "X-WRITE-API-KEY": "<YOUR_WRITE_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


ヘッダーに先ほど取得したWRITE用のKEYをセットしています。data_dict には書き込みたい内容を渡すイメージですね。

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

HTTPメソッドをPUTに変更するとBodyにサンプルの値が表示されるので、どういう値を入れれば良いか確認しましょう。
右上の「送信」ボタンを押せばPUTリクエストを試すこともできます。便利ですね。

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です。

まとめ

microCMSのWRITE APIを使ってFirestoreからデータを移行する方法を紹介しました。
APIプレビューの機能がとても便利でスムーズにリクエストを構成でき、全文検索を手に入れることができました。

参考

* https://blog.microcms.io/introduce-write-apis/

ABOUT ME

himara2
Swift, Python, Flutterなどを書いて過ごしてます。