高木のブログ

【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を見たらオプションがいくつかあったので、SOURCETARGETだけ追加で試す

$ 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!

何もオプションを指定せずシンプルに起動できる

参考

Cloud FunctionsのRubyがベータ公開されたので使ってみた - Qiita


Written by ytkg, Twitter, GitHub

Pixela