Bluemix connect and compose サービス(β)を試してみた

IBM Bluemixに "Connect and Compose" サービスが 2015年10月下旬にリリースされています。このサービスは、いわゆるハイブリッドクラウドやハイブリッドITを実現するためのサービスですが、従来あった Cloud Integration(クラウド統合）サービスからのバージョンアップと思ってよいでしょう。もちろん、従来のも使えます。この記事では、ハイブリッドクラウド、ハイブリッドITのニーズの背景と "Connect and Compose" の基本機能、それからサンプルをご紹介したいと思っています。

## ハイブリッドクラウド、ハイブリッドITの背景とニーズ

モバイル端末が増え、アマゾン、楽天などでのオンラインショッピングへの抵抗がなくなった結果として、新しいユーザー体験への対応が企業にとって必要になりつつあります。それは、**個々のユーザーと企業をつなぐこと** です。よく、「モバイル対応しないと～」という言葉を聴きますが、それは「人と企業を結ぶこと」と言い換えることができます。

多くの日本の企業ではデータセンターを自前で用意し、多大な投資を行っていると聞きます。しかし、自前のデータセンター上に構築したシステムに対して、モバイル対応のために新しい投資をするということがなかなかできません。そこで、従来のシステムはそのままで、新しいシステムはクラウドに投資するというのが一般的な傾向のようですね([参考文献1][link1])。


ここで問題になるのが、既に存在するシステムとどのように連携させるか？です。これがハイブリッドクラウド、またはハイブリッドITのニーズにつながります。少し用語の定義を先延ばししていましたが、図にあるように従来型のシステムをクラウドと連携させる方式をここでは Hybrid IT と呼ぶことにします。

![hybrid-cloud-hybrid-it-new.png](https://qiita-image-store.s3.amazonaws.com/0/74673/3f12a0a5-4868-a1e9-3863-71ad7eed9d20.png "Hybrid Cloud and IT")

直感的には、日本の場合従来型のシステムとプライベートもしくはパブリッククラウドと連携させたいという"Hybrid IT" 型のが要望として多いのではないかと思っています。

## Connect and Compose 概要

Connect and Compose は、従来からあるBluemixクラウド統合サービスをバージョンアップしたものと思ってよいでしょう。Connectは現在のクラウド統合より簡単にセットアップできるようになっています。Compose はより複雑なシステムや 3rdパーティーAPI（SAP, SalesForceなど）と組み合わせて連携させるもので、IoT連携でよく使われる [Node-RED](http://nodered.org) を土台にしています。

####Connect
IBM Bluemix上もしくはオンプレ側に存在するデータベースにアクセスし、それをREST API化するサービスです。

####Compose
Compose もREST API するサービスですが、Node-RED でプログラミングできるようになっています。複雑な処理や、外部APIとの連携処理が必要な場合に利用できます。


### それぞれの適用ケース考察

Hybrid ITの場合の連携については、大きく３つの方式があるとされています([参考文献2][link2])

1. API連携：システムがAPIを既に提供している場合にはそれを活用する方式

2. データ連携：システムに存在するデータを一部取り出して連携させる方式

3. イベント連携：システム内部や外部で発生するイベントに対応してクラウドのシステムと社内のシステムを連携させる方式


1 のAPI 連携は、社内システムが既にAPIを提供するような形になっていれば secure gateway などを通じて連携させ、API Management で管理すればよいので、特に Connect and Compose を利用する必要はないと思います。ただし、そのAPIが複雑な場合などは Compose でカプセル化させるのもよいかと思います。

2 のデータ連携は、Connect が向いています。つまり、システム内部にデータが存在し、それに直接アクセスします。実際には、データの一部をスクリーニングしてアクセスすることが多いと思われるので、この場合は DataWorks サービスなどの利用も検討材料になると思います。複雑な処理をしたい場合には Composeも利用できます。

3 のイベント連携は　Compose で実施します。IoTの場合、mqtt プロトコルでイベントの通知が行われますが、そもそも mqtt の mq はメッセージ・キュー（message queue) です。WebSphere MQ、Rabbit MQ　などは従来のシステムにおいてかなり活用されていますね。同様に、顧客との接点においても、さまざまなイベントが発生します。たとえば、

- 顧客が商品の注文をしたので、オーダー処理を実行した
- 注文の配送状況を更新した

などのシステム内部のイベントのほか

- ある顧客が製品情報をつぶやいた
- 顧客が製品について、"いいね”ボタンを押した

といったインターネット上のイベントも含まれてきます。膨大なイベントの処理は、Apache Kafka などを利用する必要がありますが、注文処理やツイッターイベントなどは Node-RED のフローだけで十分処理できます。

> **注意事項**： ComposeのNode-RED パレットには メッセージキューを処理するような、core node が含まれておりません。Node-RED の開発者からβでは提供していないと回答がありました。**とほほ**。次期更新に期待しましょう。



##サンプルシナリオ

今回は、Connect and Compose の **Compose** を使いました。試したシナリオは次のとおりです。


- 注文した製品の配送状況（いまどこにあるか）を見たい！

このサンプルはさして技術的にも、ユースケースとしても目新しいものではないですが、比較的簡単に実装できるので、応用がきくのではないかと思っています。

### システムアーキテクチャ

イベント連携型のアーキテクチャとして、メッセージキューを使ってみたかったのですが、βの都合上データ連携型アーキテクチャとしました。

![system-architecture.png](https://qiita-image-store.s3.amazonaws.com/0/74673/6966b9f5-29d7-00cd-8d49-de6505582298.png "System Architecture")


### Compose のフローの設計

位置情報さえわかればよいので、以下の REST API を実装します。

```
REST API 
METHOD: GET  /currentpos?itemid=<itemid>
DESCIPTION: Obtain current location of <itemid>
```

パッケージ番号を指定すると現在の位置が返却されるというものです。

### 社内システム

今回の社内システムは架空のもので、cloudant db のドキュメントに直接アクセスして更新しました。ドキュメントは作成済みとしています。

```
if [ $# -ne 3 ]; then
        echo "$0 packageId longitude latitude"
        exit 1
fi

# Cloudant setting
user=<userid>
password=<password>
apihost=$user.cloudant.com
db=packages
document=<document>


URL="https://$user:$password@$apihost/$db/$document"
_rev=`curl -s -X GET $URL | jq "._rev"`

data="{\"_rev\":$_rev,\"package\":\"$1\",\"longitude\":\"$2\",\"latitude\":\"$3\"}"

echo $_rev
echo $data

result=`curl -s -X 'PUT' -d "$data" $URL`

echo $result

```

例えば、日本IBM本社の位置は

35度40分44.94秒(35.67915) 経度: 139度47分12.777秒(139.786883)

なので、荷物番号 100 の位置を以下のように更新します。

```
$ sh updateloc.sh 100 139.786883 35.67916
"27-fa399b2a806b797c0bc76cf7149485ac"
{"_rev":"27-fa399b2a806b797c0bc76cf7149485ac","package":"100","longitude":"139.786883","latitude":"35.67916"}
{"ok":true,"id":"9b1b97f6394aca5263691873c434b2b6","rev":"28-107f5a912ae2111ce80c10411298bfe6"}

```


###Webアプリケーション

Webアプリケーションは Node.js で実装しました。主眼は Compose なのでここでは詳細を省略します。

###Compose の設定

Connect and Compose サービスの作成をし、COMPOSE(初期画面) もしくは COMPOSITION（編集中画面） ボタンをクリックすると API Name（API名）と Description(説明)を入力する画面がでます。ここでは、tracksapi　としました。

![create-tracksapi-compose.png](https://qiita-image-store.s3.amazonaws.com/0/74673/03067540-5a64-4e0a-abc8-e81c870c0a2a.png "APIの名前")

"ADD A COMPOSITION”　をクリックすると、「しばし待て、他の作業をしなさい」とメッセージがでます。内部的に、Node-REDを準備しているようです。準備が終わると Node-RED の画面が出てきます。

RestAPIを実装しますので、基本 http in/http response の二つのノードを使います。基本構造は以下のようになると思います。

![http-restapi.png](https://qiita-image-store.s3.amazonaws.com/0/74673/ca0ad881-c3c2-d839-682a-708e2556861e.png "REST API実装")

http in/http response がペアになっているというのが重要です。さて、今回のシナリオではCloudant DB上の位置情報を取得するというものなので、Cloudant の API を呼び出すロジックをフローに追加します。

![compose-flow-editor.png](https://qiita-image-store.s3.amazonaws.com/0/74673/0078051e-111e-db3c-85de-29d2fa1b19a8.png "現在の位置情報取得")

timestampやdebug output ノードが入っていますが、中心の "query cloudantdb"　ノードが処理ロジックです。ここでは、[Cloudant RESTApi]( https://docs.cloudant.com/api.html ) を直接たたいて検索をしています。さほど難しくないですね。なお、中間の Rest API 呼び出しですが、現在は UTF-8 を選択する必要があります。JSON形式ですとタイムアウトする現象を確認したので、開発担当に現在調査してもらっています。

![flow-return.png](https://qiita-image-store.s3.amazonaws.com/0/74673/ddb76f0c-1311-46cf-399e-4e40618915a0.png "Return UTF8")


実装を保存すると API がドラフトで保存されます。

![API-host-info.png](https://qiita-image-store.s3.amazonaws.com/0/74673/a3453363-1a97-e034-c9d9-7026be1d9c31.png "API Hostinfo")

Base URLが提供された API のホストで、"API Secret" キーが発行されます。これがないとアクセスできないようになっています。このAPIの右側に、ドラフトから Bluemix のスペースにリリースするメニューがあります。今回は、"Share to Bluemix"を選択しました。

![share-to-bluemix.png](https://qiita-image-store.s3.amazonaws.com/0/74673/3eb748da-6448-18dd-9aea-85b67a6c5cb0.png "Share to Bluemix")

このメニューでドラフトからリリース状態になって、Bluemix ダッシュボードでサービスが確認できます。

![api-service-on-bluemix.png](https://qiita-image-store.s3.amazonaws.com/0/74673/01fb08cb-fdfe-0ad5-bae3-2239d6ba087f.png "api-service-on-bluemix")

このサービスを開くと、REST Api 情報が確認できるとともに、実行も可能になっています。以下の図は Compose で実装したRest API を実行しているところです。DBのドキュメントが返却されています。

![api-response.png](https://qiita-image-store.s3.amazonaws.com/0/74673/2d78fe9f-dd6a-5d44-2ac0-b3b4f5b3291f.png "api-response")


## 動かしてみる

先ほど位置情報は日本IBM近辺にしたので、荷物の場所は箱崎になっています。なおURL部分は空白になっていますが、アプリケーションは Bluemix 上で稼動しています。

![package-location1.png](https://qiita-image-store.s3.amazonaws.com/0/74673/76ca1b0a-5df0-b4a9-9eaf-858ee98059f2.png "package-location1")

荷物の位置更新します。

```
$ sh updateloc.sh 100 -157.9225 21.3186
```

WEBアプリケーションを更新してみます。おや、ホノルル空港近くにありますね。

![package-location2.png](https://qiita-image-store.s3.amazonaws.com/0/74673/6233bbc8-1c1a-8159-d520-13146af4d6a7.png "package-location2")

また位置を更新してみます。

```
$ sh updateloc.sh 100 -73.8030 41.2102
```

荷物は無事に、日本IBM箱崎事業所から、IBM Watson研究所に届いたようです。:)

![package-location3.png](https://qiita-image-store.s3.amazonaws.com/0/74673/d0c80f10-0b3c-7979-473a-6aa367a2953c.png "package-location3")


## まとめ

ハイブリッドITを実現するための Connect and Compose の機能と簡単なサンプルシナリオを紹介させて頂きました。まだβなので、まだまだ改良の余地がありそうです。ぜひ、皆さんもためしてフィードバックしてください。


参考文献

１: http://www.m2ri.jp/newsreleases/main.php?id=010120141104500 "MM総研レポート:8割が新規システム構築時にクラウドを検討、国内クラウド市場は2015年度に1兆円へ成長(2014.11.4)"

２: http://www.redbooks.ibm.com/Redbooks.nsf/RedbookAbstracts/sg248277.html "Hybrid Cloud Data and API Integration (IBM Redbook)"


[link1]: http://www.m2ri.jp/newsreleases/main.php?id=010120141104500 "MM総研レポート:8割が新規システム構築時にクラウドを検討、国内クラウド市場は2015年度に1兆円へ成長(2014.11.4)"

[link2]: http://www.redbooks.ibm.com/Redbooks.nsf/RedbookAbstracts/sg248277.html "Hybrid Cloud Data and API Integration (IBM Redbook)"