IBM API Connectで既存のAPIを公開してみる


# はじめに
API Connectを使って、既存のREST APIを公開する方法を紹介します。
API ConnectのBluemix版でもオンプレ版でも同じ操作でできるはずですが、バージョンの違い等により操作や手順が異なってしまう可能性はありますのでご了承ください。

## IBM API Connectとは
API Connectは、既存のエンタープライズIT資産をAPIとして公開するためのAPIプロバイダー向けの包括的な基盤ソリューションです。最近は以下のような図が使われていますが、API自体を作成して実行する機能も提供し、そのAPIを公開するために管理と保護の機能まで包括的に提供しているのがAPI Connectの特長です。
API Connect全般の説明や、作成・実行の機能については、[IBM API Connect 使ってみた〜APIを作る〜](http://qiita.com/YohsukeIshii/items/faf42535f8ad0d661673)でも説明されています。

![apic_logo.png](https://qiita-image-store.s3.amazonaws.com/0/122053/acdb915b-caf4-7c7d-1294-ae7d0320a97e.png)

当記事では、既存のAPIを、管理・保護の機能を利用して公開する方法を中心に説明します。

## 既存のAPIの説明
APIの公開の手順としては、[API Connectのマニュアルのチュートリアル](http://www.ibm.com/support/knowledgecenter/ja/SSMNED_5.0.0/com.ibm.apic.toolkit.doc/tutorial_apionprem_apiproxy.html)をベースにします。
利用する既存のAPIとしては以下のURLにGET操作でアクセスできるサンプルAPIを利用します。これはある銀行の支店情報の一覧を返すAPIです。
[https://apim-services.mybluemix.net/banka/v1/branches](https://apim-services.mybluemix.net/banka/v1/branches)
ブラウザなどからアクセスすると、支店情報の一覧がレスポンスとして取得できます。（以下は、レスポンスの一部の表示例です。）

![existing_branch_api_response.png](https://qiita-image-store.s3.amazonaws.com/0/122053/d64b58a3-3188-72ac-767f-72a89c1d01d3.png)

このAPIをAPI Connectの機能を利用して公開していきます。

# 既存のAPIの公開方法

以下のステップで既存の[支店情報取得API](https://apim-services.mybluemix.net/banka/v1/branches)を公開します。
1. 公開API定義の作成
2. 公開APIのテスト
3. 公開API用の製品およびプランの作成
4. 製品の公開

## 1. 公開API定義の作成
まず、API Managerから公開APIの定義を作成します。
APIマネージャーのUIにログインします。APIマネージャーは、以下のURLからアクセスできます。
`https://<Managementサーバーのアドレス>/apim`

Bluemixの場合は、[IBM Bluemix で無料の IBM API Connect インスタンスを作る](http://qiita.com/YohsukeIshii/items/faf42535f8ad0d661673)を参考にしてください。

APIマネージャーのUIにログインすると、左上に`ナビゲート`アイコン ![apimanager_navigate_icon.png](https://qiita-image-store.s3.amazonaws.com/0/122053/2843ab76-90ee-5b2f-d43a-fff38243e6c3.png) が表示されています。まずはここをクリックして、`基本バナー`を表示して実施する操作に応じたメニューに入ります。
APIの定義をするには、`ドラフト`メニューに入ります。
![apimanager_banner_1.png](https://qiita-image-store.s3.amazonaws.com/0/122053/657a0438-6a63-f8fb-68ca-587e07161e05.png)

`ドラフト`メニューに入ると、上部に`製品`と`API`のタブが表示されています。まずはここから`API`のタブをクリックして、`追加`アイコン ![apimanager_add_icon.png](https://qiita-image-store.s3.amazonaws.com/0/122053/5b80962a-61d2-32c8-d4af-57bddf704228.png) をクリックして、公開するAPI定義を追加します。
`追加`アイコンをクリックすると、API定義を追加する方法がいくつか用意されていることが分かります。外部で作成したOpenAPI記述（Swagger 2.0記述）をインポートすることもできます。今回は、スクラッチで定義するため、一番上のAPIを選択します。
![apimanager_api_add_menu_1.png](https://qiita-image-store.s3.amazonaws.com/0/122053/7ee5d39f-1601-cd7e-fd25-c82b45d5ead7.png)

以下の例を参考にAPI定義の基本情報を入力して、`Create API`ボタンをクリックします。
![apimanager_add_api_1.png](https://qiita-image-store.s3.amazonaws.com/0/122053/78f29ff5-5d4e-231b-307f-b538dfabb862.png)

API定義が作成され、APIの`設計`タブが開きます。
API定義に必要な設定をここで追加することができます。
左のメニューの中から`セキュリティー定義`セクションに移動してみると、クライアントID（APIキー）の定義がデフォルトで設定されていることが分かります。
![api_security_def_apikey.png](https://qiita-image-store.s3.amazonaws.com/0/122053/fece3627-69e9-f6f7-9704-a3afca41f042.png)

`セキュリティー`セクションに移動すると、`セキュリティー定義`セクションで定義されたクライアントID`cliendIdHeader(APIキー)`にチェックが入っており有効になっていることが分かります。
この設定が行われていることで、アプリケーションごとに発行するクライアントID（APIキー）を付けてAPI呼び出しを行うことを強制し、アプリケーションごとにAPIへのアクセス制御を行うことができます。
![api_security_apikey.png](https://qiita-image-store.s3.amazonaws.com/0/122053/027939d0-7a25-3f82-86a1-0e4003c681e8.png)


`パス`セクションに移動して、どのパスでどの操作のリクエストを受け付けるのかを定義していきます。`パス`セクションで`追加`アイコン ![add_icon.png](https://qiita-image-store.s3.amazonaws.com/0/122053/172bee30-5cfb-238c-0785-6880354804e4.png) をクリックすると、`---1`という名前で新規パスが追加されるので、パスの名前を`details`に編集します。
![api_path_edit.png](https://qiita-image-store.s3.amazonaws.com/0/122053/f9c71323-0cbf-829f-b445-35f9133a37a6.png)

API作成時に設定した`基本パス`の`/branches`の後ろに、ここで設定したパスを付けて、`/branches/details`というパスでAPI操作を受け付けることになります。このパスにデフォルトで`GET`操作が定義されています。今回公開するAPIもGET操作として公開するので、この設定を編集していきます。

ここで、各操作のパラメーターや要求・応答メッセージのフォーマットを定義します。ここで定義しておけば、Open API（Swagger 2.0）記述に反映され、APIを公開した際に、APIを利用するアプリ開発者が開発者ポータルからAPI仕様の詳細を確認したり、Open API（Swagger 2.0）記述のダウンロードもできるようになります。

今回の`GET`操作ではパラメーターはないため、応答メッセージのフォーマットのみを設定します。
`定義`セクションに移動し、`追加`アイコン![add_icon.png](https://qiita-image-store.s3.amazonaws.com/0/122053/7218afd5-6e84-7e03-80f3-3d31787c4148.png)をクリックして、以下のように`address`という名前に変更します。
![api_def_add.png](https://qiita-image-store.s3.amazonaws.com/0/122053/fd794396-7843-5607-0a1d-1812d57c7073.png)

`プロパティーの追加`をクリックして、この定義に以下のように5つのプロパティーを設定します。
![def_property.png](https://qiita-image-store.s3.amazonaws.com/0/122053/83a17efb-1375-88bd-58ba-42c3dee5e650.png)

もうひとつ`定義`セクションで定義を追加して、`branch`という名前にします。
![api_def_add2.png](https://qiita-image-store.s3.amazonaws.com/0/122053/f6655e17-808c-aa3f-bca1-98074d5a43bb.png)

`プロパティーの追加`をクリックして、この定義に以下のように3つのプロパティーを設定します。ここで、プロパティー`address`のタイプに、先ほど定義した`address`を設定します。このように、API内の他の定義を参照して階層化しているデータ構造も定義することができます。
![def_property2.png](https://qiita-image-store.s3.amazonaws.com/0/122053/88339145-9290-b2bb-5a4b-a6fa3634b737.png)

これで`detail`パスの応答メッセージのフォーマットの定義ができたので、`パス`セクションの`details`パス定義に戻り、`GET`操作を展開します。
![api_path_edit2.png](https://qiita-image-store.s3.amazonaws.com/0/122053/f7726a9e-cc03-773b-beb5-cde0af461585.png)
応答のセクションで、状況コードが200の応答メッセージのスキーマとして、先ほど設定した`branch`定義をドロップダウンより選択します。
![api_path_edit_response_1.png](https://qiita-image-store.s3.amazonaws.com/0/122053/501e8f12-5e1c-d5f8-3216-b52a2e969158.png)

ここまで設定したら、右上の`保存`アイコン![save_icon.png](https://qiita-image-store.s3.amazonaws.com/0/122053/a8b97fb9-2d01-6fd2-45c8-2625806f9d92.png)をクリックして設定を保存します。


さて、ここまででAPIの仕様を定義してきましたが、先ほども少し説明したように、ここで定義した内容は開発者ポータルに表示される内容となりますので、できるだけ親切に分かりやすくしてあげる必要がありますよね。
たとえば応答メッセージのフォーマットを定義しましたが、「説明」や「例」にはできるだけ分かりやすいものを記入しておいてあげると利用者に親切なAPIになるかと思います。APIのデザインにおいては、APIそのものを使いやすく設計することももちろん重要と思いますが、使う方に分かりやすく情報提供することもそれと同じくらい重要なポイントになると思います。


次に`アセンブル`タブに移動して、既存のAPIを呼び出す設定を行います。
![api_sssemble_tab_1.png](https://qiita-image-store.s3.amazonaws.com/0/122053/866b4992-32b3-ef99-14a4-a9e2fe8e64e0.png)

ここで、APIゲートウェイでAPIのリクエストを受け付けたあとの処理を実装していきます。
左側に利用できるポリシーが並んでいますが、左上の`ポリシーのフィルター`アイコン![api_sssemble_filter.png](https://qiita-image-store.s3.amazonaws.com/0/122053/bd4b8317-417a-5412-e82a-19c0a92f884c.png)をクリックすると、`Micro Gatewayポリシー`と`DataPower Gatewayポリシー`が選択できるようになっています。選択を変えると、その下に表示されるポリシーの種類が変わることが確認できます。Gatewayの種類によって利用できるポリシーが異なるからです。ここで、使っているゲートウェイに応じて正しく選択をしておくことを忘れないようにしましょう。Bluemixを利用している場合や、オンプレでDataPowerを利用している場合は、`DataPower Gatewayポリシー`にチェックを入れます。
![api_sssemble_gw.png](https://qiita-image-store.s3.amazonaws.com/0/122053/9a5af80b-4268-e8f5-6490-74ab70741698.png)

デフォルトで`invoke`ポリシーが配置されていますが、最低限バックエンドのAPIを呼び出す設定をしなければなりません。`invoke`ポリシーをクリックすると、右側にプロパティー・シートが表示されるので、バックエンドのAPIのURLを、プロパティーの`URL`に入力します。
+ バックエンドのAPIのURL : https://apim-services.mybluemix.net/banka/v1/branches
![api_sssemble_invoke.png](https://qiita-image-store.s3.amazonaws.com/0/122053/7da16c14-6c5d-dd53-4f4b-61990e59b04b.png)

ここまででAPIの設定が完了しましたので、右上の`保存`アイコン![save_icon.png](https://qiita-image-store.s3.amazonaws.com/0/122053/cda6bb8f-a2ed-3ba9-b86b-eb095d6f84b6.png)をクリックして設定を保存します。

さて、ここで、`ソース`タブをクリックしてみてみると、これまで設定した内容がOpen API（Swagger 2.0）記述として確認できるようになっています。
`設計`タブで設定した内容のほか、`アセンブル`タブで設定した内容もIBM拡張として、`x-ibm-configuration` オブジェクトを使用して、定義されていることがわかります。つまりAPIマネージャーで定義したAPIの定義内容はすべてここに含まれているので、この定義をエクスポートして別の環境でインポートすれば定義をそのままコピーできますし、バックアップとしても便利ですね。
![api_source_tab.png](https://qiita-image-store.s3.amazonaws.com/0/122053/a185c64f-9545-3e2d-ba2e-ea750ffe4351.png)

## 2. 公開APIのテスト
ここまでの手順で定義したAPIが正しく動作するか、APIマネージャーのテスト機能を利用してテストしてみましょう。

`アセンブル`タブの左上の`テスト`アイコン![api_sssemble_test_icon.png](https://qiita-image-store.s3.amazonaws.com/0/122053/c4c50a8c-103d-dbd2-0aee-978c812db873.png)をクリックすると、テストメニューが表示されます。`セットアップの変更`をクリックして、公開するためのカタログや製品の設定をします。
![api_sssemble_test_change_setup.png](https://qiita-image-store.s3.amazonaws.com/0/122053/f58ecfc7-4b7a-702f-6801-1f31d95a28c4.png)

カタログや製品については後の章で説明しますので、ここでは、とりあえず、カタログには`Sandbox`を選択します。
![api_sssemble_test_catalog.png](https://qiita-image-store.s3.amazonaws.com/0/122053/d311ad43-ddd8-9b67-efe7-5b50d1a64402.png)

下にスクロールして新しい製品の名前として、`banking-services`と入力して`作成および公開`をクリックして、`次へ`をクリックします。
![api_sssemble_test_product.png](https://qiita-image-store.s3.amazonaws.com/0/122053/0f6bef83-45cf-1197-1116-704272bdd959.png)

呼び出す操作を選択する画面が表示されるので、プルダウンから`get /details`を選択します。
![api_sssemble_test_method.png](https://qiita-image-store.s3.amazonaws.com/0/122053/64372074-58fc-697e-ebbc-1a301c01642d.png)

下にスクロールして`呼び出し`をクリックすると、APIのテスト呼び出しが実行されます。
![api_sssemble_test_run.png](https://qiita-image-store.s3.amazonaws.com/0/122053/3de0dece-ae47-270a-cbdc-5b314758c9b2.png)

呼び出しが成功すると、以下のように表示され、ヘッダーの内容やレスポンス本文が表示されます。
![api_sssemble_test_result.png](https://qiita-image-store.s3.amazonaws.com/0/122053/be5b4097-8f75-ded8-ea98-e05aa5242bae.png)

問題がある場合や修正したい場合には、APIの設定を変更して、再度保存し、テストのメニューから`製品の再公開`を行った上で呼び出しを実行します。再度公開しないと、変更内容が反映されません。
以上でテストは終了です。

## 3. 公開API用の製品およびプランの作成
APIの定義が終わりテストが完了したので、ここから公開に向けて、`製品`と`プラン`の設定を行います。
`製品`というのは、APIをステージングしたり公開する際の単位で、1つ以上のAPIを製品に含めて、公開を行います。
`製品`の中には1つ以上の`プラン`を設定します。`プラン`は、APIを利用するアプリケーションのAPIへのアクセス可否と利用回数（レート制限）を制御する単位となっています。
今回は、1つのAPIを製品に含めて、レート制限の異なるプランを2つ作成してみましょう。
+ ベーシックプラン : レート制限 10回/分
+ ライトプラン : レート制限 5回/分

実は、先ほどの手順でテストを行った際に、`製品`と`プラン`は作成されてしまっています。`プラン`は`製品`を作成したタイミングでデフォルトで1つが自動的に作成されています。先ほどの手順で作成した`製品`を修正する形で設定をしていきましょう。`すべてのAPI`をクリックしてAPIの一覧に戻ります。
![api_all_api_1.png](https://qiita-image-store.s3.amazonaws.com/0/122053/3e01beea-54aa-5ad0-e941-8c62f5ee052d.png)

`製品`タブをクリックして、テストを行った際に作成した`banking-services`製品をクリックして設定画面を表示します。

![api_product_api.png](https://qiita-image-store.s3.amazonaws.com/0/122053/4011c512-94ab-3a32-8efa-c425bd7c4b3b.png)

左側のメニューから`API`セクションを見ると、`支店情報取得API`が表示されており、この製品に含まれているAPIが分かります。さらにここから、製品に含めるAPIを追加することもできます。
![product_api.png](https://qiita-image-store.s3.amazonaws.com/0/122053/c2824969-0ad8-258c-af93-c0c197046b45.png)

`プラン`セクションを確認しましょう。デフォルトで`デフォルトのプラン`という名前のプランが定義されていますね。`デフォルトのプラン`を展開して設定を変更していきます。
![product_default_plan_edit.png](https://qiita-image-store.s3.amazonaws.com/0/122053/62f40526-60b6-a69d-7015-d6e7b699c244.png)
以下のように設定します。
![product_basic_plan.png](https://qiita-image-store.s3.amazonaws.com/0/122053/3d707e30-909a-8fb2-d4ca-701137e369e1.png)

もうひとつプランの設定を追加します。`プラン`セクションで`プランの追加`アイコン![add_icon.png](https://qiita-image-store.s3.amazonaws.com/0/122053/73b431ac-3102-90b5-f665-9047b4ddc341.png)をクリックすると`新規プラン1`という名前でプランが作成されるので、展開をして以下のように設定をします。
![product_light_plan.png](https://qiita-image-store.s3.amazonaws.com/0/122053/42c45376-abdc-f6e2-171a-9a49986cdd50.png)

以下のように2つのプランを設定できました。
![product_plan_setting.png](https://qiita-image-store.s3.amazonaws.com/0/122053/9ac47b12-4692-57ed-232d-f0b2b1aad546.png)

ここで、`製品`に設定する内容として、`プラン`以外に重要な情報があります。`設計`タブの`問い合わせ先`セクションで、製品に関する問い合わせ先やライセンス情報、利用条件などを登録できます。ここで登録しておくことで、開発者ポータルに表示されます。以下の例を参考に、登録してみてください。
![product_info.png](https://qiita-image-store.s3.amazonaws.com/0/122053/819d7599-1eea-1768-e375-d05168f883f9.png)

ここで`ソース`タブをクリックしてみると、APIと同様に、製品に対する設定内容がyaml形式で分かるようになっています。こちらもAPIと同様に、ダウンロードして別の環境にコピーしたり、バックアップとして利用することができます。

右上の`保存`アイコン![save_icon.png](https://qiita-image-store.s3.amazonaws.com/0/122053/757a6767-0e81-a18a-76a2-ed24888a1c9a.png)をクリックして設定を保存します。

これで製品とプランの設定が完了しました。


## 4. 製品の公開
設定した製品を公開していきます。
製品を公開するには、まずステージングを行います。ステージングをすると、APIゲートウェイ上にデプロイされます。

`製品`の編集画面の右上の`ステージング`アイコン![product_staging.png](https://qiita-image-store.s3.amazonaws.com/0/122053/c68ff36d-171d-5984-87de-3955c1de0205.png)をクリックすると、ステージング可能なカタログが表示されるので、`Sandbox`をクリックしてステージングします。
![product_staging_sandbox.png](https://qiita-image-store.s3.amazonaws.com/0/122053/7c6d2597-df90-4558-3972-9b7481e3796a.png)

カタログとは、ゲートウェイのランタイム環境のことで、テスト環境や開発環境など、目的別に作成することができます。カタログを複数作っておくことで、目的別に論理的に独立した環境を利用して開発やテストを行うことができます。デフォルトではSandboxのみが用意されています。

ステージングが完了すると、カタログの管理メニューから公開の操作を行います。
カタログの管理メニューに入るには、左上の`ナビゲート`アイコン ![apimanager_navigate_icon.png](https://qiita-image-store.s3.amazonaws.com/0/122053/2843ab76-90ee-5b2f-d43a-fff38243e6c3.png) から、`ダッシュボード`をクリックします。
![apimanager_banner2_1.png](https://qiita-image-store.s3.amazonaws.com/0/122053/e066f9f7-03db-272b-b732-f08993132d8d.png)

ここでカタログの一覧が表示されますが、デフォルトでは`Sandbox`だけですね。製品をステージングした`Sandbox`をクリックします。
![sandbox.png](https://qiita-image-store.s3.amazonaws.com/0/122053/88179fb3-fe7b-3ccd-8c82-7de75fe1b4cb.png)

ステージングした製品`banking-services`が`ステージング済み`ステータスでこのカタログにステージングされていることが分かりますね。`banking-services`製品をクリックすると、この製品に含まれるAPIやプランが確認できて分かりやすいですね。
![banking_service.png](https://qiita-image-store.s3.amazonaws.com/0/122053/1eafd59c-a366-1cce-a059-686bea786fe4.png)

ここでステージング状態の製品を公開しましょう。
製品名の右の`管理`アイコン![admin_icon.png](https://qiita-image-store.s3.amazonaws.com/0/122053/2c36efe7-a660-7c18-98bf-9b907cccbbaa.png)をクリックして、`公開`を選択します。
![product_publish.png](https://qiita-image-store.s3.amazonaws.com/0/122053/5e914549-9c0f-a0b7-a273-f7d878cc2945.png)

以下のように`可視性およびサブスクライバーの編集`画面が表示されます。これは、開発者ポータルに公開した際に、アプリ開発者に対する表示可否とサブスクライブ可否を設定するものです。この設定により、開発者ポータルにログインしたアプリ開発者ごとに見せる製品を変えたり、利用可能な製品を制御することができるようになっています。
ここではそのまま、`公開`ボタンをクリックして公開します。
![product_publish2.png](https://qiita-image-store.s3.amazonaws.com/0/122053/5687038e-fc1c-3d63-1418-81af55d4adf2.png)

公開されると、製品のステータスが以下のように`公開済み`となります。
![product_published.png](https://qiita-image-store.s3.amazonaws.com/0/122053/5cd944e0-d0c0-db0e-ac9d-e2f5cb0ee3f9.png)

以上で製品の公開が完了し、外部からAPIが利用できる状態となりました。

次の回では、開発者ポータルからの利用と、外部からのAPI呼び出しについて書きたいと思います。