Google Cloud Pub/Sub トリガー
Cloud Functions は、イベント ドリブン関数を使用してクラウド インフラストラクチャのイベントを処理します。たとえば、Cloud Functions は、関数と同じ Cloud プロジェクトで Pub/Sub トピックにパブリッシュされたメッセージによってトリガーできます。Pub/Sub はグローバルに分散されたメッセージバスであり、必要に応じて自動的にスケーリングし、堅牢でグローバルな独自のサービスを構築するための基盤を提供します。
イベントの種類
Cloud Functions で使用される単一の Pub/Sub イベントが存在し、そのトリガータイプ値は google.pubsub.topic.publish
です。
このイベントは、関数のデプロイ時に指定される Pub/Sub トピックにメッセージが公開されたときに送信されます。このトピックに公開されるすべてのメッセージによって関数の実行がトリガーされ、メッセージのコンテンツが入力データとして送られます。
イベントの構造
Pub/Sub トピックからトリガーされる Cloud Functions には、PubsubMessage
タイプに準拠するイベントが送信されますが、PubsubMessage
では publishTime
と messageId
を直接使用できないことに注意します。代わりに、publishTime
と messageId
にはイベント メタデータのイベント ID とタイムスタンプのプロパティを使用するとアクセスできます。このメタデータには、呼び出しの際に関数に渡されるコンテキスト オブジェクトを介してアクセスできます。
トピックに公開されるデータである PubsubMessage
オブジェクトのペイロードは、base64 エンコード文字列として PubsubMessage
の data
属性に格納されます。PubsubMessage
オブジェクトのペイロードを抽出するには、次の例に示されているように、データ属性のデコードが必要な場合もあります。
サンプルコード
Node.js
Python
Go
Java
Kotlin
C#
Ruby
PHP
関数内からメッセージをパブリッシュする
関数内からメッセージを Pub/Sub トピックに公開することもできます。これにより、Cloud Pub/Sub メッセージを使用して、後続の Cloud Function の呼び出しをトリガーできます。この手法は、以下の処理に使用できます。
- 順次関数呼び出しを一緒に行う。
- 複数の Cloud Functions の関数インスタンス間に同時に、タスクのグループを分配(または「ファンアウト」)する。
次の例では、HTTP publish
関数によって、Pub/Sub トピックにメッセージが送信され、それによって subscribe
関数がトリガーされます。
このスニペットは、Pub/Sub トピックにメッセージをパブリッシュする publish
関数を示します。
Node.js
Python
Go
Java
このスニペットは、Pub/Sub トピックにメッセージが公開されるとトリガーされる subscribe
関数を示しています。
Node.js
Python
Java
本番環境では、次のように、cURL コマンドライン ユーティリティを使用しても publish
関数を呼び出せます。
curl https://GCF_REGION-GCP_PROJECT_ID.cloudfunctions.net/publish -X POST -d "{\"topic\": \"PUBSUB_TOPIC\", \"message\":\"YOUR_MESSAGE\"}" -H "Content-Type: application/json"
テストとデバッグ以外の場合は、gcloud functions call
コマンドを代わりに使用して、関数を直接呼び出すことができます。次の手順では、gcloud functions call
コマンドを使用して、上記のサンプルを実行する方法について説明します。
Pub/Sub トピックを作成します。ここで、
MY_TOPIC
は、作成する新しいトピックの名前です。gcloud pubsub topics create MY_TOPIC
publish
関数をデプロイします。ここで、RUNTIME
は、使用するランタイムの名前(nodejs8
など)です。gcloud functions deploy publish --trigger-http --runtime RUNTIME
subscribe
関数をデプロイします。gcloud functions deploy subscribe --trigger-topic MY_TOPIC --runtime RUNTIME
gcloud functions call
コマンドを使用してpublish
関数を直接呼び出し、必要なデータは、--data
引数で JSON 形式として指定します。gcloud functions call publish --data '{"topic":"MY_TOPIC","message":"Hello World!"}'
ログで
subscribe
関数を確認します。ログに結果が表示されるまで、数分間かかることがあります。gcloud functions logs read subscribe
次のような出力が表示されます。
D ...Function execution started I ...{"data":{"message":"Hello World!"}} D ...Function execution took 753 ms, finished with status: 'ok'
関数のデプロイ
次の gcloud
コマンドは、Pub/Sub トピックにメッセージが公開されるとトリガーされる関数をデプロイします。
gcloud functions deploy FUNCTION_NAME --entry-point ENTRY_POINT --trigger-topic TOPIC_NAME FLAGS...
引数 | 説明 |
---|---|
FUNCTION_NAME |
デプロイする Cloud Functions の関数の登録名。ソースコード内の関数の名前にすることも、任意の文字列にすることもできます。FUNCTION_NAME が任意の文字列の場合は、--entry-point フラグを含める必要があります。 |
--entry-point ENTRY_POINT |
ソースコード内の関数またはクラスの名前。FUNCTION_NAME を使用して、デプロイ時に実行する関数をソースコードに指定していない場合は省略できます。それ以外の場合は、--entry-point を使用して実行可能関数の名前を指定する必要があります。 |
--trigger-topic TOPIC_NAME |
関数が登録されている Pub/Sub トピックの名前。トピックが存在しない場合は、デプロイ時に作成されます。 |
FLAGS... |
デプロイ時に指定する必要がある --runtime などの追加フラグ。網羅的なリファレンスについては、gcloud functions deploy のドキュメントをご覧ください。 |
Pub/Sub トリガーの使用法を示す完全な例については、Pub/Sub チュートリアルをご覧ください。
レガシー Cloud Pub/Sub トリガー
次の gcloud
コマンドは、特定のトピックでレガシー Pub/Sub 通知によってトリガーされる関数をデプロイします。これらのイベントをすでに使用しているレガシー関数では、これらの通知がサポートされます。ただし、将来、レガシー通知は削除される可能性があるため、代わりに --trigger-topic
フラグの使用をおすすめします。
gcloud functions deploy FUNCTION_NAME \ --trigger-resource TOPIC_NAME \ --trigger-event providers/cloud.pubsub/eventTypes/topic.publish \ FLAGS...
次のステップ
Pub/Sub によってトリガーされるイベント ドリブン関数を実装する方法の例について、Pub/Sub チュートリアルで確認する。