[更新] SwaggerHubで作成したAPI定義をIBM Cloud API Connectに公開


## 更新情報
* 2020/01/09: IBM CloudがIAMに対応したことに関係したのか、SwaggerHubでのAPI Connect連携方法が変わっていたので、情報追記しました。

# はじめに
今年の初めくらいに、SwaggerHubで作成したAPI定義をIBM CloudのAPI Connectにデプロイできるようになりましたので、今更ですが以下を参考に試してみました。
https://swaggerhub.com/blog/swaggerhub-feature/ibm-api-connect-and-swagger/
https://www.youtube.com/watch?v=iUBTCk41Wa4

## 連携するメリット？
あまり洗い出せてないですが、今の理解はこんな感じです。
とりあえず私の今の理解では、もともとAPI ConnectユーザーだったらSwaggerHubから連携しなくても、API ConnectのAPIデザイナー画面を使ってOpen APIに則ったAPI定義ができるので、わざわざSwaggerHubからデプロイする理由が思いついてません。。SwaggerHubユーザーが高度なAPIゲートウェイと連携するためというものかなと考えています。
間違い・不足事項などありましたらご指摘いただければと思います。

* SwaggerHubでできること
	* Swagger文書をチーム開発できる（でも有償）
	* Swagger Codegen対応
	* ドキュメントの自動生成
* IBM Cloud API Connectでできること
	* Open APIベースのAPI定義作成
	* 複数のAPIを組み合わせや非機能要件を満たすためのフローの開発（API定義の拡張）
	* APIの運用管理
		* API利用状況の可視化
		* 公開から廃止に至るライフサイクル
	* レート制限、認証基盤との連携などセキュリティ周りの強化
	* API利用者向けのポータル公開

# 手順
## 前提
* SwaggerHubのアカウント（無料枠を使用）
* IBM Cloudのアカウントがあり組織作成済みで、API Connectサービスがデプロイ済みであること（無料のライト・プラン使用）

