Google Cloud Functions (Python) から Cloud Firestore の データを 読み出す – Cloud SDK を使う方法 と Firebase Admin SDK を使う方法 –

Cloud Firestore を Python で作成した Cloud Functions から利用するには 活用する SDK 別に以下の2つがあります。

両者に特に メリット / デメリット があるわけではなさそうですが、少し紛らわしい部分もありますので、 簡単なサンプルコード を用いて整理していきたいと思います。


前提

本記事は以下を前提としてすすめていきます。

これらについては、以下の記事も参考にしてください。


Cloud Firestore の内容を Read する

データ 登録済みの Cloud Firestore のデータを Python で作成した Cloud Functions で読み出してみます。

Read する Cloud Firestore データ の内容

今回読み出してみる Firestore のデータを GCP Console からみてみます。名前 フィールド のみを持つ シンプル な データ 構造となっています。

ちなみに Firebase Console からみてみても、同じ データ を確認することができます。

ベース となる 関数の準備

次に、 ベース となる 最小構成の Python 関数を作成していきます。

# main.py
def readFirestore(request):
   return {"response": "success"}

この関数を以下の コマンド で Functions Framework を用いて ローカル 環境で実行してみます。

sudo functions_framework --target=readFirestore --debug --port=5000

http://localhost:5000 にアクセスしてみると、以下の結果が表示されます。

{
    "response": "success"
}

Python Client for Google Cloud Firestore の インストール

Cloud SDK を用いる方法を進める前に Python Client for Google Cloud Firestore が インストールされていない場合は 以下の コマンド で インストール してください。

pip install google-cloud-firestore

Cloud SDK を用いて Python Cloud Functions から Cloud Firestore の データ を読み出す

それでは、Cloud SDK を使って、先程作成した readFirestore 関数から Cloud Firestore の データ を読み出していきます。

  • google.cloud から firestore を インポート
  • Firestore の ‘test’ コレクション への リファレンス を設定
  • stream() を使用して ドキュメント への リファレンス を設定
  • ドキュメント の内容を ドキュメント ID と共に print
def readFirestore(request):
   from google.cloud import firestore
 
   db = firestore.Client()
   test_ref = db.collection(u'test')
   docs = test_ref.stream()
 
   for doc in docs:
       print(f'{doc.id} => {doc.to_dict()}')
 
   return {"response": "success"}

再び http://localhost:5000 にアクセスしてみると、出力結果の表示は同じですが、 ターミナル に以下のような ログ が 出力され Cloud Firestore の データ を読み出すことができました。

7bbSB8YQs7Q3pPlwU2qI => {'name': 'Ken'}
JP27qDXRXyBA7pSxMjeu => {'name': 'Leo'}
LuT4irFA54w95z7pFnTY => {'name': 'Steven'}
UxrQP2dRnrV8DuX1rkw5 => {'name': 'David'}

デプロイ に 用いる requirements.txt

Cloud SDK については Cloud Functions に標準で用意されているため、 requirements.txt に特に記載することなく デプロイ することが可能です。


Firebase Admin SDK を用いて Python Cloud Functions から Cloud Firestore の データ を読み出す

続いて、 Firestore Admin SDK を用いた方法についても整理していきます。

  • firebase_admin をインポート し、 そこから credentials, firestore を インポート
  • credentials.ApplicationDefault() を用いて アプリケーション の デフォルトの認証を取得
  • firebase_admin.initialize_app() を用いて SDK を初期化
    • ‘projectID’ に 対象となる プロジェクト ID を指定
    • 本記事では ‘sample-for-blog’ という プロジェクト

以降は Cloud SDK と同様
(ただし、 firestore.client() と c が小文字となっている点に注意)

def readFirestore(request):
  import firebase_admin
  from firebase_admin import credentials
  from firebase_admin import firestore
  # Use the application default credentials
  cred = credentials.ApplicationDefault()
  firebase_admin.initialize_app(cred, {
      'projectId': 'sample-for-blog',
  })
  db = firestore.client()
  test_ref = db.collection(u'test')
  docs = test_ref.stream()
  for doc in docs:
      print(f'{doc.id} => {doc.to_dict()}')
  return {"response": "success"}

再び http://localhost:5000 にアクセスしてみると、ターミナル に以下のような ログ が 出力され、先程の Cloud SDK のときと同様の Cloud Firestore の データ を読み出すことができました。

7bbSB8YQs7Q3pPlwU2qI => {'name': 'Ken'}
JP27qDXRXyBA7pSxMjeu => {'name': 'Leo'}
LuT4irFA54w95z7pFnTY => {'name': 'Steven'}
UxrQP2dRnrV8DuX1rkw5 => {'name': 'David'}

デプロイ に 用いる requirements.txt

Firebase Admin SDK については Cloud Functions に標準で用意されていないため、 以下の内容で  requirements.txt を作成した上で デプロイ する必要があります。 バージョン は 本記事作成時の最新版としています。

# requirements.txt
firebase-admin==5.0.3

requirements.txt を main.py と同じ ディレクトリ に作成後 以下の コマンド で デプロイ します。

gcloud functions deploy readFirestore --runtime python39 --trigger-http --allow-unauthenticated

まとめ

2 つの方法で GCP Cloud Functions から Cloud Firestore の データ を読み出してみました。 同じ GCP ということで Cloud SDK を用いる方法の方がより少ない ステップ で実装することができました。

  • Cloud Functions (Python) から Cloud Finrestore を利用するさいには 以下の 2 つの方法がある
    • Cloud SDK を用いる方法
    • Firebase Admin SDK を用いる方法
  • Cloud SDK を用いる方法では デプロイ 時に requirements.txt を用意する必要なし
  • Firebase Admin SDK を用いる方法では デプロイ 時に requirements.txt を用意する必要あり

関連記事

関連サイト

Python Client for Google Cloud Firestore — google-cloud-firestore documentation

Use Firestore with Cloud Functions