Alibaba API GatewayでAPIを作成する

#API GatewayでAPIの作成と動作確認をやってみた

##Alibaba CloudのAPI Gatewayとは
 Alibaba Cloudは世界にクラウドコンピューティングサービスを展開しています。Alibaba Cloudのサービスには、ビックデータを活用できる技術の提供、DDoS（Distributed Denial of Service attack）攻撃への対応策、CDN（Content delivery network）の構築など様々なものがあり、その公開されているサービスの中の一つに「API Gateway」があります。

API GatewayはAlibaba Cloud上に用意されているAPIのホスティングサービスで、APIを管理するための様々な機能が備わっている主に企業向けのサービスです（個人でも使用することは可能です）。各企業は自社で開発したAPI販売したり、逆に公開されているAPIを利用したりすることができます。需要側も供給側も双方に利益のある形で共有することができるので、結果企業は自社のビジネスだけに力を入れて取り組むことができるようになります。

今回このページではAPI Gatewayを利用して、APIの作成とその動作の確認（デバック機能を利用）をやってみました。

##API Gatewayに関して
###概要
 API GatewayはAPIの開発側がユーザー側にサービスやデータを供給することができます。そのため、開発側はAPIをユーザーに使わせることで収益を得ること、ユーザー側はサービスやデータを利用し自社のビジネスに役立てることが目的になります。そして、API Gatewayにはその目的を果たすための機能が数多く実装されており、主に以下のようなメリットを享受することができます。
####1．APIの管理を容易に行うことができる
API Gatewayを利用してAPIを管理することで、APIの定義、テスト、リリース、廃止などのマネジメントを一括でできるようになり、O&Mのコストを減らすことができます。また、モバイルやIotが発展してきたため、APIはそれぞれの端末向けに作る必要がありますが、API Gatewayを使うとより多くの端末向けにAPIを調節することが可能になります。
####2.サイバー攻撃対策の機能が豊富
HMAC認証、SSLによる暗号化通信、HTTPSプロトコルの導入、その他脆弱性への一通りのセキュリティ対策が揃っています。
####3.リクエスト数の調節ができる
分、時間、日ごとにAPIの利用を制限することができます。
####4.リアルタイムでログの監視を行える
リクエストの数やエラーの数をリアルタイムで監視し、異常値が出たらその情報をメールで受け取ることができます。


###APIを作成するには
APIを作成するには大きく分けて以下の4つの設定をする必要があります。

| No | 設定項目 | 詳細内容 |
|---|-----------------------------|------------|
| 1 | 基本情報                   | APIグループ、API名称など|
| 2 | リクエスト（フロントエンド）の定義 | プロトコル、パス、パラメータなど |
| 3 | バックエンドサービスの定義   | API Gatewayを使用して動作する実際のAPIを定義する。サービスのアドレス・パス、パラメータなど |
| 4 | レスポンスの定義            | API実行して返ってくる値のタイプの設定 |

重要なのはバックエンドサービスで、これは前もって用意しておく必要があります。バックエンドサービスとは、ユーザーがリクエストを投げて最終的にたどり着くAPIになります。API Gatewayの仕組みとして、まずユーザーのリクエストはまずAlibaba Cloud（API Gateway）に出されます。そこでリクエストをチェックし問題なければ、今度はAlibaba Cloudからバックエンドへリクエストが出されます。その後は、Alibaba Cloudにリスポンスが返り、最終的にユーザーにリスポンスが届くことになります。そのため、自社サーバーなどに用意したサービスをAlibaba Cloudでバックエンドサービスとして定義することでAPIを作成することができます。






##APIの作成手順
 API Gatewayで利用できるAPIを作るには、まずAlibaba Cloudのアカウントが必要になります。アカウント作成しログインした後、以下の手順でAPIを作成できます。

1.API Gatewayのページに遷移する
　ログイン後、ホーム（以下のページ）を開き、API Gatewayを選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/e26dc99a-e300-4d27-1a75-5ea9e5e1bda1.png)

2.APIグループを作成する
 APIグループを作成します。まず、APIグループのページを表示します。以下のページが表示されていない場合は、左の「API グループ」というタブを選択すると以下のページが表示されます（以下の例ではすでに一つAPIグループを作成済みのため、グループ名が「TestGrp」のデータが一つ作成されていますが、最初は何も表示されていません）。右上の「グループの作成」というボタンを押すとAPIグループが作成できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/bf3040b9-4bdf-fec4-e66c-67847727577c.png)

3.APIグループの入力
　「グループの作成」ボタンを押すと以下のポップアップが表示されます。ここで「グループ名」と「説明」を入力します。どちらも必須入力になります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/ec323ad0-f082-4dfa-4056-4983d5b235f8.png)

4.APIの作成
 APIグループの作成が終わったら今度はAPIを作成します。まず、左の「API」というタブを選択すると、以下の画面に遷移します。右に「APIの作成」というボタンが表示されているので、クリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/c7056c5f-1263-562d-9dad-83195351530e.png)

