1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Enterprise電卓を作るAdvent Calendar 2019

Day 13

Fn Projectを使ってRubyで書いたfunctionを動かしてみる

Last updated at Posted at 2020-02-03

概要

このエントリでは、OSSのFaaSサーバである「Fn Project」を使い、Rubyの関数を動かすパターンを扱います。

下図のようなRubyによる引き算の関数をFnのサーバにデプロイして動かします。

vsc_subtract.png

想定読者

準備

Fn Projectを動かすまでのところは、別エントリ「OCIのMicro InstanceでCentOSにFn Projectのサーバをインストールしてみる」を参照ください。

このエントリでは、筆者はOCIのMicro Instanceの上で作業しています。

Rubyでfunctionを動かす

作業の基本的な流れは、Introduction to Fn with Rubyに書いてあるものに従っています。

Fn上のアプリ

別のエントリ「Fn Projectを使ってJavaScriptで書いたfunctionをNodeで動かしてみる」で、「fn create app」で、fn上に「calc-fn-app」アプリを作ってあるものにFunctionを追加する形をとります。

登録

/subractという位置にRubyで関数を一つ作るため、「fn init」を実行します。

$ fn init --runtime ruby --trigger http subtract
Creating function at: ./subtract
Function boilerplate generated.
func.yaml created.

下記のような3つのファイルができています。

$ ls
func.rb  func.yaml  Gemfile

コードを変更

下記のような、入力値のleftからrightを引いて返すような関数に書き換えます。

require 'fdk'
require 'bigdecimal'

def subtract(context:, input:)
  left = input.respond_to?(:fetch) ? input.fetch('left') : "0"
  right = input.respond_to?(:fetch) ? input.fetch('right') : "0"
  l = BigDecimal(left)
  r = BigDecimal(right)
  { result: (l - r).to_s }
end

FDK.handle(target: :subtract)

アプリデプロイします。「-w」で作業ディレクトリを指定して、登録しています。

fn --verbose deploy --app calc-fn-app --local -w /home/opc/calc-fn-app/subtract

初回実行時には、以下のような流れとなるようです。

$ fn --verbose deploy --app calc-fn-app --local -w /home/opc/calc-fn-app/subtract
Deploying subtract to app: calc-fn-app
Bumped to version 0.0.2
Building image fndemouser/subtract:0.0.2
FN_REGISTRY:  fndemouser
Current Context:  default
Sending build context to Docker daemon   5.12kB
Step 1/9 : FROM fnproject/ruby:dev as build-stage
 ---> 37ecabff3a24
Step 2/9 : WORKDIR /function
 ---> Using cache
 ---> c7a9fa394654
Step 3/9 : ADD Gemfile* /function/
 ---> Using cache
 ---> 0eb3e26ba0c2
Step 4/9 : RUN bundle install
 ---> Using cache
 ---> 1742c3ab6077
Step 5/9 : FROM fnproject/ruby
 ---> f5452b336752
Step 6/9 : WORKDIR /function
 ---> Using cache
 ---> 1a847b1ba6b0
Step 7/9 : COPY --from=build-stage /usr/lib/ruby/gems/ /usr/lib/ruby/gems/
 ---> Using cache
 ---> 024231201746
Step 8/9 : ADD . /function/
 ---> 0891f94df165
Step 9/9 : ENTRYPOINT ["ruby", "func.rb"]
 ---> Running in ed2ffef17490
Removing intermediate container ed2ffef17490
 ---> f886ccf5818c
Successfully built f886ccf5818c
Successfully tagged fndemouser/subtract:0.0.2

Updating function subtract using image fndemouser/subtract:0.0.2...
Successfully created function: subtract with fndemouser/subtract:0.0.2
Successfully created trigger: subtract
Trigger Endpoint: http://127.0.0.1:18080/t/calc-fn-app/subtract

fnのコマンドで確認します。(別エントリでplusを作ってあります)

$ fn list fn calc-fn-app
NAME            IMAGE                           ID
plus            fndemouser/plus:0.0.2           01E0393FDCNG8G00GZJ000000E
subtract        fndemouser/subtract:0.0.2       01E05KAKGENG8G00GZJ0000013

Dockerのコマンドで確認すると、対応するコンテナのイメージができていることがわかります。

$ docker images | grep subtract
fndemouser/subtract   0.0.2               f886ccf5818c        4 minutes ago       42.9MB

実行

登録時の末尾にあったURLにcurlでアクセスしてみます。

$ curl -d '{"left":"1", "right":"2"}' http://127.0.0.1:18080/t/calc-fn-app/subtract
{"result":"-0.1e1"}

1-2の結果である-1が返ってきています。

これを指数形式で表示したくなかったときの修正をしてみます。

コードの下記の部分を修正します。

  { result: (l - r).to_s("F") }

修正したFunctionをデプロイしなおします。(参照:instance method BigDecimal#to_s)

$ fn --verbose deploy --app calc-fn-app --local -w /home/opc/calc-fn-app/subtract
(中略)
Successfully tagged fndemouser/subtract:0.0.3

Updating function subtract using image fndemouser/subtract:0.0.3...

前述と同じURLに、curlでアクセスしてみます。

$ curl -d '{"left":"1", "right":"2"}' http://127.0.0.1:18080/t/calc-fn-app/subtract
{"result":"-1.0"}

意図した形のレスポンスが返ってきました。

おわりに

このエントリでは、Fn projectを使ってRubyで書いたfunctionを動かしてみることを扱いました。

このエントリで使用したコードは、https://github.com/hrkt/calc-fn-app/releases/tag/0.0.2のタグに格納してあります。

補足:外部ライブラリ

このエントリでは、外部ライブラリを使いませんでしたが、Gemfile中に記載することで、Ruby gemsを利用できます。

補足:このエントリを書くにあたり

このエントリを書くにあたり、OCIのマイクロインスタンス上に下記の状況を作り、ノートPCからクラウド側にsshでリモートでつないで作業しました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?