1. 概要
Google Cloud Functions は、イベント ドリブン型のサーバーレス コンピューティング プラットフォームです。Cloud Functions を使用すると、リソースのプロビジョニングや、変化する要件に対応するためのスケーリングを気にすることなく、コードを記述できます。
JavaScript で記述された Cloud Functions は、Google Cloud Platform の Node.js 環境で実行されます。Cloud Functions の関数はあらゆる標準的な Node.js ランタイムで実行できるため、移植やローカルテストが容易になります。
チュートリアル
この Codelab では、指定された温度が許容範囲内か、高すぎるかを報告する Node.js 用の Cloud Functions の関数を作成します。ローカルマシンで Visual Studio Code を使用して、Cloud Functions の関数を作成、テスト、デバッグします。最後に、関数を Google Cloud Platform にデプロイします。
学習内容
- Node.js 用 Functions Framework
- HTTP Cloud Functions の関数をローカルで作成してテストする
- ローカルマシンから HTTP 関数をデバッグする
- ローカルマシンから HTTP 関数をデプロイする
2. 設定と要件
前提条件
- Cloud SDK
- Visual Studio Code
- Node.js 8.6.0 以降(Node.js をインストールするには nvm を使用します。バージョンを確認するには node –version を実行します)
- 最初の関数: Node.js ガイドを完了していること
費用
この Codelab では、デプロイされた Cloud Functions の関数を 1 回呼び出すだけで済みますが、課金の仕組みを理解するために、Cloud Functions API の料金情報も参照してください。
多くの Google API は無料でご利用いただけますが、Google Cloud Platform(プロダクトと API)の使用は有料です。Cloud Functions を使用するには、有効な請求先アカウントが必要です。一部の Google Cloud Platform(GCP)プロダクトには、超過した場合のみに料金が発生する Always Free 枠 が用意されています。この Codelab では、Cloud Functions の呼び出しごとに、その無料枠分に対してカウントされます。使用量の合計が上限(月ごと)を超えない限り、料金は発生しません。
3. Node.js 用 Functions Framework をインストールする
Node.js 用 Functions Framework は、Google Cloud Functions チームが提供する、移植可能な Node.js 関数を作成するためのオープンソースの FaaS(Function as a Service)フレームワークです。
Functions Framework を使用すると、次のようなさまざまな環境で実行される軽量関数を作成できます。
- Google Cloud Functions
- ローカル開発マシン
- Cloud Run および Cloud Run on GKE
- Knative ベースの環境
新しい node.js アプリを作成します。
npm init
デフォルトを受け入れる場合は、アプリのエントリ ポイントとして index.js を使用してください。
Node.js 用 Functions Framework をインストールします。
npm install @google-cloud/functions-framework
package.json を開きます。次の例に示すように、Functions Framework が依存関係としてリストされていることを確認します。
"dependencies": {
"@google-cloud/functions-framework": "^1.7.1"
}
Functions Framework が正常にインストールされました。これで、Cloud Functions の関数を作成する準備が整いました。
4. HTTP Cloud Functions の関数をローカルで作成してテストする
ローカル Cloud Functions の関数を作成する
このセクションでは、HTTP リクエストに応答する HTTP 関数を作成してテストします。
package.json ファイルと同じディレクトリに、index.js という名前の新しいファイルを作成します。
次のものを追加します。
exports.validateTemperature = async (req, res) => {
try {
if (req.body.temp < 100) {
res.status(200).send("Temperature OK");
} else {
res.status(200).send("Too hot");
}
} catch (error) {
//return an error
console.log("got error: ", error);
res.status(500).send(error);
}
};
これで、関数をテストする準備が整いました。
Visual Studio Code で関数をテストする
以降、この Codelab では、 統合ターミナルを Visual Studio Code 内で使用します。
Visual Studio Code でターミナル ウィンドウを開きます。
次のコマンドを実行します。
node node_modules/@google-cloud/functions-framework --target=validateTemperature
このコマンドは、サーバーが HTTP リクエストを受信したときに validateTemperature 関数を呼び出す準備ができているローカルサーバーを起動します。
ターミナル ウィンドウに次の出力が表示されます。
Serving function... Function: validateTemperature URL: http://localhost:8080/
ターミナル ウィンドウ ペインで New Terminal のプラスアイコンをクリックして、VS Code 内に 2 つ目のターミナル ウィンドウを作成します。これらの 2 つのターミナル ウィンドウを切り替えます。1 つ目は関数を提供するもので、2 つ目は curl を使用して関数を呼び出すものです。

