【ITニュース解説】Part-46: Trigger a Cloud Function based on Pubsub Subscriptions in GCP
2025年09月13日に「Dev.to」が公開したITニュース「Part-46: Trigger a Cloud Function based on Pubsub Subscriptions in GCP」について初心者にもわかりやすく解説しています。
ITニュース概要
GCPのCloud Pub/SubとCloud Functions連携で、Pub/Subへのメッセージ発行をトリガーにFunctionsを自動実行する設定方法を紹介する。トピック作成、Functions設定、メッセージ発行、ログ確認の手順で、イベント駆動型のシステム構築を学ぶ。
ITニュース解説
Google Cloud Platform(GCP)を使ったシステム開発において、特定の出来事(イベント)をきっかけに自動的に処理を実行する「イベント駆動型アーキテクチャ」は、現代のアプリケーション構築に欠かせない考え方だ。この記事では、GCPが提供する二つの重要なサービス、Cloud Pub/SubとCloud Functionsを連携させ、メッセージの受信をトリガー(引き金)としてコードを自動実行する仕組みについて解説する。
まず、Cloud Pub/Subは、アプリケーション間でメッセージをリアルタイムにやり取りするための、信頼性の高いメッセージングサービスである。これは「発行/購読(Publish/Subscribe)」モデルに基づいて機能する。メッセージを送りたい側(発行者)は「トピック」と呼ばれる特定のチャネルにメッセージを送信し、そのメッセージを受け取りたい側(購読者)は、同じトピックを「サブスクリプション」を通して購読する。この仕組みにより、発行者は誰がメッセージを受け取るかを意識することなくメッセージを送ることができ、購読者は自分が必要とするメッセージだけを効率的に受け取ることが可能になる。これは、システムの各部分が疎結合になり、柔軟な連携を実現するために非常に有効な手段である。
次に、Cloud Functionsは、サーバーの管理を一切行わずにプログラムコードを実行できる「サーバレス」なサービスだ。開発者はコードを書くだけでよく、インフラの構築や運用についてはGCPが全て管理してくれる。Cloud Functionsは特定のイベントが発生したときにのみ実行されるため、必要なときにだけコンピューティングリソースが消費され、コスト効率が良いという特徴を持つ。イベントには、データベースの変更、ファイルストレージへのアップロード、そして今回のようにCloud Pub/Subへのメッセージ送信など、さまざまな種類がある。
Cloud Pub/SubとCloud Functionsを組み合わせることで、Cloud Pub/Subトピックにメッセージが公開されると、それをトリガーとしてCloud Functionsにデプロイされたコードが自動的に実行される、という強力なシステムを構築できる。これにより、データストリームのリアルタイム処理、異なるシステム間の非同期連携、イベントに応じた自動化されたアクションなどを容易に実現できるのだ。
それでは、具体的な設定手順を見ていこう。
最初のステップは、Cloud Pub/Subトピックの作成である。GCPコンソールでCloud Pub/Subサービスに移動し、「トピックを作成」を選択する。ここで、トピックIDとして「mytopic1」と入力し、その他の設定はデフォルトのままでトピックを作成する。この「mytopic1」が、メッセージを発行する側と購読する側をつなぐ中心的なハブとなる。トピックが作成されると、それに関連付けられたデフォルトのサブスクリプションも自動的に生成されることを確認できる。
次に、Cloud Functionを作成し、Pub/Subトリガーを設定する。Cloud Functionsサービスに移動し、新しい関数を作成する設定画面に進む。サービス名には「cf-demo2-events-pubsub」を指定し、リージョン(関数の実行拠点となる地理的な場所)は例えば「us-central1」を選択する。ここで最も重要なのは「トリガー」の設定だ。トリガーの種類として「Cloud Pub/Sub」を選択し、関連付けるPub/Subトピックとして先ほど作成した「mytopic1」を指定する。この設定により、mytopic1にメッセージが送られるたびに、このCloud Functionが自動的に起動するようになる。
関数のコードについては、ランタイムとして「Node.js 20」を選択する。提供されるサンプルコードは以下の内容だ。
1const functions = require('@google-cloud/functions-framework'); 2 3functions.cloudEvent('helloPubSub', cloudEvent => { 4 const base64name = cloudEvent.data.message.data; 5 6 const name = base64name 7 ? Buffer.from(base64name, 'base64').toString() 8 : 'World'; 9 10 console.log(`Hello, ${name}!`); 11});
このコードは、Cloud FunctionがPub/Subからのメッセージを受信したときに実行される処理を定義している。functions.cloudEvent('helloPubSub', cloudEvent => { ... })の部分が、CloudEventとしてPub/Subメッセージを受け取る関数だ。cloudEventオブジェクトには、トリガーとなったイベントに関する詳細情報が含まれており、特にcloudEvent.data.message.dataには、Pub/Subメッセージの本体がBase64エンコードされた形式で格納されている。Base64エンコードとは、データをASCII文字の組み合わせに変換する方式で、主にインターネット上でテキスト以外のデータを安全に転送する際に使われる。
コードはまず、このBase64エンコードされたデータbase64nameを取得する。次に、Buffer.from(base64name, 'base64').toString()を使って、このBase64データを元の文字列にデコードしている。もしメッセージ本体が存在すればその内容をname変数に格納し、もしメッセージ本体が空だった場合はデフォルトで「World」という文字列をnameとする。最後に、console.log(Hello, ${name}!);という行で、「Hello, [メッセージの内容またはWorld]!」という文字列を関数のログに出力する。このコードを保存し、Cloud Functionをデプロイする。
デプロイが完了したら、Cloud Functionのログ画面(Cloud Functionのダッシュボードから該当関数を選択し、「ログ」タブへ)に移動して、現在のログの状態を確認する。この時点ではまだメッセージが発行されていないため、関数の実行ログは表示されないはずだ。
次に、実際にCloud Pub/Subトピックにメッセージを発行して、Cloud Functionがトリガーされるかを確認する。Cloud Pub/Subサービスに戻り、「mytopic1」トピックを選択し、「MESSAGES」タブに移動する。ここで「メッセージを公開」を選択し、発行するメッセージの数を「10」、メッセージ本文を「My Pub/Message」と入力して、メッセージを公開する。この操作が、Cloud Functionを起動する「イベント」を発生させることになる。
メッセージの発行後、再びCloud Functionのログ画面に移動する。すると、「Hello, My Pub/Message!」というメッセージが複数回(具体的には、発行したメッセージの数と同じ10回)出力されていることが確認できるだろう。これは、Cloud Pub/Subに送られた各メッセージが、設定したCloud Functionを正常にトリガーし、そのコードが期待通りに実行されたことを明確に示している。
この一連の作業を通して、Cloud Pub/SubとCloud Functionsがいかに強力に連携し、リアルタイムで自動化されたイベント駆動型システムを構築できるかを体験できたはずだ。システムエンジニアとして、このようなクラウドサービスを適切に組み合わせる能力は、現代の複雑なシステムを効率的かつスケーラブルに構築するために不可欠なスキルとなるだろう。