## SwaggerHubでAPI定義
1. SwaggerHubにログインして、新規API作成
![Kobito.YKOIQK.png](https://qiita-image-store.s3.amazonaws.com/0/129662/428aefda-f396-5171-5d42-8226a2bb8c0c.png "Kobito.YKOIQK.png")

2. ここではテンプレートにすでに定義済みのサンプルを選択します。なお注意点としてOpen API 2.0（デフォルト）を選択します。3.0にはAPI Connectは2017/12/20時点、まだ対応していないため連携ができなくなります。
![Kobito.TNXiR6.png](https://qiita-image-store.s3.amazonaws.com/0/129662/e357d4d8-11ab-8ee7-f775-ed1c01109bda.png "Kobito.TNXiR6.png")

3. こんな感じです。
![Kobito.PQ49SZ.png](https://qiita-image-store.s3.amazonaws.com/0/129662/af649481-4c80-058a-4815-3f8b9e699938.png "Kobito.PQ49SZ.png")


## API Connectへデプロイ
1. ~~プラグボタンをクリックして連携先を追加します。~~
![Kobito.7MWQU9.png](https://qiita-image-store.s3.amazonaws.com/0/129662/9f74844e-63c2-c813-3f48-8229032aca2c.png "Kobito.7MWQU9.png")

2. ~~API Connectを選択して追加します。~~
![Kobito.xdU1lE.png](https://qiita-image-store.s3.amazonaws.com/0/129662/1ea52602-b814-558a-0610-42350c6fc904.png "Kobito.xdU1lE.png")

3. ~~IBM Cloudのアカウント情報を入れます。ID/PWを入れてValidate Credentialsをクリックすると、組織を選択できるのでIBM Cloudに設定してある組織を選択してCreate & Executeします。~~
![Kobito.WslQif.png](https://qiita-image-store.s3.amazonaws.com/0/129662/96c448b9-5ba7-f4a1-ef2d-7c3969c2e0cd.png "Kobito.WslQif.png")

![Kobito.hW9wMZ.png](https://qiita-image-store.s3.amazonaws.com/0/129662/95ef6b95-7a1a-15c8-71cc-123f1c4573da.png "Kobito.hW9wMZ.png")

１. [新しい方法] IBM Cloudで外部連携に必要なAPI Keyを取得しておきます。

* Manager => Access(IAM) => IBM Cloud API Keysと進み、Create an IBM Cloud API Keyをクリックして適当な名前をつけてCreate
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/4dd0a4ce-9344-6d0c-ad89-59bf8ba27463.png)

* 生成されたAPI Keyをメモ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/be8c427e-6256-3243-d043-c79274e3d756.png)

２. SwaggerHubに戻りAdd New IntegrationからManager Integrations => Choose Integration to AddからIBM API Connectを追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/2c56cc89-4704-5f00-7195-a06c03933b90.png)

* 名前を適当につけて、先ほど取得したAPI Keyを入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/9a52613a-f150-6529-e25a-6817a82c81de.png)

* AuthenticateをクリックするとIBM Cloud上の組織名が一覧に出てくるので選択してCreateまたはCreate and Executeを実行（Createだと連携の設定だけが作られ、ExecuteもするとAPI定義がAPI Connect上にデプロイされる）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/8aaaa2c5-fa65-deca-9a6e-ac00c475b731.png)


３.[ここからは同じ] IBM Cloudにログインしてデプロイ済みのAPI ConnectサービスのドラフトAPIを確認すると、先ほどのAPI定義がデプロイされていることがわかります。
![Kobito.FN58Jt.png](https://qiita-image-store.s3.amazonaws.com/0/129662/c05e6d01-3f60-c431-99b6-141c67b8853f.png "Kobito.FN58Jt.png")

４.API ConnectのAPI定義作成のGUI画面です。
![Kobito.8z4cP9.png](https://qiita-image-store.s3.amazonaws.com/0/129662/3dedd5b9-a95c-429b-1a1e-2d5aa3da3c83.png "Kobito.8z4cP9.png")

５.もちろんソースを直接編集も可能です。
![Kobito.mLtNQ8.png](https://qiita-image-store.s3.amazonaws.com/0/129662/94c73a8c-3d3b-6231-1bc9-9004358d11ce.png "Kobito.mLtNQ8.png")

６.API Connectで拡張できる定義としてはアセンブルというのがあります。バックエンドの内部APIを呼び出したり、複数のAPIの呼び出し結果をマッシュアップしたり、JSON↔︎XML変換したり、Gateway ScriptというECMAScript5.1ベースのスクリプトを仕込んだりすることができます。
![Kobito.yB7A9p.png](https://qiita-image-store.s3.amazonaws.com/0/129662/48331cce-0cd9-1ccc-30bd-0cc031f1f75d.png "Kobito.yB7A9p.png")

７.それではこのAPIを公開します。API Connectを使って公開することでIBM DataPower Gatewayを介してAPIコールができます。API Connectでは1~複数のAPIをグルーピングした「製品」と呼ばれる単位で公開します。製品タブから新規製品をクリックします。
![Kobito.FSE8RF.png](https://qiita-image-store.s3.amazonaws.com/0/129662/d93484de-7aeb-4560-9d35-203f083fd987.png "Kobito.FSE8RF.png")

８.適当な名前を入れて作成します。
![Kobito.UoAW2u.png](https://qiita-image-store.s3.amazonaws.com/0/129662/b7c827f4-d903-5eb7-ed81-14f625184629.png "Kobito.UoAW2u.png")

９.先ほど作成したAPIを追加します。＋ボタンを押すとAPIが選択できます。
![Kobito.sE2udJ.png](https://qiita-image-store.s3.amazonaws.com/0/129662/c963a95d-a29c-cf49-7cf6-78746b52fa6e.png "Kobito.sE2udJ.png")

![Kobito.EG37HI.png](https://qiita-image-store.s3.amazonaws.com/0/129662/35574eb0-7bda-7d55-0fda-474d80a8dbfb.png "Kobito.EG37HI.png")

 
１０.続いてプランを作成します。ここでいわゆるAPIの無料プランとか有料プランなどを設定できます。例えば時間単位でアクセスできるコール数やバースト制限をかけることができます。ただし有料プランを作るには、API Connectサービス自体が無償のライト・プランではなくて有償プランでデプロイしておく必要があるので、ここではできません。
ここでは以下のように無料プランで1分に100コールまでの制限を設け、制限に達すると指定した時間が経過するまで呼び出しができなくなるようにしています。TwitterなどのAPIレート制限を想像していただければとわかりやすいかと思います。
![Kobito.4jv0OS.png](https://qiita-image-store.s3.amazonaws.com/0/129662/0fa68622-8223-cdf3-2e9b-64d0c87a2112.png "Kobito.4jv0OS.png")

１１.他に必要な情報を入れたら右上の保存ボタンをクリックします。

１２.保存ボタンの左横の↑ボタンをクリックして公開します。デフォルトでは公開ターゲットとしてSandboxというカタログが設定されています。API Connectでは「カタログ」という単位のターゲットに対してAPIのグループである「製品」を公開します。カタログは自由に追加できます。どういった基準でカタログを作ってもよいのですが、例えば部門単位とか業務単位とかが考えられます。（部門Aカタログと部門Bカタログと分けて、それぞれの「製品」を管理、など）
![Kobito.6DcLTo.png](https://qiita-image-store.s3.amazonaws.com/0/129662/aa7739bb-5e07-aa38-4c10-37910b15fe86.png "Kobito.6DcLTo.png")

１３.まずはステージングされます。
![Kobito.cQWyVH.png](https://qiita-image-store.s3.amazonaws.com/0/129662/321acfe2-0548-b503-3a95-c7d08aa3db4d.png "Kobito.cQWyVH.png")

１４.API Connectのトップのダッシュボード画面に行くとSandboxカタログがあるのがわかります。
![Kobito.r6rjXr.png](https://qiita-image-store.s3.amazonaws.com/0/129662/62f3a58b-6e92-d9fd-83e9-1a1cdf259d92.png "Kobito.r6rjXr.png")

１５.Sandboxをクリックすると先ほどステージングした製品があるのがわかります。
![Kobito.UdaoGo.png](https://qiita-image-store.s3.amazonaws.com/0/129662/f81c7270-938c-b557-3b06-b6d20bd5bb46.png "Kobito.UdaoGo.png")

１６.メニューから公開をクリックします。
![Kobito.pwhZ7n.png](https://qiita-image-store.s3.amazonaws.com/0/129662/1bd46fe2-69c9-3409-d3db-19ca6fb60fe9.png "Kobito.pwhZ7n.png")

１７.可視性の編集という画面が出てきます。これは開発者ポータルというAPI利用者が閲覧・テストするためのAPI仕様公開するポータルサイトに対して、どのレベルで公開するかという設定です。ここでは閲覧は誰でもでき、サブスクライブするには開発者ポータルに登録して認証済みユーザーのみ、という設定にしています。
![Kobito.dn8RfU.png](https://qiita-image-store.s3.amazonaws.com/0/129662/c0fe9f13-93a6-3094-89b1-5b762b2e60f6.png "Kobito.dn8RfU.png")

１８.公開されました。
![Kobito.ercn7G.png](https://qiita-image-store.s3.amazonaws.com/0/129662/d1ea52a1-db77-d6cc-1a0a-4e6cdc755a77.png "Kobito.ercn7G.png")

１９.API Connectで付与されるエンドポイントはダッシュボードのカタログの設定のゲートウェイから確認できます。ホスト名(IBM Cloud API Connect共通）/ユーザー組織名/カタログ名というパスになります。sbはSandboxカタログのことですね。
![Kobito.rb4p3x.png](https://qiita-image-store.s3.amazonaws.com/0/129662/1e074450-9069-79c6-1d06-643438e12718.png "Kobito.rb4p3x.png")

２０.上記パスの後ろにAPI定義で設定した基本パスとパスを追加し、必要に応じてパラメータを入れてGETなりPOSTなりします。ここでは呼び出すバックエンドも何もないのでGETしても特に何もありません。

２１.分析画面に行くと、公開したAPIがどれくらいコールされたかとか応答時間とかエラー状況などをグラフィカルに見ることができます。
![Kobito.u61LU3.png](https://qiita-image-store.s3.amazonaws.com/0/129662/ecf971b5-8df2-326c-24ef-5dc6aab240db.png "Kobito.u61LU3.png")

２２.API Connectの開発者ポータルにAPIを公開するとこんな感じになります。先ほど公開した「製品」が表示され、含まれるAPIやプランの詳細が確認できます。サブスクライブ（配信登録）するにはログインが必要です。
![Kobito.h3qPfM.png](https://qiita-image-store.s3.amazonaws.com/0/129662/06554445-1d83-939a-0878-f92a6bf5625a.png "Kobito.h3qPfM.png")
![Kobito.HWdncn.png](https://qiita-image-store.s3.amazonaws.com/0/129662/80b16fc4-c0ff-4eb1-0e86-b195ef2fda08.png "Kobito.HWdncn.png")

２３.開発者ポータルのURLはカタログの設定からポータルのメニューで確認できます。デフォルトでは開発者ポータルは作成されないので、ポータルを選択して有効化しておく必要があるのでご注意ください（ここでは有効化済みです）。
![Kobito.atQ2yQ.png](https://qiita-image-store.s3.amazonaws.com/0/129662/224d4b3a-7a36-45e5-eabe-d789c719739b.png "Kobito.atQ2yQ.png")

# まとめ
以上でSwaggerHubで作成したOpen API定義をAPI Connectにデプロイして公開しました。

# 参考
* https://app.swaggerhub.com/help/integrations/ibm-api-connect
* https://swaggerhub.com/blog/swaggerhub-feature/ibm-api-connect-and-swagger/
* https://developer.ibm.com/wasdev/docs/design-deploy-openapi-microservices-swaggerhub-bluemix/