IBM API Connect 関連メモ - (1)既存REST APIの取り込み

# はじめに
API Connectはサービス呼び出しのためのAPIを管理するためのコンポーネントです。IBM Cloud上で提供されるものとオンプレ版がありますが、このシリーズではIBM Cloud上のAPI Connectを試してみた時の作業ログを記載していきます。
とりあえずAPI Connectのお勉強の手始めとしては製品が提供しているチュートリアルを中心にやっていきます。まず初回は既存のサービスのREST APIをAPI Connectに管理対象として取り込む操作をやってみます。

※基本的にはIBM Cloud上の無償枠の範囲で試しています。

## 関連記事

[IBM API Connect 関連メモ - (1)既存REST APIの取り込み](https://qiita.com/tomotagwork/items/d02f8e6092740b0e782f)
[IBM API Connect 関連メモ - (2)API Connectツールキットを使用したNode.jsアプリ作成(Loopback)](https://qiita.com/tomotagwork/items/7872ec8f99de57d7819a)
[IBM API Connect 関連メモ - (3)カタログ、開発者ポータルの構成](https://qiita.com/tomotagwork/items/da577551d7f4c50c4fd2)
[IBM API Connect 関連メモ - (4)各種APIの管理](https://qiita.com/tomotagwork/items/99e9b35227a0f80b2a91)
[IBM API Connect 関連メモ - (5)Secure Gateway経由でのz/OS Connectとの連携](https://qiita.com/tomotagwork/items/59e88b782bb72f1d0c1a)
[IBM API Connect 関連メモ - (6)API Connect-z/OS Connect間TLS接続](https://qiita.com/tomotagwork/items/c70b8566129e51c92423)
[IBM API Connect 関連メモ - (7)z/OS Connect 基本認証 + ID伝播](https://qiita.com/tomotagwork/items/38d41cbc01f92352f649)
[IBM API Connect 関連メモ - (8)z/OS Connect 連携におけるインターフェースの浄化](https://qiita.com/tomotagwork/items/0ec8d2224ad141756510)
[IBM API Connect 関連メモ - (9)z/OS Connect 連携まとめ](https://qiita.com/tomotagwork/items/a9fae53f02773a0c67b1)

# 参考情報
[IBM Cloud資料- API Connect](https://cloud.ibm.com/docs/apiconnect?topic=apiconnect-getting-started&locale=ja)
[Knowledge Center - IBM API Connect Version 5 documentation](https://www.ibm.com/support/knowledgecenter/SSMNED_5.0.0/mapfiles/getting_started.html)

# 事前調査
参考: [API Connect のパッケージ化戦略および用語](https://www.ibm.com/support/knowledgecenter/ja/SSMNED_5.0.0/com.ibm.apic.overview.doc/capim_overview_orgsprodsplansapis.html)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/85d9e5f4-263d-920d-45b5-160e37266377.png)

>レート制限は、あるプランのすべての操作で共有されるデフォルトのレートとして実装するか、API の特定の操作に対して設定できます。プランでは、API コンシューマーにさまざまなレベルのサービスを提供するために、異なるレート制限を使用できます。例えば、「デモ・プラン」は毎分 10 個の呼び出しのレート制限を適用し、「フルプラン」は毎秒 1000 個の呼び出しまで許可することができます。
製品は、一連の API とプランを、特定の使用を目的とした 1 つのオファリングにまとめてバンドルします。プランは製品内でのみ作成でき、その後、これらの製品はカタログ内で公開されます。 製品とプラン間の関係には、以下のルールが適用されます。
    - プランが属することのできる製品は 1 つのみです。
    - 製品には、それぞれに異なる API のセットが含まれる複数のプランを組み込むことができます。
    - ある製品内のプランは、別の製品内のプランと API を共有できます。
1 つの製品に複数のプランを組み込むことで、同じオファリングにそれぞれ異なるレベルのパフォーマンスを提供します。例えば、1 つの製品に、単一の API が使用可能な「デモ・プラン」と、複数の API が使用可能な「フルプラン」を組み込むことができます。


## 用語の整理

- **APIプロバイダー**: サービスを提供してそれをREST APIとして公開する人・組織
- **APIコンシューマー**: 公開されているREST APIを利用してアプリケーションを作成する人・組織
- **API**: 管理対象のサービスを呼び出すための仕様。上の図のAPI1, API2はあるサービスに対する関連するオペレーション(操作)をまとめたものを指す(恐らくSwagger文書でまとめられる単位など)。
- **プラン**: APIに対するアクセス制御や使用量を管理するための単位。
- **製品**: 複数のAPIとそれに付随するプランをパッケージングしたもの。
- **カタログ**: APIコンシューマーに対してAPIを提供する単位。製品をカタログに公開することでそのカタログに関連付いているコンシューマーに対してAPIが公開されることになる。製品を稼働させるランタイムのようなイメージ???。開発用/本番用など分ける目的で複数のカタログが使用される。カタログの設定で"開発モード"という設定があり、これを有効にしておくと競合する場合でもステージング、公開のアクションが強制的に実行される(デフォルトで提供されるカタログ"Sandbox"は開発モードが有効化されている)。
- **開発者ポータル**: APIコンシューマー向けに提供される、公開されたAPIについてのポータルサイト。APIコンシューマーはこのサイトからAPI仕様などが確認可能。開発者ポータルはカタログに紐づく。
- **ステージング**: 製品をカタログに登録する操作。ステージング後に公開処理を行うことで製品がコンシューマーに公開される。
- **アセンブル**: API呼び出しが行われた時にAPI Connect上で実行される様々なロジックを組み込むことができ、その処理をアセンブルと呼んでいる。アセンブルの基本的な構成要素として、バックエンドのサービスを呼び出すinvoke,proxyなどがある。API Connectに管理対象のAPIを登録すると、API Connectをプロキシーとして実サービスを呼び出すことになるので、登録したAPIのバックエンド呼び出し部分を**APIプロキシー**と呼んでいるようですが、この**アセンブル**がAPIプロキシーの実体と言えそうです。

## API ConnectへのAPI登録までの大まかな流れ

**(1) REST APIでアクセス可能なサービスの準備**
API Connectとは別に、管理対象となるサービスがどこかで動いていて、REST APIでアクセスできることがまず大前提です。
(Loopbackプロジェクトはここでは扱いません)

**(2) APIの定義**
管理対象のサービスがどういうAPI仕様でアクセスできるのかを明確にしておく必要がありあす。
SwaggerというAPI記述の標準があるので、その標準に従ってSwagger文書(yamlベース)にてAPIの仕様を記述するのが王道かと思います。通常はSwagger文書はサービスプロバイダーが提供することになります(API Connectとは関係なく...)。

**(3) 管理対象API仕様のAPI Connectへの取り込み**
管理対象のAPIについてSwagger文書が提供されていれば、それをAPI Connectにインポートすることができます。
Swagger文書が提供されていなければ、API Connect上で定義を作ることができます。

**(4) アセンブル(APIプロキシー)の作成**
API Connectでバックエンド・サービスのAPIを管理するということは、API Connectがプロキシーのような位置づけで動作するということになります。つまり、APIを利用するフロントのアプリからするとエンドポイントはAPI Connectとなり、API Connect上では受け取ったリクエストに応じてバックエンドの実サービスを呼び出すといことをする必要があります。この時、単純にプロキシーのようにパススルーでバックエンドにリクエストを投げることもできますし、各種ロジックを持たせることもできます。例えば以下のような目的でアセンブルが利用されます。

- 複数のサービスを結合して1つのAPIとして公開したい
- 操作(パス)毎に処理内容を変えたい
- メッセージ変換をしたい
- API実⾏時に任意のフォーマットのログを出⼒したい
- etc...

単純なパススルーでもアセンブルの作成は必要のようです。

**(5) "製品"単位の集約、"プラン"の設定**
管理対象のAPIをAPI Connect上に認識させたら、APIを公開するために"製品"という単位にまとめて、"プラン"を設定します。

**(6) "カタログ"への登録、公開**
"製品"を"カタログ"に登録(ステージング)し、公開処理をします。

**(7) 開発者ポータル整備**
カタログに紐づく"開発者ポータル"を作成し、APIコンシューマーの権限管理など整備します。

※当記事では(6)までの流れを確認しています。

# チュートリアル実施

## 既存REST APIの取り込み (Swagger文書ありのケース)

参考: [API 仕様のインポートと既存の REST サービスへのプロキシー作成 (IBM Cloud を使用する場合)](https://cloud.ibm.com/docs/apiconnect?topic=apiconnect-tut_import_openapi_rest_bm&locale=ja)

既にREST APIで呼び出せるサービスが存在し、そのAPIの定義がSwagger文書として提供されているケースを想定します。
Swagger文書をAPI Connectに取り込んでAPI Connectから接続テストを行うところまでをやってみます。


### API Connectインスタンスのセットアップ

参考: [API Connect インスタンスのセットアップ](https://cloud.ibm.com/docs/apiconnect/tutorials?topic=apiconnect-tut_prereq_set_up_apic_instance&locale=ja)

IBM Cloudにログインして、カタログからAPI Connectを検索し、API Connectのパネルを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/6b2fc994-424f-cd88-d2e9-ae30d927608e.png)

リージョンを選択し(東京は無かったので適当にシドニーを選択)、無料のLiteプランを指定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/1b77982f-e077-b348-9d13-adf5f037f322.png)

下の方にスクロール。サービス名とかその辺は適当に設定して「作成」！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/63c39269-4b57-c142-eefc-e55d07ddc056.png)

なんかできたっぽい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b5b5989d-a75d-f89e-6b90-d5d36331a3e3.png)

デフォルトで"Sandbox"という名前の"カタログ"(開発モード)が作成されています。

### 既存のサービスの確認
API Connectのチュートリアル用(?)として一般に公開されているサービスがあるようです。このサービスにはREST APIでアクセスできるし、Webの画面も提されています。まずはそのアプリを動かしてみます。

以下のリンクを開きます。
[Getting Started with API Connect](http://gettingstartedweatherapp.mybluemix.net/?_ga=2.149083765.2133757085.1590042185-341883975.1590042185&cm_mc_uid=31403922909515900396527&cm_mc_sid_50200000=52165731590126830845)

以下のようなWebの画面が開くので、LocationにUSのzip code(ここでは90210)を指定してGet Weatherボタンを押すと、そのzip codeの天気情報が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/41ac92a4-36e2-3592-6b2a-d6b48dc1c865.png)

このアプリにはREST APIでもアクセスできます。
ブラウザから以下のURLを指定してみます。
https://myweatherprovider.mybluemix.net/current?zipcode=90210
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/dc2533d7-4d1f-7852-05db-971abd8de988.png)
結果がJSONで返ってきました。

CURLで投げてもまぁ同じですね。

```
user01@DESKTOP-U7UON7M:/$ curl -X GET https://myweatherprovider.mybluemix.net/current?zipcode=90210
{"zip":10504,"temperature":57,"humidity":63,"city":"Armonk, North Castle","state":"New York","message":"Sample Randomly Generated"}
```

で、このサービスを呼び出すためのAPIの仕様は、Swagger文書として提供されています。
[weather-provider-api_1.yaml](https://raw.githubusercontent.com/IBM-Bluemix-Docs/apiconnect/master/tutorials/weather-provider-api_1.yaml)

### API仕様(Swagger文書)のインポート

API Connectインスタンスのダッシュボードの「>>」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/38e1e409-bb52-8757-a063-e91a38a0e57b.png)

ドラフトをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/1778c6ea-bfac-e832-f6f9-54a53d9d95d7.png)

APIタブから 追加-ファイルまたはURLからAPIをインポート を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/8677c416-02d2-b3d9-e4cd-f6fc5b2cc624.png)

またはURLからインポート...をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f3b84335-ed78-8307-af93-873aa43fba21.png)

上のSwagger文書のURL(`https://raw.githubusercontent.com/IBM-Bluemix-Docs/apiconnect/master/tutorials/weather-provider-api_1.yaml`)を指定してインポート。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/04053f35-9cf1-290c-3c90-ccdaffd02391.png)

API仕様がAPI Connectに取り込まれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/e62cb486-9da8-587c-f3d9-8317f7978c00.png)

<font color="red">ここで使用しているSwagger文書を見てみると、x-ibm-... という項目をふくんでいます。これはどうやらAPI Connect特有の拡張のようで、一般的なAPI仕様というよりはAPI Connectに取り込む前提で作られたSwagger文書のようです。API仕様取り込み後は実際にはアセンブルを作成することになりますが、その部分の記述もSwagger文書に含まれている状態でサンプルとして提供されているようです。</font>

### 取り込んだAPIを新規製品に追加、公開

アセンブルタブを開きます。
Swagger文書をインポートすると、バックエンドのサービスをパススルーで呼び出す単純なアセンブルが勝手に作成されています(元のSwagger文書に含まれて提供されている)。本来はここでアセンブルをカスタマイズすることになります。

右上のプルダウンメニューからデフォルト製品の生成をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/451e8705-c16e-109c-c6d8-975db2681ff7.png)

そのまま製品の作成！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/73136bcd-e488-b0ea-d443-4b1f505301cb.png)

右上に、「Sandboxにステージングしました」というメッセージが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/5adcf843-8bee-5e2f-175d-bd67d8c8a50e.png)

### API Manager テスト・ツール によるAPI呼び出しテスト

再生アイコンをクリックしてAPI呼び出しをテストします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/806f8eeb-0b23-977f-c092-69431cbd8872.png)

