関数、イベント、トリガーを使いこなしてイベント ドリブン アプリを構築する方法
Google Cloud Japan Team
※この投稿は米国時間 2021 年 10 月 20 日に、Google Cloud blog に投稿されたものの抄訳です。
現在、多くの開発者がイベント ドリブン アーキテクチャ(EDA)を使用したアプリケーションの設計を目指しています。これは、イベントの生成、検出、利用およびイベントへの応答に重点を置いたソフトウェア アーキテクチャ パラダイムです。これは、疎結合したソフトウェア コンポーネントとサービスの間でイベントを送信するアプリケーションやシステムの設計と実装に適用するのに最適なアーキテクチャ パターンです。
Cloud Functions という Google の Functions-as-a-Service(FaaS)プロダクトを使用すれば、イベントとトリガーを活用したイベント ドリブン アプリケーションを構築できます。イベントとは、アクションの対象となる、クラウド環境内で発生するあらゆる種類のアクティビティや事象を指します。たとえば、データベース内のデータに対する変更、ストレージ システムへのファイルの追加、新しい仮想マシン インスタンスの作成などです。イベントが発生したときには、トリガーを使って関数を呼び出せます。イベントとトリガーを扱える Cloud Functions は、サーバーを管理せずにコードを実行するためのスケーラブルな従量課金制 Functions as a service(FaaS)です。
このブログでは、Cloud Functions、イベント、トリガーを使用してスケーラブルなイベント ドリブン アーキテクチャを構築する方法を説明します。イベント ドリブン アーキテクチャの概要を説明したうえで、最近のニュース イベントを例に、Cloud Functions、イベント、トリガー、Natural Language API を使用して、既知のあらゆるエンティティ(個人、場所、組織、イベント、消費財など)に関するエンティティ感情メタデータを保管するリポジトリを構築する際のプロセスを段階ごとに解説します。
このリポジトリを使用すれば、ニュースの中で表現されている、各種エンティティについての感情(ポジティブかネガティブか)を判断できます。たとえば、2021 年 10 月 12 日から 14 日にかけて開催された Google Cloud Next ‘21 では、幅広い Google Cloud プロダクトに関するディスカッションが行われました。これらのプロダクトがさまざまなメディアや開発者ブログでどのように受け止められているのかを理解することは、このイベントの全体的な有効性を判断するうえで貴重な情報になります。
Cloud Functions、イベント、トリガーについて
例について説明する前に、イベント ドリブン アーキテクチャを構成する各種のコンポーネントについて確認しましょう。
イベントとは、データベース内のデータに対する変更や、ストレージ システムへのファイルの追加、新しい仮想マシン インスタンスの作成といった、対応アクションが必要になるかもしれないクラウド環境内で発生するあらゆる種類のアクティビティや事象を指します。Cloud Functions では次のプロバイダのイベントがサポートされています。
Firebase(Realtime Database、Cloud Storage、アナリティクス、Auth)
たとえば、Cloud Pub/Sub トピックに新しくパブリッシュされたメッセージや、Cloud Storage バケットに加えられた変更によってイベントを生成し、そのイベントによってアクションをトリガーできます。イベントが原因でアプリケーションの状態が変わることもあります。たとえば、お客様が商品を購入すると、その商品の状態は「入手可能」から「売却済み」に変わります。
上記の主要なイベントソースだけでなく、他の多くのソースでも Pub/Sub を使用することでメッセージ(Cloud Build の通知や Cloud Scheduler ジョブなど)を提供できます。
Cloud Functions の関数には、HTTP 関数とイベント ドリブン関数の 2 種類があります。さらに、イベント ドリブン関数は Cloud Functions のどのランタイムを対象に記述されているかによって、バックグラウンド関数または CloudEvent 関数のいずれかになります。
HTTP 関数
HTTP 関数は、標準の HTTP リクエストによって呼び出せます。クライアントは HTTP リクエストを送信した後、同期的にレスポンスを待機します。HTTP 関数では、一般的な HTTP リクエスト メソッド(GET、PUT、POST、DELETE、OPTIONS など)の処理がサポートされています。
イベント ドリブン関数
Cloud Functions ではイベント ドリブン関数を使用して、Cloud インフラストラクチャで発生したイベント(Pub/Sub トピックへのメッセージ公開や Cloud Storage バケット内の変更など)に対処できます。Cloud Functions では、イベント ドリブン関数の 2 つのサブタイプがサポートされています。
バックグラウンド関数: Node.js、Python、Go、Java の Cloud Functions ランタイム用に記述されたイベント ドリブン関数は、バックグラウンド関数と呼ばれます。詳細については、バックグラウンド関数の記述をご覧ください。
CloudEvent 関数: .NET、Ruby、PHP のランタイム用に記述されたイベント ドリブン関数は、CloudEvent 関数と呼ばれます。詳細については、CloudEvent 関数をご覧ください。
Pub/Sub トピックへのメッセージ、Cloud Storage バケット内の変更、Firebase イベントなどのイベントに応答して間接的に Cloud Functions を呼び出す場合は、バックグラウンド関数と CloudEvent 関数などのイベント ドリブン関数を使用できます。
CloudEvent 関数は、バックグラウンド関数と概念的によく似ています。この 2 つの種類の関数の主な違いは、CloudEvent 関数は CloudEvents という業界標準のイベント形式を使用することです。別の違いは、Cloud Functions の関数自体が HTTP リクエストを使用して CloudEvent 関数を呼び出せることです。この呼び出しは他のコンピューティング プラットフォームで再現できます。このような違いがあるため、CloudEvent 関数はコンピューティング プラットフォーム間でシームレスに移動できます。
このブログでは一貫して CloudEvent 関数を使用して、Cloud Functions を使ってイベント ドリブン アーキテクチャを構築する方法を説明するデモを組み立てていきます。
イベント ドリブン アーキテクチャ(EDA)について
イベント ドリブン アーキテクチャ(EDA)は、イベントの生成、検出、利用およびイベントへの応答に重点を置いたソフトウェア アーキテクチャ パラダイムです。このアーキテクチャ パターンは、疎結合したソフトウェア コンポーネントとサービスの間でイベントを送信するアプリケーションやシステムの設計と実装に適用するのに最適です。
すべての要素をまとめた例
イベント ドリブン アーキテクチャの作成に重点を絞ったこの例では、Cloud Functions(イベント ドリブン)、Cloud Scheduler などのマネージド サービスと Google Cloud の機械学習 API を使用して RSS フィードのコンテンツを分析するサービスを構築します。
目標
この例で目標とするのは、毎日一定の間隔で RSS フィードを収集、解析し、機械学習 API を使用してこれらのフィードのエンティティ感情分析を行い、その結果を保存することです。エンティティ感情分析とは、エンティティ分析と感情分析の両方を組み合わせたものであり、テキスト内でエンティティについて表現された感情(ポジティブかネガティブか)の特定を試みることです。これは、次のような場合に役立ちます。
ブログやニュース記事で言及されているあらゆるエンティティ(製品、会社、個人など)を特定したい場合
エンティティについて表現されている感情を明らかにしたい場合
このようなユースケースでは、データ エンジニアリング チームがニュースで最も頻繁に言及されているエンティティといった最近のトレンドとそのエンティティに関する感情を調べ、市場でのエンティティに対する受け止め方を理解することができます。
アーキテクチャ:
上記のアーキテクチャは、RSS フィードを収集して直ちに分析する場合のワークフローを示しています。ロジックは次のとおりです。
ステップ 1: 1 つの RSS フィードのリンクには 1 つ以上の URL が含まれています。RSS フィードのリンクに含まれるこれらの URL を解析してキューに保管する関数を記述します。
ステップ 2: ステップ 1 のキューから URL を 1 つずつ読み取り、それぞれに対応するウェブページのコンテンツをダウンロードする関数を記述します。すべてのウェブページのコンテンツを永続ストレージ内に保存します。
ステップ 3: 最後に、さらに別の関数を記述します。この関数で、ステップ 2 の永続ストレージ内に保存されているウェブページのコンテンツを読み取って分析し、その結果を別の永続ストレージ ターゲットに書き込みます。
上記のステップを、Google Cloud マネージド サービスを使用して構築する手順は次のとおりです。
ステップ 1: Cloud Scheduler でサンプル メッセージを Pub/Sub に書き込みます。これは、このイベントが発生するとすぐに起動するように構成した Cloud Functions の関数を呼び出すことだけを目的としています。
上記のような構成では、毎日午前 5 時(PDT)にメッセージが Pub/Sub トピックに書き込まれます。
ステップ 2: RSS フィードには 1 つ以上のウェブページの URL が含まれています。ステップ 1 で Pub/Sub に書き込まれたメッセージによってトリガーされた Cloud Functions の関数は、RSS フィードのコンテンツをダウンロードし、コンテンツに含まれるウェブページ URL のリストを解析します。これらの URL は、さらに処理を行うために別の Pub/Sub トピックに書き込まれます。
上記のような構成では、Pub/Sub トリガーによって午前 5 時に Scheduler イベントが到着した時点で、Cloud Functions が実行を開始します。
C#、.NET Core 3.1 で記述された以下のサンプルコードは、RSS フィードを解析して、そこに含まれているウェブページ URL を収集します。
関数 PublishMessageWithRetrySettingsAsync はこちらで確認できます。
ステップ 3: ステップ 2 で Pub/Sub に URL エントリが書き込まれると、新しい Cloud Functions の関数がトリガーされます。この関数はウェブページのテキストをダウンロードし、そのテキストを Cloud Storage バケットに書き込みます。上記のような構成では、RSS フィードから収集してステップ 2 で Pub/Sub に書き込んだウェブページ URL ごとに、Cloud Functions の関数が実行されます。
Python 3.9 で記述された以下のサンプルコードは、ウェブページのテキストをダウンロードして、そのテキストを Cloud Storage 内に保存します。ウェブページの解析とテキストの抽出には、BeautifulSoup ライブラリが使用されています。
ステップ 3 では、ウェブページのテキストが Cloud Storage 内に次のように保存されます。
ステップ 4: ステップ 3 での新しいファイルの作成イベントにより、新しい Cloud Functions の関数がトリガーされます。この関数は、ウェブページのテキストに対してエンティティ感情分析を行い、その結果を別の Cloud Storage バケットに書き込みます。
上記のような構成では、ダウンロードされて Cloud Storage バケット内に保存されたウェブページのテキストごとに、Cloud Functions の関数が実行されます。
Nodejs 14 で記述された以下のサンプルコードは、Cloud Storage バケットからデータを読み取り、ダウンロードされたウェブページのテキストを解析して、その結果を Cloud Storage 内に保存します。
analyzeEntitySentiment 関数がエンティティ感情分析を行います。Natural Language API には、テキストデータを分析してアノテーションを付けるための複数のメソッドがあります。Natural Language API を使用してテキストデータの分析を行う例については、こちらをご覧ください。
データ エンジニアリング チームは収集された分析データを使用して、「最近最もよく話題に上っているエンティティ(個人、製品など)はどれか」、「そのエンティティについてどのような感情が持たれているか」といった質問の答えを見つけることができます。こうした質問は、既存のマーケティング キャンペーンの全体的な有効性や最新のトレンドを把握して、より効果的なマーケティングや広報キャンペーンを作成するうえで役立ちます。
関連情報:
上述のサービスによるすべてのログは、Cloud Logging で入手できます。
Cloud Functions をローカルでテストしてデバッグできます。
すべてのサービスは疎結合されています。
Vertex AI を使用して、収集されたメタデータを最後に分析できます。
まとめ:
Cloud Functions は、イベント ドリブン アプリケーションを最小限の作業で構築するために使用できる有益なサービスです。上記のチュートリアルでは、Cloud Functions のイベント、トリガーと他の Google Cloud サービスとのインテグレーション、そして多言語対応について説明しました。使用を開始するには、以下の参考資料をご覧ください。
参考資料:
- インフラストラクチャ担当シニア カスタマー エンジニア Krishna Chytanya Ayyagari