Docker対応したAPI Connectを導入、稼動させる

#はじめに
2016年末に提供されたAPI Connect V5.0.6 から、開発者向けにDocker ContainerへAPI Connectがインストールできるようになった。V5.0.5以前は、API ConnectのコンポーネントであるDataPower、API Manager、開発者ポータルは仮想イメージとしてのみ提供されており、開発者端末への導入は、それなりにハードルが高かった。

Docker Containerに導入できるようになったことで、従来よりも簡単に開発者向け端末で利用できるようになりそうだ。docker-composeを利用し、API Connectの複数のコンポーネントをまとめて導入、管理できるようになっている。

マニュアルに従い、Docker ContainerにAPI Connectを導入し、サンプルを動かす所まで実施してみる。

(仮想イメージの導入に関しては、[IBM API Connect の導入 IBM DataPower Gatewayの導入編](http://qiita.com/Naomi_Tanaka/items/c600d9a4f056825fb8e7)、[IBM API Connect の導入 Managementサーバーの導入編](http://qiita.com/Naomi_Tanaka/items/0bbc10873fccffc2c375) に詳しく説明されている。)

#ながれ
Docker ContainerへのAPI Connectの導入、稼動に関しては、[Knowledege Center](https://www.ibm.com/support/knowledgecenter/ja/SSMNED_5.0.0/com.ibm.apic.install.doc/tapic_docker_install.html)に記載があるので、こちらの流れに従う。

0. 前提環境の準備
0. Docker Container に API Connect を導入
0. API Connect の構成実施
0. カタログの設定
0. microservice アプリケーションの公開
0. 開発者ポータルで、Client キー&シークレットの確認
0. ゲートウェイ経由の microservice の呼び出し

以降は、この流れに従う。

#1. 前提環境の準備
[Knowledege Center](https://www.ibm.com/support/knowledgecenter/ja/SSMNED_5.0.0/com.ibm.apic.install.doc/tapic_docker_install.html)や、[Docker Hub](https://hub.docker.com/r/ibmcom/apiconnect/)によると、以下が前提とある。

- Docker HostのOSは、API ConnectがサポートするOS
- Docker
    - docker1.12.0 or later
    - docker-compose 1.8.1 or later
- API Connect Toolkit
- ミニマムHWリソース
    - 2cpu
    - 8GB RAM

API ConnectがサポートするOSの調べ方は、[過去記事](http://qiita.com/uedatks/items/b62c9a11fba07ceb3849)を参考。
環境は、Windows7 professional sp1環境上にVMWareを用意し、Docker HostのOSとしてUbuntu14.04LTSを導入し、Ubuntuイメージに2Cpu、8GB RAMを割り当てた。導入したDocker関連は、以下。

- docker 1.12.6
- docker-compose 1.9.0

Dockerの導入に関しては、[Dockerのマニュアル](https://docs.docker.com/engine/installation/linux/ubuntulinux/)や、[DockerをLinux(Ubuntu 14.04 LTS)にインストールする方法と解説](http://tracpath.com/works/devops/how_to_install_the_docker/)を参考に導入した。
docker-composeも同様に、[Dockerのマニュアル](https://docs.docker.com/compose/install/)を参考に導入した。

# 2. Docker Container に API Connectを導入
Docker Hostの適当なディレクトリーに移動する。以下のコマンドを実施し、git の API Connect Docker リポジトリーの clone を作成する。

`$ git clone https://github.com/strongloop/apiconnect-docker`

作成した clone のディレクトリーに移動し、以下コマンドを実行。コマンド実行は、ダウンロードが行われるため、インターネットアクセスが必要で、時間もかかる。
`$ cd apiconnect-docker`
`$ docker run -it --rm --env SHOW_LICENSE=1 ibmcom/apiconnect:manager-v5.0.6.0`

clone ディレクトリー内で、SMTPサーバーを指定されているファイル「.env」を編集する。以下はgmailを指定した場合の例。

```lang:.env
ACCEPT_LICENSE=true
APIC_VERSION=v5.0.6.0
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_SENDER=xxxxxxxxxx@gmail.com
SMTP_USERNAME=xxxxxxxxxx@gmail.com
SMTP_PASSWORD=password
```
API Connectは、Gateway、API Manager、開発者ポータルなど複数のサービスで稼動する。clone ディレクトリー内に、複数 Container を構成管理するYAMLファイルが提供されており、これを利用し、Container を起動する。Gateway として DataPower を利用する場合は、docker-compose.yamlファイル、Gateway として Microgateway を利用する場合は、docker-compose-microgateway.yaml が用意されている。
ここでは、DataPower を利用した。clone ディレクトリ内で、以下のコマンドを実行し、Container を起動する。初回のコマンド実行時には、ダウンロード等が行われるため、時間がかかる。

`$ docker-compose up -d`

起動が終了後、以下コマンドを実行し、稼動状況を確認する。

`$ docker-compose ps`

```
apic@ubuntu:~/apiconnect-docker$ docker-compose ps
    Name                   Command               State               Ports
--------------------------------------------------------------------------------------
apim            /tini -- /startup.sh             Up
datapower       /start.sh                        Up       443/tcp
esmaster        /docker-entrypoint.sh /bin ...   Up       9200/tcp, 9300/tcp
ibmlogstash     /bin/sh -c /startup.sh           Up
ibmportal       /root/tini -- /root/start_ ...   Up
make-ssh-keys   /bin/sh -c /genkey.sh            Exit 0
microservice    /bin/sh -c /usr/bin/app.sh ...   Up       8080/tcp
nginx           /bin/sh -c /run.sh               Up       0.0.0.0:443->443/tcp, 80/tcp
apic@ubuntu:~/apiconnect-docker$
```

全てのサービスへのアクセスを確認するために、Docker Host の IPアドレスと API Connect ホスト名をマッピングする。Docker Hostの/etc/hostsファイルを編集する。

```
xxx.xxx.xxx.xxx  apim ibmportal datapower microservice
```

**ここまでで導入は完了。かなり簡単に導入ができた！！**
これ以降は、環境の設定、サンプルAPIの公開、APIへのアクセスを行っていく。

**以降の手順では、画面キャプチャーが英語となっているが、日本語表示も可能**

# 3. API Connect の構成実施
次に、GatewayとしてDataPowerの登録と、APIを提供する組織の登録を行う。
## 3.1 DataPowerの登録

Cloud Manager(https://apim/cmc) にアクセスを行う。起動まで時間がかかるケースがあるのと、最初のアクセスでは証明書の受け入れが必要。ログインし、ライセンス条項を受け入れる。

- ユーザー：admin
- password: !n0r1t5@C
![cmc01.JPG](https://qiita-image-store.s3.amazonaws.com/0/121209/b2225f5e-0c5b-b5a0-f7bd-b155e083c31e.jpeg)

プロファイル情報を更新する。
![cmc03.JPG](https://qiita-image-store.s3.amazonaws.com/0/121209/0888b71f-4c89-aadf-2402-0c8e5cb1e47e.jpeg)

プロファイルの更新が終わると、Cloud Managerの画面が表示されるのでDataPowerの設定を行う。Servicesをクリックし、"Gateway" 箇所までスクロールし、歯車マークをクリックする。
![cmc04_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/121209/705c7700-efaa-9835-f072-c98ff05ad128.jpeg)

Addressに「datapower」と入力し、"save" をクリックする。
![cmc05_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/121209/0b295215-cf63-c4f0-6071-881bebec698b.jpeg)

DataPower Servicesで、"Add Server" をクリックする。
![cmc06_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/121209/5016c49b-add5-670f-5e76-0872c57033f4.jpeg)

DataPowerの情報を入力し、"Create"をクリックする。登録が終わるまで時間がかかる。

- Display Name: idg
- Address: datapower
- Username: admin
- Password: admin

![cmc07_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/121209/5aeadf9e-df67-175b-5803-a3b29ec9f0b6.jpeg)

これで、DataPowerが登録される。
![cmc08_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/121209/2524253b-22a7-36bc-3ffd-532f03fc7e56.jpeg)

## 3.2 APIを提供する組織の登録
続いて、**APIを提供する組織**の登録を行う。組織を開き、"Add" をクリックする。
![cmc09_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/121209/5a781a08-d12d-1613-28c4-9e2d92020d08.jpeg)

組織名や、ユーザー情報を入力し、"Add" をクリックする。ここでは組織名を「dev」とした。
![cmc10_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/121209/61f26b4b-6310-192a-5b88-f6711e35241a.jpeg)

**APIを提供する組織**の登録後、ユーザー情報で登録したメールアドレスにメールが届く。このメールからパスワードの設定を行うと、API Managerへのアクセスが可能になる。
![cmc11_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/121209/d1676fbe-606d-37cb-7583-5c0d0f1b1b9f.jpeg)


# 4. カタログの設定
ここでは、カタログの設定から開発者ポータルを作成する。
API Manager (https://apim/apim) にアクセスを行い、APIを提供する組織で登録したユーザーでログインする。
![apim01.JPG](https://qiita-image-store.s3.amazonaws.com/0/121209/f6a12003-f6d8-2da0-5a90-662393ca6f79.jpeg)


ログイン後、最初のアクセスの場合、黒い画面で"Draft APIs"という画面が出力されるので、"Got it!"ボタンを押す。
![apim02.JPG](https://qiita-image-store.s3.amazonaws.com/0/121209/b4333644-9960-4236-ffb2-1189fe1277c7.jpeg)

APIに関するページが表示され、画面左上のマークをクリックするとメニューが表示される。
![apim03_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/121209/4babc9ea-a16d-299b-fc1c-25c6cb9167b0.jpeg)

Dashboardをクリックする。Dashboardの黒い画面が表示されるので、"Got it!"をクリックする。
![apim04_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/121209/20b10c25-aacf-9e1c-a843-235448b8fe56.jpeg)

Sandboxカタログをクリックし、Sandboxカタログの設定を行う
![apim06_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/121209/23ca08ca-f529-ae96-7d31-85bd2c70b6bf.jpeg)

Settingsタブを選択し、左メニューのPortalをクリックし、以下を設定確認し、画面右上の保存ボタンをクリックする。

- Select Portal: IBM Developer Portal
- URL: https://ibmportal/登録した組織名/sb
![apim07_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/121209/ebeac566-64b1-8217-a8ec-779de66477bd.jpeg)

保存ボタンをクリックすると、Portalを作成するという画面が表示される。一定時間経過後、開発者ポータルにアクセスが可能となる。
![apim08.JPG](https://qiita-image-store.s3.amazonaws.com/0/121209/927453e6-a766-13e4-7b86-abf8b654ff0d.jpeg)

これで、カタログの設定は終了。


# 5. microservice アプリケーションの公開
次に、microservice アプリケーションを公開するステップを行う。このステップでは、apicコマンドを使用するため、apiconnect Developer toolkitの導入が必要である。
toolkitの導入は、Windowsの記事ではあるが、[API Connect をWindowsにインストールする際のTips](http://qiita.com/uedatks/items/b62c9a11fba07ceb3849)を参考に。
ここでは、Docker HostのUbuntuに、以下を導入。

- node v4.4.4
- npm v4.1.1
- apic v5.0.6(apiconnect: v2.5.8)

作成したgit cloneのディレクトリーから、micoroservice ディレクトリに移動し、以下のように apic login コマンドを実行する。ユーザーは、apim にログインしたユーザーと同じ。

```
apic@ubuntu:~/apiconnect-docker$ cd microservice/
apic@ubuntu:~/apiconnect-docker/microservice$ apic login
Enter the API Connect server
? Server: apim
? Username: xxxxx@xxx.com
? Password (typing will be hidden) *********
Logged into apim successfully
apic@ubuntu:~/apiconnect-docker/microservice$
```

次に、サンプルで用意されているAPIを、公開する。以下のコマンドを実行する。

```
apic@ubuntu:~/apiconnect-docker/microservice$ apic publish definitions/loopback-example-database-product.yaml --catalog sb --organization dev --server apim

Staged definitions/loopback-example-database-product.yaml to dev:sb [loopback-example-database:1.0.0]
Published definitions/loopback-example-database-product.yaml to dev:sb [loopback-example-database:1.0.0]
apic@ubuntu:~/apiconnect-docker/microservice$
```

これでmicroserviceアプリケーションの公開が終了。

# 6. 開発者ポータルで、Client キー&シークレットの確認
ここでは、開発者ポータルにアクセスし、公開したmicroserviceにアクセスする際にClientキーとClientシークレットを確認する。
https://ibmportal/登録した組織名/sb にアクセスする。
![dev01.JPG](https://qiita-image-store.s3.amazonaws.com/0/121209/be063c06-6593-f545-3551-0201bc152378.jpeg)

"create an account"をクリックし、新規ユーザー登録を行う。ここでのユーザーは開発者のため、メールアドレスは、**APIを提供する組織**の登録で使用したメールアドレスとは別のアドレスが必要。
![dev03.JPG](https://qiita-image-store.s3.amazonaws.com/0/121209/b62f695c-4f62-550d-b2fe-8b5baf0d3120.jpeg)

APIを提供する組織の登録と同様に、該当のメールアドレスにメールが送信される。メールにあるURLをクリックするとユーザーがアクティベーションされる。登録したユーザーでログインする。
![dev04.JPG](https://qiita-image-store.s3.amazonaws.com/0/121209/940b4dd3-44cd-78ca-53ac-1b0166e8f642.jpeg)

"Apps"をクリックし、"Create new App"をクリックする。
![dev05_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/121209/615debcb-6532-1f15-1250-be92c80934d8.jpeg)

アプリ名に「microservice」と入力し、作成する。
![dev06_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/121209/b6a4c9de-62e2-5b5e-19ae-89c71fb74ffb.jpeg)


作成されると、"Show Client Secret"にチェックを入れると、Clientシークレットを確認することができる。この表示は一度だけのため、Clientシークレットを使用する場合、コピーをしておく必要がある。次のAPI呼び出しの手順で使用するため、コピーしておく。
リセット機能があるので、忘れた場合はリセットを行う。
![dev07_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/121209/8f51e932-224a-0fe1-3058-26e26c8adad0.jpeg)

スクロールすると、同様にClientキーを確認できる。同様にコピーしておく。
![dev08_2.JPG](https://qiita-image-store.s3.amazonaws.com/0/121209/1be5a8a7-d348-3f76-de01-a94a189ea8df.jpeg)

"API Products"から、公開した"loopback-example-database (1.0.0)"をクリックする。
![dev02_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/121209/848a38c8-0427-4e26-d827-a9707f55ebc6.jpeg)

Plansで"Default Plan"を"subscribe"をクリックする。
![dev09_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/121209/76c999b1-40d3-e3e1-dbfe-fa2d08a3e8c8.jpeg)

先ほど作成した"microservice"にチェックをいれ"Subscribe"をクリックする。
![dev10_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/121209/91758042-50a5-557d-77f7-efb299ab1cba.jpeg)

この操作で、公開したmicoroserviceの利用登録まで完了した。


# 7. ゲートウェイ経由の microservice の呼び出し
次に、curlを使用して、公開したmicroserviceの呼び出しを行う。呼び出しに必要な情報は以下。POSTでデータ登録を行い、GETでそのデータを取得する。

- url : https://datapower/組織名/sb/api/Accounts
- x-ibm-client-id : 開発者ポータルで確認したClientキー
- x-ibm-client-secret : 開発者ポータルで確認したClientシークレット

まず、以下コマンドを実行してPOSTを実行する。Clientキー、Clientシークレットは適宜修正が必要。

```
apic@ubuntu:~$ curl -k --request POST --url https://datapower/dev/sb/api/Accounts --header 'accept: application/json' --header 'content-type: application/json' --header 'x-ibm-client-id: a395c4b2-3115-4544-ad0c-e1c15cb3acfb' --header 'x-ibm-client-secret: kE8eN8lC8jW2yB4wJ4iY1fP7uP7dT7mD8aK3aK3jA8kN5bH0dA' --data '{"email":"myemail@myhost.com","createdAt":"2016-11-26T15:29:45.233Z","lastModifiedAt":"2016-11-25T20:17:02.033Z"}'

{"email":"myemail@myhost.com","createdAt":"2016-11-26T15:29:45.233Z","lastModifiedAt":"2016-11-25T20:17:02.033Z","id":1}
apic@ubuntu:~$
```

次に、以下コマンドを実行してGETを実行する。入力した値がGETされていることが確認できる。

```
apic@ubuntu:~$ curl -k --request GET --url https://datapower/dev/sb/api/Accounts --header 'accept: application/json' --header 'content-type: application/json' --header 'x-ibm-client-id: a395c4b2-3115-4544-ad0c-e1c15cb3acfb' --header 'x-ibm-client-secret: kE8eN8lC8jW2yB4wJ4iY1fP7uP7dT7mD8aK3aK3jA8kN5bH0dA'

[{"email":"myemail@myhost.com","createdAt":"2016-11-26T15:29:45.233Z","lastModifiedAt":"2016-11-25T20:17:02.033Z","id":1}]
apic@ubuntu:~$
```

#まとめ
Docker ContainerにAPI Connectの導入から実行まで行った。
仮想イメージの導入よりも、かなり簡単に、API Connectの各コンポーネントの導入、構成ができた。
docker-compose を利用し、複数 Container がまとめて導入できるようになっている。