【GCP】Functions Frameworkを使って関数をローカル環境で実行

こんにちは!クラウドサービス部の山口です。

最近、業務でCloud Functionsをよく利用しているのですが、「簡単にデバッグしてコードを直したい、、!」と思うことがありました。

そんな時にFunctions Frameworkを利用してCloud Functionsの関数をローカル環境でテストする方法を活用したところ、大変便利だったので今回ご紹介します。

 

Cloud Functionsで感じたこと

Cloud Functions上で既存のファンクションのコードを修正する際は、以下のように「編集」ボタンよりコードやその他設定を編集することができます。

修正が完了し、左下「デプロイ」ボタンを押した直後に気づきました。「エントリポイントと関数名が違う、、、、」(画面上部の注意メッセージを見落とすという凡ミス。)

上図のように「エントリポイント名≠関数名」の状態でデプロイを行うと、下記エラーが発生します。

エラーが発生するだけならまだいいのですが、なんとコードは「最後に成功したデプロイのコード」に戻ってしまいます。修正後のコードは保存されません。。。

という流れで、時間をかけた修正が水の泡になってしまうという惨事が頻発していました。

ここで強く思いました。「もっと手軽にコード修正とテストがしたい、、、!」と。
というわけで、以降はローカル環境で「コーディング→関数をHTTPトリガーで呼び出す」までをテストできる方法 をご紹介します。

 

Functions Framework概要

今回は、Functions Frameworkというオープンソースライブラリを使用します。

(サイトやドキュメントによって「Function Frameworks、FunctionFramework、FunctionFrameworksと表記がバラバラですが、今回は「FunctionFramework」を正として進めます。)

Functions Frameworkは、Cloud Functionsがユーザ関数をラップする際に使用しているオープンソースライブラリです。

特長としては以下が挙げられます。

  • 迅速なテストのためのローカル開発用サーバーの起動
  • リクエストに応じた関数の呼び出し
  • CloudEvent仕様に準拠したイベントの自動アンマーシャル(バイト形式→データ構造 など)
  • サーバレスプラットフォーム間で移植可能

参考:Functions Framework  |  Google Cloud Functions に関するドキュメント

 

[実践]Functions Frameworkを使って関数をCloud Shell上で実行

ここからは実際にFunctions Frameworkを用いてローカル環境で関数を実行してみます。今回はCloud Shell上で実行します。

手順①:Cloud Shell上でコーディング

以下の簡単なPython文で実行してみます。

hello.py
import functions_framework

def hello(request):
    return “Hello world!”

 

手順②:関数をデプロイ

下記コマンドを実行して関数をデプロイします。

デプロイコマンド
functions-framework –source=(実行ファイル名) –target=(実行関数名) –debug

⇒ これでhello関数が実行可能な状態(=デプロイ済)になりました。

 

手順③:curlコマンドで実行

以下のコマンドを実行し、実際に関数を呼び出します。

実行コマンド
curl http://localhost:8080

⇒ 無事、関数を呼び出すことができ、「Hello World!」が表示されました。

 

以上、①~③の手順でGoogle Cloud Platform内で手軽に関数のコード修正、テストが可能です。(超便利!!!)

心血注いで書いたコードが蒸発してしまうというエンジニアにとっての大惨事も回避することができます。

 

【補足】

下記を参照すると、デプロイ時のコマンドの「–source (実行ファイル名)」部分が省略されています。

Function Frameworks を使用した関数の実行  |  Google Cloud Functions に関するドキュメント

デプロイ時のfunction_frameworkコマンドで「–source」部分を省略すると、デフォルトで「main.py」が参照される仕様になっています。

実際に試してみましょう。

実行画面 実行結果

⇒「–source」を指定していませんが、「main.py」内のhello関数が呼び出されました。

 

実行時に「どの関数を呼び出しているか」を把握するためにも、functions-frameworkコマンド実行時に”–source (実行ファイル名)”を毎回指定することを個人的にはオススメします。指定し忘れてmain.pyが意図せず実行されていた。といった混乱を防ぐこともできます。

(「↑」キーで履歴から実行するならそれほど手間も増えない。)

 

[実践]Cloud Functionsで試してみる

Functions Frameworkで試したコードをCloud Functionsで実行してみて正常に動くかテストします。(動くと思うけど念のため。)

ファンクションの作成

今回はCloud Functionsの第2世代を使用します。

Cloud Shellで作成したコードをコピペします

ソースコード内でImportしているライブラリ等によって、「requirements.txt」の編集も必要です。(今回は「functions-framework」のみ)

デプロイします

⇒ 無事デプロイできました。画面上部のURLは実行時に使用するのでコピーしておきます。

 

叩いてみる

Cloud Shellに戻り、下記コマンドを実行します。(赤字部分は作成したファンクションのURLです。)

curl -H “Authorization: bearer $(gcloud auth print-identity-token \https://asia-northeast1-xxx-yyy.cloudfunctions.net/yamaguchi-test-main

⇒ 無事ファンクションの実行ができました。

 

終わりに

ここ最近、Cloud Functionsを使用した開発が増えてきたのですが、

コーディング、テスト、デプロイの一連の流れをGoogle Cloud環境内で行うことができるため、環境構築の手間も不要で大変便利だと感じました。

時間をかけたコーディングが蒸発するという悲劇とはこれでおさらばできそうです。。。

今後も便利なツールに出会ったらどんどん発信していきます!

タイトルとURLをコピーしました