5.APIの基本情報を入力
　APIの「グループ」、「API名」、「セキュリティ認証」、「署名方式」、「説明」を入力します（すべて入力必須）。グループは「APIグループ」を作成していないと入力ができません。入力が完了したら、「次」ボタンを押下します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/af715861-ce0b-0717-ce7a-6dd68370137a.png)

6.APIリクエストの定義
　ここではAPIを呼び出す際のリクエストの情報（プロトコル、カスタムドメイン名、サブドメイン名、リクエストパス、HTTPメソッド、リクエストモード）を入力します。そして必要であれば、入力パラメータの情報も入力します（呼び出すAPIにパラメータを渡したい場合）。パラメータ名、パラメータ位置、タイプ（String、Int、Booleanなど）、必須（必須かどうか）、デフォルト値（必須ではない場合入力することができる）、例、説明を入力します。入力後、下の方にある「次」ボタンを押下します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/6f32e5fa-d4d9-c6b3-f48e-db7bdf47e6b8.png)

7.APIバックエンドサービスの定義
　以下の画面ではバックエンドサービスの設定を行います。自社APIを置いているサーバーのアドレスやそのリクエストパスなどを入力します。また、必要であれば、画面の下の方にある「バックエンドサービスのパラメーター設定」でパラメーターの設定も行います。ここで、フロントエンドパラメーターとバックエンドパラメーターを紐づけます。画像の例では、どちらのパラメーターも「timeDiv」としていますが、異なる名前でも紐づけることができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/5bf784c4-81a7-38e9-5fb1-71fd7a0c5c77.png)

8.レスポンスの定義
　最後に以下の画面でレスポンスを定義します。まず、「レスポンスのContentType」を選択しますJSON、テキスト、XMLなどから選択します。画像の例ではHTMLとしています。そしてレスポンスのサンプルを入力します。エラーレスポンスのサンプルは省略可能です。すべての入力が終わったら「保存」ボタンを押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/841bc298-86b2-c634-c53e-8b3200257e21.png)

これでAPIの設定が完了になります。

##作ったAPIの確認
　APIを作成すると以下のように「API」のタブで作ったAPIを確認することができます。詳細な内容を確認したい場合はAPI名をクリックします（リンクになっています）。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/d96ce6a0-e47b-7308-42ba-d8de17147296.png)

 API名をクリックすると以下の画面に遷移します。設定に間違いがなかったかどうかここで確認することができます。修正したい場合は画面右上にある「編集」ボタンを押下して内容を変更できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/58a7cdd4-46a0-e505-332a-e91123e27f8d.png)

##APIの動作確認（デバック機能を使用）
　作成したAPIの動作はAPIのデバック機能を使って確認できます。

1.動作を確認したいAPIの選択
　まず以下の画面でデバックしたいAPIを選択します（API名をクリックします）。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/a3b960fa-3e7b-5992-df64-d6a31be37f78.png)

2.APIをデバックする
　次に「APIのデバッグ」のタブを押下します。すると以下の画面が表示されます。画面中央にある「リクエストの送信」ボタンを押下すると、APIを実行することができ、レスポンスが画面右の黒い枠の部分に表示されます。APIを作成する際にQueryを設定している場合は、Queryの値を任意のものに変更することができるので、変更してから「リクエストの送信」ボタンを押下します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/21286bf5-592b-bc8a-d4da-4a869b1f1642.png)

リクエストの送信ボタンを押下すると以下のように結果が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/e75bbc92-36bd-bc28-2405-665d5d97d6d9.png)

今回は試しに以下のphpを埋め込んだhtmlをバックエンドサービスとして設定しAPIを作成しています。

■今回設定したサンプルのバックエンドサービスのソース

```
<!DOCTYPE HTML>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Example</title>
	</head>
	<body>
		<p>
		<?php
			$timeDiv = $_GET["timeDiv"];
			if ($timeDiv === '1') {
				echo date("y\/m\/d");
			} elseif ($timeDiv === '2') {
				echo date("y\/m\/d H:i:s");
			} else {
				echo "不正な値です";
			}
		?>
		</p>
	</body>
</html>
```

※今回用意した上記のバックエンドサービスの仕様
パラメータ「timeDiv」が1の場合は日付、2の場合は日時、それ以外の場合は「不正な値です」という文字列を表示するHTMLをレスポンスとして返します。


3.パラメータ値を変更してデバックした結果（レスポンス）
■「timeDiv=1（日付を表示）」のレスポンス
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/d75eb1a4-f217-4b9c-988d-4b96f186a605.png)


■「timeDiv=2（日時を表示）」のレスポンス
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/c81b724c-48cc-b89d-0b4c-a3abb863a252.png)


■「timeDiv=3（エラーを表示）」のレスポンス
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254913/5d4d4928-5f15-7245-c8df-41329d318bcf.png)



APIを作成し動作を確認したら、APIを公開して他のユーザーが利用できるようにします。そのためには、ドメイン名をグループにバインドする必要があります。その後、Cloud Marketplaceを利用してAPIを販売することができるようになります。