【Cloud Functions】Functions Framework for Rubyを試す(ローカル編)
2021/09/01
業務でCloud Functionsを触ることになったので予習をする
Ruby用にフレームワーク(Functions Framework for Ruby)が用意されているのでそれを使う
今回はREADME.mdに書いてあるQuickstartを試して、さらにテストコードも書いてみる
Quickstart
必要なファイルを作成
Gemfileとapp.rb
Gemfile
source "https://rubygems.org"
gem "functions_framework", "~> 1.0"
app.rb
require "functions_framework"
FunctionsFramework.http("hello") do |request|
"Hello, world!\n"
end
「Hello, world!」と返すhello関数
サーバー起動
$ bundle install
$ bundle exec functions-framework-ruby --target hello
I, [2021-08-19T02:55:33.358268 #65163] INFO -- : FunctionsFramework v1.0.0
I, [2021-08-19T02:55:33.358312 #65163] INFO -- : FunctionsFramework: Loading functions from "./app.rb"...
I, [2021-08-19T02:55:33.358474 #65163] INFO -- : FunctionsFramework: Looking for function name "hello"...
I, [2021-08-19T02:55:33.358490 #65163] INFO -- : FunctionsFramework: Starting server...
I, [2021-08-19T02:55:33.407831 #65163] INFO -- : FunctionsFramework: Serving function "hello" on port 8080...
8080番ポートでhello関数のサーバーが立ち上がった
リクエストを投げる
$ curl http://localhost:8080
Hello, world!
「Hello, world!」と返ってきた
テスト
テストはRSpecを使う
ちゃんとテスト用のモジュール(FunctionsFramework::Testing)が用意されている
RSpec追加
Gemfile
source "https://rubygems.org"
gem "functions_framework", "~> 1.0"
+gem "rspec", group: "test"
$ bundle install
$ bundle exec rspec --init
テストコード
- ステータスコードが200で返ってくること
- 文字列「Hello, world!\n」が返ってくること
をテストする
spec/app_spec.rb
require "rspec"
require "functions_framework/testing"
describe "hello function" do
include FunctionsFramework::Testing
let(:response) do
load_temporary "app.rb" do
request = make_get_request "http://example.com:8080/"
call_http("hello", request)
end
end
it 'return status code 200' do
expect(response.status).to eq 200
end
it 'return hello message' do
expect(response.body.join).to eq "Hello, world!\n"
end
end
テスト実行
$ bundle exec rspec
..
Finished in 0.02075 seconds (files took 0.10026 seconds to load)
2 examples, 0 failures
OK
オプション
helpを見たらオプションがいくつかあったので、SOURCE
とTARGET
だけ追加で試す
$ bundle exec functions-framework-ruby -h
Usage: functions-framework-ruby [options]
-t, --target TARGET Set the name of the function to execute (defaults to function)
-s, --source SOURCE Set the source file to load (defaults to ./app.rb)
--signature-type TYPE Asserts that the function has the given signature type. Supported values are 'http' and 'cloudevent'.
-p, --port PORT Set the port to listen to (defaults to 8080)
-b, --bind BIND Set the address to bind to (defaults to 0.0.0.0)
-e, --environment ENV Set the Rack environment
--min-threads NUM Set the minimum threead pool size
--max-threads NUM Set the maximum threead pool size
--[no-]detailed-errors Set whether to show error details
--verify Verify the app only, but do not run the server.
-v, --verbose Increase log verbosity
-q, --quiet Decrease log verbosity
--version Display the framework version
--help Display help
SOURCE
オプション
起動するファイル名を指定する(デフォルトはapp.rb)
ファイル名をhello.rbにしてみる
$ mv app.rb hello.rb
$ bundle exec functions-framework-ruby --target hello --source hello.rb
I, [2021-08-31T23:40:47.222034 #2693] INFO -- : FunctionsFramework v1.0.0
I, [2021-08-31T23:40:47.222080 #2693] INFO -- : FunctionsFramework: Loading functions from "hello.rb"...
I, [2021-08-31T23:40:47.222342 #2693] INFO -- : FunctionsFramework: Looking for function name "hello"...
I, [2021-08-31T23:40:47.222361 #2693] INFO -- : FunctionsFramework: Starting server...
I, [2021-08-31T23:40:47.344302 #2693] INFO -- : FunctionsFramework: Serving function "hello" on port 8080...
$ curl http://localhost:8080
Hello, world!
Cloud Functionをよくわかっていないけど、ファイル名を変更したい時ってどんな時なんだろ
TARGET
オプション
実行する関数名を指定する(デフォルトはfunction)
デフォルトを試したいので、httpメソッドの引数を無くす
app.rb
require "functions_framework"
FunctionsFramework.http do |request|
"Hello, world!\n"
end
$ bundle exec functions-framework-ruby
I, [2021-08-31T23:43:32.529982 #2770] INFO -- : FunctionsFramework v1.0.0
I, [2021-08-31T23:43:32.530042 #2770] INFO -- : FunctionsFramework: Loading functions from "./app.rb"...
I, [2021-08-31T23:43:32.530205 #2770] INFO -- : FunctionsFramework: Looking for function name "function"...
I, [2021-08-31T23:43:32.530225 #2770] INFO -- : FunctionsFramework: Starting server...
I, [2021-08-31T23:43:32.580118 #2770] INFO -- : FunctionsFramework: Serving function "function" on port 8080...
$ curl http://localhost:8080
Hello, world!
何もオプションを指定せずシンプルに起動できる