【ローカルで動作確認】Functions Framework を用いた Cloud Functions 開発

公開
注意最終更新から 2 年以上経過しています。最新の情報もあわせてご確認ください。

Functions Framework を用いた Cloud Functions 開発

Google Cloud Functions は、サーバーレスコンピューティングの強力なソリューションです。Functions Framework を使用することで、開発者はローカル環境で Cloud Functions を効率的に開発、テスト、デバッグすることができます。本記事では、Functions Framework を用いた Cloud Functions 開発の基本的な流れと、実際の実装方法について解説します。

Functions Framework の主な利点は以下の通りです:

  1. ローカル環境での迅速な開発とテスト
  2. 本番環境との一貫性の確保
  3. 複数の言語とランタイムのサポート
  4. オープンソースで柔軟なカスタマイズが可能

これから、Functions Framework のセットアップから、HTTP トリガーとイベントトリガーの関数の実装、そしてローカルでの動作確認までの手順を詳しく見ていきます。この記事を通じて、Cloud Functions の開発プロセスをスムーズに進められるようになることを目指します。

開発の流れ

Functions Framework を用いた CloudFunctions 開発の流れは以下になります。

  1. 関数の実装
  2. ローカルサーバー起動(TypeScript で実装する場合は起動前にビルド)
  3. 関数の実行(動作確認)

Functions Framework の導入

Functions Framework をインストールします。

pnpm add @google-cloud/functions-framework

TypeScript で実装する前提ですが、package.json は以下の状態になっています。

package.json

{
  "dependencies": {
    "@google-cloud/functions-framework": "^3.4.1"
  },
  "devDependencies": {
    "@types/node": "^20.14.10",
    "typescript": "^5.5.3"
  }
}

参考: Functions Framework を使用して関数を実行する - Google Cloud

ビルドとローカルサーバ起動の設定

CloudFunctions 関数をローカルで実行できるようにするために、ビルドとローカルサーバ起動の設定を行っておきます。

tsconfig.json

{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es2022",
    "strict": true,
    "outDir": "./dist"
  },
  "include": [
    "src"
  ]
}

package.json の script フィールドに以下を記述します。

package.json

{
  "scripts": {
    "build": "tsc",
    "start": "functions-framework --target=helloWorld --source=dist",
    "start:dev": "npm run build && npm run start"
  },
  "dependencies": {
    "@google-cloud/functions-framework": "^3.4.1"
  },
  "devDependencies": {
    "@types/node": "^20.14.10",
    "typescript": "^5.5.3"
  }
}

pnpm run start で、functions-framework コマンドを用いてローカルサーバを起動しています。

TypeScript で実装したソースコードを js ファイルにビルドし、それを実行する流れになるため、pnpm run start:dev でビルドとローカルサーバの起動を一度に行っています。

CloudFunctions 関数の実装と動作確認

では CloudFunctions 関数を実装し、ローカルで動作確認を行ってみましょう。

HTTP トリガー

まずは HTTP トリガーで実装してみます。

src/index.ts

import * as functions from '@google-cloud/functions-framework'

functions.http('helloWorld', (req: functions.Request, res: functions.Response) => {
    res.send('Hello, World');
})

実装したら動作確認です。以下コマンドでローカルサーバを起動します。

pnpm run start:dev

# % pnpm run start:dev
# 
# Serving function...
# Function: helloWorld
# Signature type: http
# URL: http://localhost:8080/

HTTP トリガーでローカルサーバが起動しました。続いて、別のターミナルからエンドポイントへリクエストを送信してみます。

% curl localhost:8080
Hello, World

CloudFunctions 関数をローカルの開発環境で実行できました。

参考: HTTP 関数を作成する - Google Cloud

イベントトリガー

次に、イベントトリガーでも実装してみます。

src/index.ts

import * as functions from '@google-cloud/functions-framework'

functions.cloudEvent('helloWorld', cloudEvent => {
    console.log('Hello, World')
})

再度、ローカルサーバを起動します。

pnpm run start:dev

# % pnpm run start:dev
# 
# Serving function...
# Function: helloWorld
# Signature type: cloudevent
# URL: http://localhost:8080/

イベントトリガーでローカルサーバが起動したことがわかります。続いて、別のターミナルからエンドポイントへイベントリクエストを送信してみます。

curl localhost:8080 \
  -X POST \
  -H "Content-Type: application/json" \
  -H "ce-id: 123451234512345" \
  -H "ce-specversion: 1.0" \
  -H "ce-time: 2024-07-15T10:11:10.789Z" \
  -H "ce-type: google.cloud.storage.object.v1.finalized" \
  -H "ce-source: //storage.googleapis.com/projects/_/buckets/my-bucket" \
  -H "ce-subject: objects/my-file.txt" \
  -d '{
    "bucket": "my-bucket",
    "contentType": "text/plain",
    "kind": "storage#object",
    "md5Hash": "...",
    "metageneration": "1",
    "name": "my-file.txt",
    "size": "352",
    "storageClass": "MULTI_REGIONAL",
    "timeCreated": "2024-07-15T10:11:10.789Z",
    "timeStorageClassUpdated": "2024-07-15T10:11:10.789Z",
    "updated": "2024-07-15T10:11:10.789Z"
  }'

ローカルサーバーを起動したターミナル側に Hello, World が出力され、関数が実行されたことがわかります。

参考: イベント ドリブン関数を作成する - Google Cloud

まとめ

本記事では、Functions Framework を用いた Cloud Functions 開発の基本的な流れと実装方法について解説しました。主なポイントは以下の通りです:

  1. Functions Framework の導入とセットアップ
  2. TypeScript を使用した開発環境の構築
  3. HTTP トリガーとイベントトリガーの関数実装
  4. ローカル環境での動作確認方法

Functions Framework を活用することで、開発者は以下のメリットを享受できます:

  • ローカル環境での迅速な開発サイクルの実現
  • 本番環境との一貫性を保ちながらのテストと検証
  • デプロイ前の問題の早期発見と修正

Functions Framework は、効率的で信頼性の高い Cloud Functions 開発をサポートする強力なツールです。ローカルでデバッグできれば開発スピードも格段に上がります。ぜひ試してみてください。

Functions Framework - Google Cloud

Ritolabo