Cloud Functions を使っていると、クライアントやサーバー側に何かしらの制限があり、その制限を越えてどうにかプログラムを実行させたいケースによく遭遇します。
- CASE1:クライアント側の制限
-
Slack の Events API や Slash Command などが挙げられます。この制限はクライアント側でイベントを発火させたあと3秒以内で何かしらのレスポンスを返さないとエラーになるというものです。
この解決策は、とりあえず Slack にレスポンスを返し、実際の処理は別の Cloud Functions から実行すれば時間を気にせず処理を実行することができます。
- CASE2:サーバー側の制限
-
サーバー側( Cloud Functions )の制限は、最大実行時間( 540 秒)を越えて処理を行いたい場合が挙げられます。
この解決策も処理を分割して別の Cloud Functions から実行すれば、最大実行時間はいくらでも引き伸ばすことができます。
この記事では、別の Cloud Functions にデータを渡して実行させる方法を紹介します。
目次
仕組み
まず、以下のような Cloud Functions を2つ作成します。
- GCF1:データを送る Cloud Functions(トリガー:何でも良い)
- GCF2:データを受け取る Cloud Functions (トリガー:Pub/Sub)
ざっくりとした仕組みとしては、GCF1 で Pub/Sub イベントトリガーを発火させ、GCF2 を起動させるイメージです。
データを送る
データを送る Cloud Functions のトリガーは何でも良いので、この記事では HTTP トリガーにしました。この関数では、受け取り先のプロジェクト ID とトピック名を指定してパブリッシュします。
import json
from google.cloud import pubsub_v1
def main(request):
payload = {
'val1': 'GCF1から来ました',
'val2': 1000,
}
client = pubsub_v1.PublisherClient()
topic_path = client.topic_path(PROJECT_ID, TOPIC_NAME)
client.publish(topic_path, data=json.dumps(payload).encode())
return ''
google-cloud-pubsub==2.8.0
データを受け取る
データを受け取る Cloud Functions のトリガーは Pub/Sub トリガーにします。送られてきたデータはevent
に格納されています。
import json
import base64
def main(event, context):
data = json.loads(base64.b64decode(event['data']).decode('utf-8'))
# <class 'dict'>
# {'val1': 'GCF1から来ました', 'val2': 1000}
コメント