製品を選択して次へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/7a6821a3-33e7-293a-6155-1e28d15edfe5.png)

操作のプルダウンからget/currentを選択して呼び出し。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/4175389f-85bb-3a91-eb20-fcf8ffd14c81.png)

応答が返ればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/a095f358-3327-ad94-242a-72ef6f89bd34.png)

### 「探索」ツール によるAPI呼び出しテスト

右上の探索 - sandboxをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/6bab42fb-2903-d660-f6df-a04dcf9a3bab.png)

Weather Provider APIから、GET/currentを選択し、右側のペインのTry itを選択、zipcodeに10504を指定してCall Operationをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/edf91cf6-bec5-2714-e91f-7db75ecf3333.png)

結果確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/08c7bcc9-0765-4547-4e33-b09ce78cd06d.png)

これでweatherというサービスのAPIをAPI Connectに登録して呼び出せることが確認できました。



## 既存REST APIの取り込み (Swagger文書なしのケース)

参考: [API 仕様を追加して IBM Cloud で REST サービスを呼び出します。](https://cloud.ibm.com/docs/apiconnect?topic=apiconnect-tut_add_openapi_rest_bm&locale=ja)

既にREST APIで呼び出せるサービスが存在しているが、そのAPIの定義がSwagger文書として提供されていないケースを想定します。
この場合、API Connect上でAPIの定義を作成してあげる必要があります。
API Connectのインスタンスと、管理対象のサービスは上と同じものを使います。

### 新規API定義の作成

IBM Cloud上で、API Connectのダッシュボードから>>アイコンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ad3ef12d-e055-102e-1f0e-048a50f6b180.png)

