MENU

Cloud Functions から別の Cloud Functions にデータを渡して実行させる

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}

この記事が気に入ったら
フォローしてね!

シェアしていただけると励みになります
  • URLをコピーしました!

コメント

コメントする

目次
閉じる