LoginSignup
3
3

More than 3 years have passed since last update.

Google Cloud FunctionsからCloud Firestoreにpythonコードで接続する方法

Last updated at Posted at 2020-02-02

はじめに

Google Cloud Functions for Firebaseではなく、pythonコードかつGoogle Cloud Functionsから繋ぎたい時にどうするかという対応方法をまとめました。

Firebaseから認証情報引っ張ってくるとかは書いてないので、他の記事を参考にしてください。

環境

python 3.7で作ったGoogle Cloud Functions

firebase-admin 3.2.1

Google Cloud Functionsでpythonコードを作った時の制限

main.pyとrequirements.txtしか受け付けてくれないようです。
よくあるserviceAccountKey.jsonファイルを読み込んでーという方法ではだめでした。
credentials.Certificateにファイルパスくわせて認証する一般的なやり方ですね。

credentials.Certificateをファイル以外から作成しよう

なので、他の方法を探りました。

まずはAPI仕様書を確認しました。
https://firebase.google.com/docs/reference/admin/python/firebase_admin.credentials

A credential initialized from a JSON certificate keyfile.

ということでkeyファイルからやるやつだよってことらしいです。
ちなみにjavascript側からだとAPI仕様書にファイル以外から受け付けるやり方書いてますので、javascript使ってる方はAPI仕様書をご覧ください。

それじゃどういう処理してるんだろうと思って、ソース見に行きました。
https://github.com/firebase/firebase-admin-python/blob/master/firebase_admin/credentials.py

# 上記URLの81行目から引用
if isinstance(cert, str):
    with open(cert) as json_file:
    json_data = json.load(json_file)
elif isinstance(cert, dict):
    json_data = cert

出来るんかーい。
ということでdict型にして渡してあげればそれで読み込んでくれるようです。
ソース読むもんですね。

それじゃ実装しよう

私の場合はこのコードをgithubで公開しているため、環境変数にserviceAccountKey.jsonの中身をそのまま設定して読み込んでいます。
公開しないよって人はpythonコード内に埋め込んでも大丈夫ですが、これ漏れるとまずいので扱いは気をつけてください。

環境変数部分はpython-dotenvを使っていますが、省略します。

client作成コードを抜き出した版は以下です。

import os
import json
import firebase_admin
from firebase_admin import firestore
from firebase_admin import credentials

cred = credentials.Certificate(json.loads(os.environ.get("FIREBASE_KEY")))
firebase_admin.initialize_app(cred)
db = firestore.client()

依存するライブラリは

firebase-admin
google-cloud-firestore

の2つなので、入れておいてください。
firebase-adminしかコード上には現れませんが、firebase-admingoogle-cloud-firestoreに依存しているため、2つとも必要です。

おわりに

Google Cloud Functions For Firebaseがpythonに対応しますよーに(そうすれば何も問題はなかった)

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3