ドラフトを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/e4e66ded-b430-3a49-3fcf-374e6461bdcf.png)

APIタブから追加-新規APIを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/6befa84f-431a-59b3-15d5-4b947e85ecca.png)

以下のように指定してAPIの作成をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/691fef3a-8d2c-79ba-c0e6-a6c3f2e19ca6.png)

定義 の右側の＋ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/29a990c0-e130-d1ca-b52f-e6679c8f5e8a.png)

名前にCurrent、タイプにObjectを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b828af20-1bfb-0de8-fa30-3e9c08bb384a.png)

プロパティーのところで、以下のようなフィールドの定義を作成し、定義が出来たら右上の保存ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/c16c4eb2-b260-5e1a-9485-137be0ec5e59.png)

同様にTodayの定義も以下のように作成して、完了したら保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/816fcfd3-bbaa-8e19-a715-9e2a06206306.png)

※ここで定義した2つのデータ構造は、weatherアプリのcurrent, todayのAPI呼び出しの応答データの構造を表しています。

左側のメニューからパスを選択し、＋ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/4ff911f2-fc8d-6d75-f927-c3d3e1ac9680.png)

パスに/currentを指定、パラメーターに 名前:zip, 場所:紹介, タイプ:string を指定、応答のスキーマにCurrentを指定し、保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/3d46d326-e75a-3a27-b1b1-d555a235280e.png)