プルダウンを使用してターミナル ウィンドウを切り替えることができます。ターミナル ウィンドウが現在関数を提供している場合、プルダウン リストでは node と表示されます。それ以外の場合は、zsh(または使用しているシェル)と表示されます。
2 つ目のターミナル ウィンドウで、次のコマンドを実行して、validateTemperature 関数を提供するローカル サーバーに 50 の温度ペイロードを送信します。
curl -X POST http://localhost:8080 -H "Content-Type:application/json" -d '{"temp":"50"}'
Cloud Functions の関数から次のようなレスポンスが返されます。
Temperature OK
2 つ目のターミナル ウィンドウで、次のように「高すぎる」温度ペイロードを送信して、関数を再度テストします。
curl -X POST http://localhost:8080 -H "Content-Type:application/json" -d '{"temp":"120"}'
Cloud Functions の関数から次のようなレスポンスが返されます。
Too hot
最後に、ペイロードがない状態で関数を呼び出してテストします。
curl -X POST http://localhost:8080
Cloud Functions の関数から次のようなレスポンスが返されます。
Too hot
温度が指定されていない場合、関数は「高すぎる」を返さないようにする必要があります。コードにバグが見つかりました。
関数を提供している最初のターミナル ウィンドウで Ctrl + C を押して、関数の実行を停止します。
5. ローカルマシンから HTTP 関数をデバッグする
Visual Studio Code でコマンド パレットを開きます。Mac を使用している場合は、Cmd + Shift + P を使用します。Windows を使用している場合は、Ctrl + Shift + P. を使用します。
コマンド パレットに「auto attach」と入力し、リストの先頭の項目を選択します。

この Codelab では、次の図に示すように [Only With Flag] を選択します。

次に、VS Code で関数を提供するために使用したターミナル ウィンドウを再読み込みします。そのためには、右端に表示される警告アイコンにカーソルを合わせます。
[Relaunch Terminal] をクリックします。

再読み込みされたターミナル ウィンドウから、次のコマンドを使用して Functions Framework を再実行し、関数を提供します。
node --inspect node_modules/.bin/functions-framework --target=validateTemperature
--inspect フラグは、デバッグ クライアントをリッスンするように Node.js に指示します。詳細については、デバッグに関する Node のドキュメントをご覧ください。
node_modules/@google-cloud/functions-framework ではなく、node_modules/.bin/functions-framework を使用していることに注意してください。インスペクト モードを使用するには、/node_modules/.bin に自動的にシンボリック リンクされた実行可能ファイルを使用する必要があります。
今回は、デバッガがアタッチされていることを示すオレンジ色のステータスバーが VS Code に表示されます。
行番号の左側の余白内をクリックして、3 行目にブレークポイントを設定します。

ブレークポイント アイコンが明るい赤色で点灯し、このコード行がデバッガからアクセス可能であることを示します。

2 つ目のターミナル ウィンドウで、次の curl コマンドを実行してブレークポイントに到達します。
curl -X POST http://localhost:8080
3 行目に黄色のハイライトが表示されます。このハイライトは、この行がデバッガによって評価される現在のステートメントであることを示します。

temp 変数にカーソルを合わせ、リクエストで温度ペイロードが提供されなかったため、その内容が undefined であることを確認します。

ステップオーバー アイコンをクリックして、次のステートメントを実行します。
現在のステートメントが if ステートメントの else 部分にジャンプします。

このデモでは、仕様により、すべてのリクエストで温度測定値を送信する必要があると想定できます。温度測定値が提供されないという万が一の場合、関数は例外をスローする必要があります。
[切断] ボタンをクリックして、デバッガを切断します。

