IBM Cloud API Gateway（Legacy）経由でFunctionsを呼び出す

## はじめに
IBMが提供するAPI管理ソリューションというとAPI Connectですが、IBM CloudではそのAPI Connectに加え、よりシンプルに簡単にAPI公開ができるAPI Gatewayというサービスも提供されています。Legagyと付いたものと、無印のAPI Gatewayの２種類があるようです。Qiitaではまだ記事が見当たらないようなので、簡単に試す手順をまとめてみました。

## 前提
- IBM Cloud Liteアカウント（PAYGなど別アカウントがあればもちろんそれで可）
- FunctionsでHello WorldのサンプルがActionsとしてデプロイ済み
    - リクエスト・ボディにJSONで{"name": "xxx"}と入れると、その名前が入ったHello xxxが返り、ボディがないとHello Worldが返るサンプルです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/b06682f8-1a4a-59c8-4850-ced6e39b589a.png)
![スクリーンショット 2020-08-11 15.51.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/bc02d13f-3261-5b2f-f20b-eb45bc38ac01.png)

## 手順
1. API Gatewayサービスをまずデプロイします。
  - [以下](https://cloud.ibm.com/apis/api-gateway)から「Create service」をクリックし、サービス名とリソースグループを指定して作成します。
![スクリーンショット 2020-08-11 15.04.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/90ab6d8f-cd3d-c414-ba38-8240f4eb7423.png)
![スクリーンショット 2020-08-11 15.06.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/3e18e8ab-56d1-60a3-be65-d325639a1908.png)

2. Create an API using Cloud Functionsをクリックし、Create APIから呼び出すAPI定義を作成します。これによりLegacy API Gatewayが自動で作成されます。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/46c2c36f-d743-238b-c3f6-2aa891542183.png)
 ![スクリーンショット 2020-08-11 15.16.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/76c3cc20-fca2-5afc-beb7-50767b48ade5.png)

3. APIの設定を行います。
  - API名と基本パスを設定します。
  ![スクリーンショット 2020-08-11 15.16.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/15c000ff-fee2-b6d8-03a4-6ddb71f313a0.png)

  - パスとメソッドと既にデプロイ済みのFunctionsのアクションを選択します。GETとPOSTメソッドそれぞれにパスを設定します。
  ![スクリーンショット 2020-08-11 15.17.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/ccb1c229-ea14-6e62-4040-ea606a16a1f4.png)
  ![スクリーンショット 2020-08-11 15.53.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/79371076-c58b-6077-9ffd-679009f938a2.png)

  - セキュリティを設定します。ここではAPIキーを必須とします。またAPIキーを送信するための方法としてヘッダーを指定します。デフォルトでは悪名高い？X-IBM-Client-IDで、API Connect (V5ベース）だと変更できないのですが、このAPI Gatewayでは変更が可能になっているところがポイントが大きいです。
  ![スクリーンショット 2020-08-11 15.17.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/f243b7f4-a34d-d7a1-6560-4a19df727499.png)
![スクリーンショット 2020-08-11 15.18.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/cde70167-7b7f-3b7d-d168-dc8541ec1d73.png)

  - Rate Limitを設定します。ここでは1分に10回を超える呼び出しをするとエラーになるようにします。
![スクリーンショット 2020-08-11 15.18.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/9f470741-f255-a039-aebb-2794a6dfe883.png)
 
  - OAuthやCORSの設定はデフォルトのままにします。
![スクリーンショット 2020-08-11 15.18.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/1c44957b-0f0a-62bd-8a97-86a2755616df.png)

  - リージョン、CF組織、スペースを選択して保存します。
![スクリーンショット 2020-08-11 15.19.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/894fb45e-52ab-4c51-344e-1f0eec4e6d32.png)

  - 定義が完成し、エンドポイントができたことを確認します
![スクリーンショット 2020-08-11 15.20.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/e4d9a0a0-6aaf-c710-3180-b1d251dc41ad.png)

  - APIキーを作成します。Manage Sharing and API Keysから、Create API Keyをクリックし、キー名を入れて生成したらAPIキーの値をコピーしておきます。
![スクリーンショット 2020-08-11 15.21.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/481eca49-6af1-f235-3e37-7c488ffb6016.png)
![スクリーンショット 2020-08-11 15.22.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/9b7b1cb0-bfc0-64eb-9cff-97234c2ea6b8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/066e507a-a8f0-c62c-e3ab-fb5e71f9c7ef.png)

４. Review and Testの各パスのTry itタブから、Client IDにAPIキーを入れて、POSTとGETをそれぞれ呼び出します。GETの場合、200とともにFunctionsのサンプルで設定されているHello Worldが応答として返ります。POSTの場合、ボディに{"name": "Andy"}を入れてリクエストすると、Hello Andyが応答として返ることがわかります。
![スクリーンショット 2020-08-11 15.55.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/b92aab76-a394-1812-70f5-03ca16934e03.png)
![スクリーンショット 2020-08-11 15.52.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/20627031-d082-99c7-7091-0da5f4a855c8.png)
![スクリーンショット 2020-08-11 16.01.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/ca51d293-f374-82c0-3a57-c0b7bc7254f6.png)
![スクリーンショット 2020-08-11 16.02.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/c4e6e48c-0141-b1c5-538c-054b9d24ef1e.png)


５. Postmanから呼び出しても同様になることがわかります。
![スクリーンショット 2020-08-11 15.51.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/2582e34b-484b-5c3d-345f-f5e8acfd7280.png)
![スクリーンショット 2020-08-11 16.03.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/043d2c69-e698-3b62-bc16-909104c58845.png)

６. Rate Limitを超えると以下のように429エラーを返します。
![スクリーンショット 2020-08-11 15.33.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/d6249678-ecad-3445-1837-3444b3f0a200.png)

７. X-Client-IDヘッダーによるAPIキーをつけないと401エラーを返します。
![スクリーンショット 2020-08-11 15.33.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129662/6403ebb3-b83b-eb85-a12f-06ffdb90aa73.png)


## まとめ
以上で簡単にIBM CloudのシンプルなAPI Gatewayサービスで簡単にサンプルAPIを公開する手順をまとめました。次回はLegacyではないAPI Gatewayを試そうと思います。

## 参考
- [Connect digital applications and spur innovation](https://cloud.ibm.com/apis/overview)