Todayについても同じようにパスを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b6a3c6a3-d08a-1ac0-3449-35dd4bf03c02.png)

アセンブルタブを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/89f597cb-71ff-33c9-4240-81641923da5d.png)

デフォルトで定義されているinvokeを削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/167e214e-6b6f-77da-2479-c5b259856560.png)

操作の切替をドラッグ&ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/218ef73f-9d32-6d8f-6286-dff86e77592e.png)

追加した操作の切替をクリックし、右側のペインで、ケース0, ケース1にそれぞれget/current, get/todayを割り当てます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/a2fdb9d1-67a4-82e3-858a-2ce09b7b8579.png)

呼び出しをドラッグしてget/currentの下にドロップします。追加したオブジェクトをクリックして、右側のペインで、タイトルに「invoke-current」、URLに「`https://myweatherprovider.mybluemix.net/current?zipcode=$(request.parameters.zipcode)`」を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/bb1c7c7e-b7c6-5f0b-1206-331fbf3b3641.png)

完了したら保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/61220a51-49c2-ca7a-7da3-9410bf22bc73.png)


### APIを既存の製品に追加

右上のプルダウンメニューから、既存の製品への追加をクリック(先の手順で一度製品を作っているので、そこに追加することにします)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/934737ef-c9d7-3ad3-52b8-ab6254ca9b2f.png)