最初のターミナル ウィンドウで、Ctrl + C を押して関数の提供を停止します。
次のように、温度が未定義の場合に例外をスローする if ステートメントを追加するように関数を更新します。
exports.validateTemperature = async (req, res) => {
try {
// add this if statement below line #2
if (!req.body.temp) {
throw "Temperature is undefined";
}
...
最初のターミナル ウィンドウで、デバッガをアタッチしないように–inspect フラグなしで 次のコマンドを実行して、Cloud Functions の関数の実行を再開します。
node node_modules/@google-cloud/functions-framework --target=validateTemperature
2 つ目のターミナル ウィンドウで次のコマンドを実行して、例外がスローされることを確認します。
curl -X POST http://localhost:8080
リクエストから次の出力が返されます。
Temperature is undefined
最初のターミナル ウィンドウには、関数によって記録されたエラーも表示されます。
Serving function... Function: validateTemperature URL: http://localhost:8080/ got error: Temperature is undefined
最初のターミナル ウィンドウで Ctrl + C を押すと、関数の実行を停止できます。
6. ローカルマシンから Google Cloud に HTTP 関数をデプロイする
ローカルマシンで Cloud Functions の関数を作成、テスト、デバッグしたので、Google Cloud にデプロイする準備ができました。
次のコマンドを実行して、ステップ 2 で作成したプロジェクトをローカルで使用していることを確認します。
gcloud config get-value project
ステップ 2 で指定したプロジェクトがアクティブな構成でない場合は、次のコマンドを実行します。
gcloud config set project <project-name-created-step-2>
任意のターミナル ウィンドウで、次のコマンドを実行します。
gcloud functions deploy validateTemperature --trigger-http --runtime nodejs12 --allow-unauthenticated
パラメータは次のように説明します。
deploy validateTemperature-validateTemperatureという名前の Cloud Functions の関数をvalidateTemperatureという名前のエントリ ポイントでデプロイするための gcloud サブコマンド--trigger-http- トリガー イベントのタイプ--runtime nodejs12- この関数のターゲット ランタイム--allow-unauthenticated- 関数の呼び出しに対する公開アクセスを許可します
Cloud Functions API を有効にするよう求められます。y と入力して API を有効にします。
API [cloudfunctions.googleapis.com] not enabled on project [1057316433766]. Would you like to enable and retry (this will take a few minutes)? (y/N)? y
デプロイが完了すると、出力に次の内容が表示されます。
Deploying function (may take a while - up to 2 minutes)...done. availableMemoryMb: 256 buildId: <your-build-id> entryPoint: validateTemperature httpsTrigger: url: https://<your-region-and-project>.cloudfunctions.net/validateTemperature ...
ターミナル ウィンドウで、curl を使用してこの公開エンドポイントを呼び出します。
curl -X POST https://<your-region-and-project>.cloudfunctions.net/validateTemperature -H "Content-Type:application/json" -d '{"temp":"50"}'
適切なレスポンスを確認して、Cloud Functions の関数が正常にデプロイされたことを確認します。
Temperature OK
7. クリーンアップ
誤って課金されないようにするには(たとえば、この Cloud Functions の関数が、無料枠の月間 Cloud Functions の呼び出し割り当てよりも多く呼び出された場合)、Cloud Functions の関数を削除するか、ステップ 2 で作成したプロジェクトを削除します。
Cloud Functions の関数を削除するには、https://console.cloud.google.com/functions/ にある Cloud Functions Cloud Console に移動します。ステップ 2 で作成したプロジェクトが現在選択されているプロジェクトであることを確認します。
ステップ 6 でデプロイした validateTemperature 関数を選択します。[削除] をクリックします。

プロジェクト全体を削除する場合は、https://console.cloud.google.com/cloud-resource-manager に移動し、ステップ 2 で作成したプロジェクトを選択して、[削除] を選択します。プロジェクトを削除する場合は、Cloud SDK でプロジェクトを変更する必要があります。gcloud projects list を実行すると、使用可能なすべてのプロジェクトのリストを表示できます。
8. 完了
以上で、この Codelab は完了です。Cloud Functions で Node.js ランタイムがサポートされる仕組みと、 Cloud Functions でのローカル デバッグの仕組みについて詳しくは、こちらをご覧ください。
学習した内容
- Node.js 用 Functions Framework
- HTTP Cloud Functions の関数をローカルで作成してテストする
- ローカルマシンから HTTP 関数をデバッグする
- ローカルマシンから HTTP 関数をデプロイする