Help us understand the problem. What is going on with this article?

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

はじめに

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に対応しますよーに(そうすれば何も問題はなかった)

tasogarei
元々Java屋さんでしたがRailsはじめました。 と思ったらPython書いたりもしてます。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away