製品を選択して追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/24be3857-e0e9-e09a-b576-ef5c9312e25c.png)

### 製品をSandboxにステージング
すべてのAPIをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/7d2eefbd-cfb8-2e4c-aa23-fd5648a33b90.png)

製品タブからWeather Provider API productをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/48a7db77-c674-683f-de60-785852541e67.png)

上で追加したAPIが製品に含まれることを確認し、カタログにステージングするためのアイコンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/01dadf0d-20dd-6ff0-a7a1-639c3fbc0649.png)

Sandboxを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/11dde45a-bade-c523-24ca-4cf353dc8d25.png)

成功のメッセージを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/5c0f7c03-33a4-80e2-73b3-23266ab5fd9b.png)

### 製品を公開
ダッシュボードからSandboxを選択します。
製品の右側のプルダウンメニューから公開を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b3af6e46-30cf-6f83-374c-7ae840419e4b.png)

そのまま公開
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/dfa1f421-efa7-1189-c271-102e1b6f016f.png)

成功のメッセージを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/66785e04-735a-90f7-07cd-a4fe2e8a6ff4.png)


### API Manager テスト・ツール によるAPI呼び出しテスト

get/currentが実行できることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/c690770b-b555-8eaa-195b-c3aae41eee2b.png)


###「探索」ツールによるAPI呼び出しテスト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/fc8000d1-8bf2-27d0-daeb-780cdf55b287.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/8a914734-a34d-3564-ab6d-f75a6f363cea.png)

Responseが正常に返ってくることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b9df9f12-b8f7-c66a-c320-a73bfe8ff576.png)


# API Connect画面構造整理
IBM Cloud上のAPI Connectのサービスの画面の構造が最初分かりにくかったので整理します。

## トップメニュー
API Connectインスタンスに接続した時のトップメニューの構造は以下のようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/10787aef-b0cc-ab81-34f9-87c6b6bf0989.png)

### ダッシュボード(カタログの管理)
カタログに登録されている製品の管理など
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/bd9c13fb-9b24-bdcc-af45-4b4804e587a8.png)
カタログに紐づく開発者ポータルやロールの管理など
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/4f75efd3-ad93-1ed3-157f-05fcfaa7a861.png)

### ドラフト(API, 製品の管理)
製品に含まれるプランの管理など
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/2eaf91b2-e2a3-a492-8bc2-acf8cd841c8d.png)

APIの作成など
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f33acfa7-9efd-06f6-704d-0a5ba86189ec.png)