見出し画像

【GCP】初めてのgoogle Cloud FunctionsとFirestoreの簡単連携例(Python)

この度、久しぶりにアプリを作ってリリースすることにしました。

実は以前に同様のアプリを出していましたが、とある事が原因で、
アプリを公開停止していました。

その問題とは、
「アプリの使用権を外部から付与することができない」
という問題でした。

具体的には、僕のアプリは1ヶ月は無料で使用でき、
1ヶ月経ったらそれ以上使うためにはアプリ内課金で使用権を購入してもらう必要がある、という使用制限の作りをしていましたが、
アプリ内課金で何らかの問題があった場合に、リカバリーする方法がない、という問題でした。

この問題を解消する為に、例えば、使用制限を外したアプリをユーザーに渡すこともできますが、そのアプリが出回れば終わり、
また、パスコードを入れたら制限を解除できる仕組みを入れることもできますが、パスコードが出回ればそれでも終わり、となり、
アプリ単体では限界かな、と思われました。。

そこで今回、上の問題を解消できる方法として、サーバーの仕組みを作り、
サーバーに登録したメールアドレスをアプリからサーバーに投げてチェックして、アプリの使用制限を解除する、という方法を取ろうと考えました。

ただ、僕はアプリのみの技術者で、これまでサーバー側はほぼやったことがなく、APIを使用するのみ、という状況でしたので、
いざサーバー側を作ろうと思うと、そもそも環境からどうしよう、という壁にぶち当たりました。

できるだけ費用負担が少なく、できるだけ簡単に作りたい、と思っていましたので、時代的にもクラウドの使用は必須と思いました。
で、クラウドのサーバーとして真っ先に思いつくのはAWSなので、
AWSでしようかと思いましたが、あまり小規模には向いていないように思われ、まあAndroidだしWebサービスをいろいろ使っているのはGoogleだし、
ということで、Google Croud Platform(GCP)を調べてやってみよう、
という事に決めました。

で、まずはAPI。とりあえずアプリから呼んで簡単な処理をしてレスポンスを返せばOKで、使用頻度も複雑さも少ない、という方針で調べた結果、
「Google Cloud Functions」が良さそうでした。
呼ばれた時に動くだけなようでしたし、料金も毎月200万回までは無料のようでしたし・・・(絶対にそんなに使わない)

そして、色々調べながら実装して、ひとまずブラウザでの「Hello World」表示・アプリでのレスポンスの受け取りができるようになりました。

続いて、今回必須機能の、DBとの連携です。今回は最低限の機能としては、
DBに対象メールアドレスを手入力し、
メールアドレスをアプリから送って、一致したらOKをアプリに返し、
アプリがOKを受け取ったら、アプリの使用制限を解除する、
という機能です。

で、GCPで使うDBとしては、Google Croud FireStoreが良いようでした。

それでまた色々調べて色々試した結果、
アプリからメールアドレスをGETで付与してCloud Functions APIを呼んでサーバに接続し、
サーバ側でFireStoreDBを確認して受け取ったメールアドレスが登録されているか、また、そのメールアドレスが使用済ではないかを確認し、
条件に合致したらそのメールアドレスを使用済にしてアプリにOKを返す、
という仕組みができました。

この仕組みの一部を下に載せます。

APIのソース:
main.py 

import os
import functions_framework
from google.cloud import firestore


MY_PROJECT_ID = "zankei"

@functions_framework.http
def hello_http(request):

    #パラメタ取得
    data = request.args.to_dict()
    mail = data.get('mail')
    # Firestoreのデータ検索
    db = firestore.Client(project=MY_PROJECT_ID)
    doc_ref = db.collection("user_manage").document(mail)

    doc = doc_ref.get()
    if doc.exists:
        if doc.to_dict()["c_authorize_done"] == 'false':#登録済み・リカバリー未処理
            status = '2'
            errorcode = '0'
        else:#登録済み・リカバリー処理済み
            status = '1'
            errorcode = '2'
    else: #未登録
        status = '1'
        errorcode = '1'

    return f"status:{status},errorcode:{errorcode}"

requirements.txt 

functions-framework==3.*
google-cloud-firestore

(この後に、別のAPIでDBに処理済みをセットします)

FireStoreDB:

FirestoreDBキャプチャ

このような感じで、サーバー側の仕組みができて、
アプリからAPIを呼んで、アプリが想定通りに動くことも確認できました。

サーバの実装についてや、特にGCPについては全く知りませんでしたが、
なんとかできました。
初心者でもやりやすいようになっているのでは、と思います。

もし興味がある方は上記とかを参考にしてもらって試してみてもらうとよろしいかと思います。

また、作ったアプリも使ってみていただけるとありがたいです。

最後までお読みいただき、ありがとうございました。



この記事が気に入ったらサポートをしてみませんか?