OpenWhiskとは
OpenWhiskは、マイクロサービスを実装するための手段の一つである Function as a Service
です。一般的にServerlessという表現がさえれることも多いです。実際にOpenWhiskでは、処理(Action)=Functionを動かすためのプラットフォームでありユーザが server
を意識することはありません。
OpenWhiskは、OSSで提供されており自身のサーバ環境にインストールして動作させることが可能です。今回のハンズ・オンではOpenWhiskのサービスを提供している IBM Bluemix PaaSを利用して行います。
以下に私の書いたドキュメントがありますので参考にして下さい。
事前準備
- BM Bluemix アカウント取得
- CF(Cloud Foundry) CLI Install
- Bluemix CLI Install
- CLIを使う際には「pip」のインストールが必要。(Python 2.7)
- pipのインストール
今回のハンズ・オン自体ではcliは利用しません。
今回の作業内容
ハンズ・オンでは代表的なOpenWhiskの動作を学ぶために以下のようなアプリケーションを作成します。
- JsonデータをCloudantに投入する(この際に
text: "message"
を入れておく) - New Documentが作成されたCloudantはOpenWhiskと連携し処理を起動する(Trigger/Feed)
- OpenWhiskの処理(Action)が呼出され作成された文書を読み出します
- 最終的に読み出した文章の
text
の内容を Slackへ通知します。
従来であればこのようなアプリケーションを構築する際には、Jsonデータを投入する処理側でSlackへ通知する機能を組み込むことや定期的にCloudantの状態を監視する必要がありましたがOpenWhiskの仕組みを利用することで処理を実装することが可能となります。
はじめに
準備
Cloudantの準備
Dashboardから、「カタログ」を選択します。
「Cloudant NoSQL DB」を選択します。以下の情報を設定して「作成」をクリックしてインスタンスを開始します。
- サービス名: handson-cloudant
- 資格情報名: Credentials-1 (ディフォルト)
- プラン: Lite (無料)
正常に開始されると以下の画面が表示されます。「LAUNCH」をクリックしてコンソールを起動します。
コンソールは以下のようになっています。
ひだりのメニューから「Database」を選択します。
今回利用するための新規のデータベースを作成する為に「Create Database」をクリックしデータベース名handson-openwhisk-db
を入力してデータベースを作成します。
作成が正常にされると以下のようになります。
この画面は後でデータの投入を行う際に利用するのでブラウザをそのままにしておいて下さい。仮にブラウザをクローズしてしまった場合にはBluemixの管理コンソールから再度開くことが可能です。
サービス→ダッシュボードを選択しサービスを探すと先ほど作成したインスタンスを見つけることが出来ます。
これでCloudant NoSQL DB側の準備はおわりです。
Slackの準備
Slack側では外部からメッセージを投稿するために「Incorrect Webhock」という機能を利用します。
上記のTEAMNAMEは各自の自身のアドレスを利用して下さい。
Manageのメニューから「Custom Integration」を選択します。
次に、「Incoming WebHook」を選択します。
新しい接続をつくるため「Add Configuration」を選択します。
接続をおこないたいチャンネルを選択して「Add Incomming WebHooks integaration」をクリックします。
上記で表示される「WebHook URL」をコピーして保管しておきます。
これでSlack側の準備は終わりです。
Cloudantの新規文書のIDを取得するActionの作成
OpenWhiskへのログイン
https://console.ng.bluemix.net/openwhisk/ にアクセスをします。
[Bluemixにログイン]をクリックしてログインを行います。
開発を行うため、[開発]をクリックします。
こちらの画面がOpenWhiskのGUI画面となります。今回のハンズ・オンではおもにこのGUIを利用して行っていきます。通常であればCLIコマンドにて同じことを行うことが出来ます。
Cloudantの新規ドキュメントの作成を継起にActionを実行する
まずはCloudantに新規ドキュメントが作成されたことを検知してActionを実行する部分の流れを作成していきます。ここでは実行するActionを handson-read-document
として作成します。
まずは新規のActionをConsoleから作成します。
以下の内容を入力し、「アクションの作成」を実行します。
直接コードを編集できる画面が表示されます。
以下のコードを入力します。
function main(params) {
var msg = {};
msg.docid = params.id;
return msg;
}
入力後に、「ライブにする」を実行します。
- この「ライブ」するは「有効化」にするということのようです。
- エディタは保存がなく常に編集すると保管されてしまうため誤った操作を行わないように気をつける必要があります。
- 実際にコードを書く際には wsk コマンドを利用した登録をお勧めします。
動作の確認
実行を試験してみます。[▼このアクションを実行]をクリックします。
JSON入力のに以下の内容を記入します。
{
"id" : "0001"
}
次に「この値を実行」して試験をしてみます。
上記のように実行した結果が表示されます。コード上でmsgをreturnしているのでその内容がJSON形式で表示されていることがわかります。
Cloudantの文書を読み込む処理を追加する
先ほどの作成したActionにつづいて、Cloudantの文書を読み込む処理を追加します。この処理を行うためにはコードを書く必要はなく既に用意されているPackageを利用します。OpenWhiskには多数のPackageが用意されておりコレを利用することでコードの再利用が可能です。
先ほどのAction handson-read-document
を開きます。
このアクションの後続処理を繋げるために「シーケンスにリンク」をクリックします。
すると用意されているPackageが表示されます。
今回はこの中の「Cloudant」を選択します。
最初に利用するデータベースを構成します。この既存のパッケージに対して設定をいれて新しく定義することをBINDすると言います。(Cliから利用するとこのあたりの動きはもっと明確にわかります)
新規のパッケージバインディングの設定画面になるので以下の情報を入れ保管します。
- name: handson-cloudant-bind
- service instance : handson-cloudant
- dbname : handson-openwhisk-db
構成の保管を押すと定義(BIND)された事を示すアイコンが表示されます。
次に今回の処理(Action)である、「read document」を選択します。この状態で「シーケンスに追加」をクリックします。
追加すると以下のような画面が表示されます。
- シーケンス名:handson-read-document-cloudant
シーケンス名に名前を付けて「これは適切なようです」というボタンをクリックして保管します。
動作の確認
Cloudant側に文書を作成して実際に内容を読み込んで見たいと思います。準備で用意したCloudantのコンソールから新規の文書を作成します。以下のメニューを表示し「New Doc」を選択します。
文書を編集して「Create Document」を選択します。以下の_id
の値は変えずに、text
を追加して下さい。
{
"_id": "ef8487e1d5bc5992cc0a6b160487f78c",
"text": "This is test message"
}
次にOpenWhiskのシーケンス handson-read-document-cloudant の画面を開きます。
「このシーケンスを実行」をクリックします。その際のJSON入力を以下のようにします。
{
"id": "ef8487e1d5bc5992cc0a6b160487f78c"
}
そして「この値で実行」をクリックしてシーケンスを動かします。
するとCloudantに入力されていたtext
の値が取得できていることが確認できました。これで文書IDがわかれば中身を取得するという処理(Action)を作ることが出来ました。
Actionを更に拡張してSlackに投稿する
先ほど作成したシーケンスを表示します。
この処理にさらに処理(Action)を繋げるために「拡張」をクリックします。
今回は「SLACK」を選択します。
Cluodantの時と同様に設定を定義するために「New Binding」を行います。
name : handson-slack-bind (任意)
username : openwhisk (任意)
channel : 準備で設定したチャンネル
url : 準備で取得した値
今回設定できる処理は「post」しかないので「post」を選択して「シーケンスに追加」を実施します。
保管して完了をクリックします。
動作の確認
先ほどの確認と同様で「このシーケンスを実行」をクリックします。2度めなので今回はJSON入力に値が入っていることが確認出来ます。
「この値で実行」をクリックして実行してみます。するとSlack側に新しいメッセージが通知されている事が確認できました。
今回はCloudantの文書の内容をそのまま通知していますがもちろん更に処理を加えて例えば text を全て大文字に変更して通知するなどの処理を入れることも可能です。
こういったかたちでデータをJSON形式で受け渡ししながら目的の処理を行うように作る事が出来ます。
Cloudantに文章が作成されたら自動で動くように設定する
また先ほどのシーケンスを表示します。今度は自動処理を追加するので「自動化」をクリックします。
自動処理をするためのActionを特別に「Feed」と呼びます。また「Feed」には実際にその処理が動くための「Trigger」があります。
今回はCloudantを選択します。
Feedには、パッケージのBINDと同様にTriggerを定義する必要があります。ここでは「New Trigger」をクリックして定義を行います。
以下の様に設定を行いTriggerを追加します。
- name: handson-trigger
- service instance: handson-cloudant
- dbname: handson-openwhisk-db
「次へ」をクリックして確認を行います。
「これは適切内容です」をクリックするとこのルール名を入力されるように指示されますのでそのままの値で「ルールの保存」をクリックします。
完了をクリックします。
動作の確認
これで全ての部品を作る事ができました。Cloudantに文書が追加されるとSlackに通知が行われるはずです。
{
"_id": "23b807a924e6c62d3f0a3ff5acfec555",
"text": "finish"
}
この文書を作成します。すると slack上にメッセージが到達していることが確認できます。
この動きが実際にどのようになっているかはモニター画面からも確認することが出来ます。
上部のメニューから「モニター」をクリックします。
このような画面でActionの実行結果を参照することが出来ます。Activity Logは、各Action単位で出力されます。内容としてActionのOutputのJSON結果とlogs:に処理自体のログが表示されます。
課題
課題(1)
- 今回の処理を全てwskコマンドで実装してみて下さい。wskコマンドとGUIでは若干表現に差があるため最初わからない箇所があるかと思いますがGettingStart等を参考にして見て下さい。
課題(2)
OpenWhiskは、Function as a Serviceです。単体で完結するだけでなく外部から呼び出すことで利用の範囲が広がります。
- OpenWhiskで作成したActionを、Node-REDから呼び出してみましょう
- API Connect経由で、OpenWhiskのAPIを保護/公開するにはどのようにすればよいでしょうか
- OpenWhisで作成したActionを他のユーザと「共有」してみましょう