Cloud Run 関数でのFunctions Framework導入まとめ(TypeScript)

はじめに

こんにちは。GMO NIKKO の KONCE です。
今回は Cloud Run 関数について Functions Framework と TypeScript を導入する機会があったので方法と Cloud Run 関数のそれぞれのトリガーについてまとめていければと思います。
弊社の過去のデータフロー周りの記事はこちら

Dataflow(batch)でZONE_RESOURCE_POOL_EXHAUSTEDが発生した話
こんにちは。GMO NIKKOのT.Cです。今回は、Dataflowで、特定のゾーンにあるリソースが一時的な不足(= ZONE_RESOURCE_POOL_EXHAUSTED)により、間欠的にJobが失敗した内容について話したいと思います。※ 本ブログで発信される情報は、個人の見解でドキュメントで直接言及されてない内容も含まれているため、実際とは異なる可能性もあるので、参考までにしてください1日何回も、Cloud FunctionでDataflow(batch・dataflow shuffle)を動かしてGCSにあるログを処理していますが、ゾーンのリソース不足により、Jobが失敗する現象が数日にわた...

Cloud Run 関数について

Cloud Run 関数は、 リクエスト、Cloud Storage イベント、Pub/Sub メッセージなど、様々なトリガーに対応したコードを実行できます。

  • イベントドリブン: 特定のイベントが発生すると自動的に実行されます。
  • スケーラブル: 必要に応じて自動的にスケールアップまたはスケールダウンします。
  • サーバーレス: サーバー管理は Google Cloud が行います。

またCloud Run 関数は、Cloud FunctionsがCloud Runと統合されています。今後UIやコマンドも統合されていきます。

Google Cloud Functions is now Cloud Run functions | Google Cloud Blog
With Cloud Run functions, you can write and deploy functions directly with Cloud Run, giving you complete control over the underlying service configuration.

Functions Frameworkについて

Functions Framework は、Google Cloud が提供する、サーバーレス関数を開発するためのオープンソースのフレームワークで、関数をローカルでテストし、エミュレートし、デプロイすることが容易になります。

  • 軽量: 依存関係が少ないため、小さいコンテナサイズを実現できます。
  • 構造化: 標準的なインターフェースを提供することで、コードの可読性と保守性を向上させます。
  • クロスプラットフォーム: Node.js、Python、Go などの様々な言語に対応しています。

コードサンプル

サンプルで HTTPリクエスト、Pub/Sub、GCSのファイル作成のイベントの Cloud Run 関数を用意しました。
Functions Framework は特に指定がなければローカルで8080でHTTPリクエストしてテストすることができます。
またGoogleのCloudEventの構造は @google/events を使用すると使いやすいかと思います。

GitHub - googleapis/google-cloudevents-nodejs: THIS REPOSITORY AND PACKAGE WI...
THIS REPOSITORY AND PACKAGE WILL BE DEPRECATED IN JULY 2024. CloudEvent Types for Node.js - googleapis/google-cloudevents-nodejs

ディレクトリ

package.json

tsconfig.json

index.ts


トリガー別のCloud Run関数

HTTP関数

HTTPリクエストで関数を呼び出すことができ、多様な実装が可能かと思います。
今回サンプルで用意したのは単にtextを表示させるだけですが、Functions Frameworkのhttp関数を用いて簡単に実装することができます。

ローカルでのテスト(HTTP関数)

デプロイ(HTTP関数)

gcloud functions deploy で --trigger-http を指定してデプロイします。regionやruntimeはプロジェクトの実態に合わせる必要があると思います。
デプロイ後は Cloud Run 関数 のURLからテストできます。


Cloud Storage イベント

プロジェクトの実態に合わせてオブジェクトの

  • ファイナライズ(新規作成、上書きによる世代の更新)
  • 削除
  • アーカイブ(バージョンが現行でなくなった時)
  • メタデータの更新

をトリガーとして、オブジェクトデータを渡して実行できます。(Cloud Run第二世代はEventarc 経由でのイベント)
こちらも様々な用途ありますが、ログファイルを Cloud Logging → ログルーター → ストレージに集めて実行できたりします。

ローカルでのテスト(Cloud Storage イベント)

CloudEvents形式の場合はヘッダーを合わせる必要があります。以下はマスクしたcurlのサンプルです。

デプロイ(Cloud Storage イベント)

--trigger-resource でストレージを指定しています。以下でデプロイするとEventarcのトリガーが自動で作成され、オブジェクトの作成更新で実行できます。適当なローカルのファイルをgsutil cpして確認するのが手っ取り早いかと思います。


Pub/Sub

Pub/Subメッセージに応答して関数を実行することができます。
プロジェクトでのPub/Sub利用状況に合わせた実装ももちろんできますし、Monitoringアラートの通知チャンネルや、ログルーターの送信先も選択できるので既存プロジェクトからの拡張も容易です。

ローカルでのテスト(Pub/Sub)

ストレージ同様ヘッダーを合わせてリクエストします。またmessageのdataは通知元によってはJSONだったりするのでbase64でエンコードされています。

デプロイ(Pub/Sub)

Pub/Subトピックスを事前に作成する必要があります。
こちらもEventarcのトリガーが自動で作成されます。

デプロイ後は任意のメッセージpublishして確認できます。

gcloud pubsub topics publish testtopic --message="hello"


終わりに

Cloud Run 関数でのFunctions Frameworkについてまとめました。
Curlサンプルなどは意外と用意するのめんどくさいのでどこかで役立てばと思います。
様々なCloudEventに対してCloud Run 関数を容易に実行できることで今後も業務改善に繋げていきたいです。