TechPythonGCP-FirebaseCloud FunctionsJapanese

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

Tech

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

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

[ads]

前提

[ads]

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

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

[ads]

Cloud Firestore の内容を Read する

[ads]

データ 登録済みの 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 に特に記載することなく デプロイ することが可能です。

[ads]

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
[ads]

まとめ

[ads]

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

[ads]
Ads