Serverless
- OpenWhisk+Scalaで作るServerless Architectureとっかかり (24 Jan 2017 | Tags:
OpenWhisk+Scalaで作るServerless Architectureとっかかり OpenWhisk+Scalaで作るServerless Architectureとっかかり
最近マイクロサービスやサーバーレスアーキテクチャが気になるので、手習いにOpenWhiskを使って、以前作ったモノリシックなサービスをマイクロサービスっぽく分割してみようと思う。
とりあえずOpenWhiskでHelloWorld。
準備
今回はBluemix上のOpenWhiskを対象に進める。
- Bluemixアカウント1
- Scala 2.11.6
- sbt 0.13.13
OpenWhisk CLIインストール
ggって出てくるブログだとインストールにはpipが必要と記載してあるものもあるけど、今はpipは不要になったようです。
Download OpenWhisk CLIから、実行可能なwskファイルを落とします。
あとは↑の記載の通りに進めればOK
echoアクションを実行して、
wsk action invoke /whisk.system/utils/echo -p message hello --blocking --result
↓のように帰ってくればインストールは完了
{ "message": "hello" }
アプリケーションの作成
GoogleのGsonを使うので、build.sbtに依存関係を追加。
基本的に、JsonObjectを受け取って、JsonObjectを返すエントリーポイントを作るだけです。
こんな感じ。
package com.github.modalsoul.sampleaction import com.google.gson.JsonObject object SampleAction { def main(args:JsonObject):JsonObject = { val obj = new JsonObject() val name = if(args.has("name")) { args.getAsJsonPrimitive("name").getAsString() } else "World" obj.addProperty("greeting", s"Hello ${name}!") obj } }
アプリケーションのビルド
デプロイするjarファイルを作成します。
sbt package
だと依存するライブラリ(今回だとgson)を取り込んでくれないので、sbt-assemblyを使う。addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.3")
sbt assembly
を実行すると、./target/scala-2.11/
配下にjarが生成されます。OpenWhiskアクションの登録
[ACTION_NAME] , [APPLICATION] , [MAIN_CLASS_FULLNAME] は適宜読み替え。
> wsk action update [ACTION_NAME] target/scala-2.11/[APPLICATION].jar --main [MAIN_CLASS_FULLNAME] ok: created action [ACTION_NAME]
動作確認
wsk action invoke --blocking --result [ACTION_NAME]
↓のように帰ってくれば成功です。
{ "greeting": "Hello World!" }
↓のようにするとパラメータを渡すことができます。
wsk action invoke --blocking --result [ACTION_NAME] --param name HOGE
{ "greeting": "Hello HOGE!" }
おわり
作ったサンプルのプロジェクトはこちら。
これでなんとなくOpenWhisk使えるようにはなったので、モノリシックをマイクロにするぞ。
-
現在、OpenWhiskは米国南部リージョンでしか使えないので注意。 ↩
LinkLatest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
Jekyll::Drops::SiteDrop