Apigeeで基本的なAPI Proxyを作ってみた

# Apigeeとは？
Apigee Corp.は2004年にシリコンバレーで設立された企業であり、API管理プラットフォームの開発・提供をしています。設立当初はSonoa Systemsという企業名でしたが、2010年に社名を現在のApigee Corp.に変更しました。2016年10月にはGoogleに買収され、現在はGoogle Cloudのサービスの1つに取り込まれています。

今回は、API管理プラットフォームであるApigee Edgeの学習を兼ねて簡単なAPI Proxyを作成してみます。

## Apigee Edgeの無料アカウントの作成
Apigeeアカウントの料金体系やサービスの差異の概要は下表の通り。

|アカウントタイプ  | Evaluation    | Team         | Business     | Enterprise   |
|:------------:|:-------------:|:------------:|:------------:|:------------:|
|ユーザ数       | 1ユーザ、1環境  | 3ユーザ、2環境 | 5ユーザ、3環境 | 10 Organization/環境 |
|APIコール数/月  | 10万件        | 1500万件     | 3億件         | 100億件 |
|統計レポート    | 30日           | 60日        | 90日         | 12ヶ月 |
|ランタイムSLA   | なし           | 99.5%        | 99.9%        | 最大99.99％ |
|値段(月)      | 無料          | $500          | $2500         | 問い合わせ確認 |
|値段(年)      | 無料          | $1500         | $25000        | 問い合わせ確認 |

目的はApigee Edgeの基本を学ぶことなので、無料の評価用アカウントを作ります。
まずは、[Apigee](https://apigee.com/api-management/#/homepage)にアクセスし、右上の「FREE TRAIAL」を選択し、新規ユーザ登録画面を表示させ必要事項を記入します。

![image01.png](https://qiita-image-store.s3.amazonaws.com/0/177076/892782e4-4f9a-b2a8-8e61-5a37d974c366.png)

ちなみにCopmanyは任意なので特に記入する必要はないです。
その後、入力したメールアドレスにアクティベイト用のメールが届くので、メールに記載されているリンクを開くとアカウント登録は完了です。

## 各画面について
Apigee Edgeにログインすると、下のような画面が表示されます。

![image02.png](https://qiita-image-store.s3.amazonaws.com/0/177076/90dbb8e1-5560-31f5-cc09-60ef61dee562.png)

各サイドメニューとサブメニューは以下のとおりです。

* Develop
 - Specs：Swagger Editorを利用してAPIの仕様設計ができます
 - API Proxies：API Proxyの作成ができます
 - Shared Flow：トークン認証など複数のAPIで共通するポリシーをShared Flowとして設定することができます
 - Offline Trace：保存したAPIに対するリクエストからレスポンスまでのトレースができます
 - API Baas：Apigee Bassへのリンク
* Publish
 - Developers：開発者の追加削除ができます
 - Apps：開発者とAPIを紐づけ、認証情報などの設定が可能です
 - API Produces：複数のAppをAPI Productとしてまとめることができます
 - Portals：開発者向けのポータルページが作成できます
* Analyze
 - [API Proxy Performance](https://docs.apigee.com/api-platform/analytics/api-proxy-performance-dashboard)：API Proxyのトラフィックやレスポンスタイムなどの性能情報の確認ができます
 - [Cache Performance](https://docs.apigee.com/api-platform/analytics/cache-performance-dashboard)：Apigee Edgeのキャッシュ情報を確認できます
 - [Developer Engagement](https://docs.apigee.com/api-platform/analytics/partner-engagement-dashboard)：どの開発者から最もAPIが呼び出されているのかを確認できます
 - [Devices](https://docs.apigee.com/api-platform/analytics/devices-dashboard)：どういったデバイス、プラットフォーム、OSからAPIリクエストが投げられているのかを円グラフで確認できます
 - [Error Code Analysis](https://docs.apigee.com/api-platform/analytics/error-analysis-dashboard)：発生したエラーの割合などエラー解析に必要な情報が確認できます
 - [Geomap](https://docs.apigee.com/api-platform/analytics/geomap-dashboard)：どの国からAPIリクエストが投げられているのかを地図上に表示してくれます
 - [Reports](https://docs.apigee.com/api-platform/analytics/custom-report-dashboard)：APIに関するレポート情報をカスタマイズして表示させることができます
 - [Target Performance](https://docs.apigee.com/api-platform/analytics/endpoint-performance-dashboard)：Target APIへのトラッフィクやレスポンスタイムなどの性能情報が確認できます
 - [Traffic Composition](https://docs.apigee.com/api-platform/analytics/traffic-composition-dashboard)：開発者やアプリ、APIプロダクトごとのトラッフィク量を比較ができます
* Admin
 - Users：Organizationへのユーザ登録・管理ができます
 - Roles：Organizationへのカスタムロールの追加やユーザへのロール割り当て状況が一覧で確認できます
 - Virtual Hosts：バーチャルホストの情報確認・設定ができます。また有償アカウントの場合は、ホストの追加も可能です
 - Environments：デプロイ環境の詳細設定ができます
 - [Audit Logs](https://docs.apigee.com/api-platform/debug/view-api-history)：APIのデプロイ履歴、App/API Productのアップデート履歴などを確認できます
 - [Privacy & Security](https://docs.apigee.com/api-platform/faq/privacy-security-settings)：General Data Protection Regulation(EU一般データ保護規則) の対象となる場合に、「Data Protection Officer」や「EU Representative」を設定することができます。また、ApigeeサポートチームにAPIのトレースツールの利用許可を与えることができます
* Learn
 - Community：コミュニティサイトへのリンク
 - Docs：公式ドキュメントへのリンク
 - Support：サポートポータルサイトへのリンク
* Send FeedBack：フィードバックを送信できます

# 本題：API Proxyを作ってみる
というわけで実際にAPI Proxyを作ってみます。作るにはターゲットとなるAPIが必要なので、NHKが提供する番組表APIを利用することにします。
NHK番組表APIの詳細な仕様はNHKの番組表API公式ページに記載されているため割愛、詳細が知りたい方は[こちら](api-portal.nhk.or.jp/ja)へ。
今回は「 http://api.nhk.or.jp/v2/pg/list/130/g1/2018-09-16.json?key=払い出したAPIキー 」のをターゲットとしたリバースプロキシを作成し、いくつかの機能を後付けで追加していきたいと思います。

## その1 : API Proxyの作成
まず初めに、サイドメニュー「Develop」から「API Proxy」を選択し、右上の「+ Proxy」ボタンを押します。
すると、API Proxy作成画面が表示されるので、画面の「Reverse proxy」を選択して「Next」ボタンを押し、詳細入力画面に遷移します。

![image03.png](https://qiita-image-store.s3.amazonaws.com/0/177076/8598f94d-6bcf-f93b-6ccd-8cd0ac6b1902.png)

詳細入力画面ではプロキシ名、APIのURLなど必要事項を入力し、「NEXT」ボタンを押しセキュリティ設定画面に進みます。

![image04.png](https://qiita-image-store.s3.amazonaws.com/0/177076/9dcf8c55-436b-9a70-0957-1ec3921296df.png)

セキュリティ設定画面では、認証やCORS設定などを行いますが、これらの設定はあとからでも追加できるので今回は「Pass through」(設定なし)とします。
![image05.png](https://qiita-image-store.s3.amazonaws.com/0/177076/49cc87a7-b82d-87bc-944c-4e7b91ec167a.png)

次に、API Proxyをデプロイした際にバインドされるバーチャルホストを指定します。特にバーチャルホストを指定する必要はないので、default、secureの両方にチェックを入れた状態で「NEXT」ボタンを押します。
![image06.png](https://qiita-image-store.s3.amazonaws.com/0/177076/51b6f367-e50f-1aee-7a35-c403bee6189c.png)


最後に、API Proxyのビルド&デプロイします。デプロイ環境はprocとtestを選択できますが、今回はtest環境にのみチェックを入れ、「Build and Deploy」を実行します。

![image07.png](https://qiita-image-store.s3.amazonaws.com/0/177076/7a68e078-7d34-47e1-db01-d4d334f393c0.png)

ビルド&デプロイ成功です。

![image08.png](https://qiita-image-store.s3.amazonaws.com/0/177076/91917609-be42-dd5e-1d26-1c4acf573106.png)

最後にデプロイしたAPI ProxyのURLをRestClientで実行させてみます。URLは「Develop」->「API Proxies」->「NHK-Program-Proxy」を開くと確認できます。下図が実行結果になりますが、NHKの番組情報がリスト形式で取得できることが確認できました。どうやら2018/09/18に大相撲秋場所があるみたいですね。
![imgae09.png](https://qiita-image-store.s3.amazonaws.com/0/177076/c6ec0cad-27ba-2fde-3b95-47e73c1d60c1.png)


というわけで、結構さっくりとAPI Proxyを作ることができました。

## その2 : JSON to XML 変換機能の追加
NHKの番組表APIはJSON形式のみ対応していますが、アプリによってはXML形式のほうが嬉しい場合もあるかと思います。そんな時は「JSON to XML変換機能」を利用するだけで、簡単にApigee側でXML形式に変換してくれます(同様にXML to JSON変換も可能)。**その2**では**その1**で作成したAPI Proxyに対して「JSON to XML 変換機能」の追加を行ってみます。

まずはじめに「Develop」->「API Proxies」->「NHK-Program-Proxy」を選択してNHK-Program-ProxyのOverviewを表示させます。
OverViewにはAPI Proxyの概要が表示され、右端の「DEVELOP」タブを選択することでAPI Proxyの細かな設定が行えます。

![image10.png](https://qiita-image-store.s3.amazonaws.com/0/177076/d82d2896-c828-edaa-8f20-743ecf57743c.png)

DEVELOP画面では下図のような画面となっており、API Proxyに対して細かな設定や機能追加等がGUIから行えます。
細かな用語説明は別の方が[Apigee Edgeの用語解説とポリシー機能一覧](https://qiita.com/komikoni/items/088f67007395d84b8962)で解説されているのでそちらを読んでください。
今回はNHK番組表APIのレスポンス結果を加工するので「Target Endpoints」の「PreFlow」を選択し下図の赤い枠で囲まれた「+Step」ボタンを押します。

![image11.png](https://qiita-image-store.s3.amazonaws.com/0/177076/1093cf30-975e-ea73-e30a-11ff3456b9b8.png)

「+Step」ボタンを押すとポリシー追加画面が表示されます。
今回は「JSON to XML 変換機能」の追加が目的なので、「JSON to XML」を選択します。

![image12.png](https://qiita-image-store.s3.amazonaws.com/0/177076/3169744f-c534-eb1a-09ad-e20769a32643.png)

追加すると、Flow画面に追加された機能がアイコンとして表示されます。
また、Code画面の「Preflow」のResponseにJSON-to-XMLも自動で追加されます。
![image13.png](https://qiita-image-store.s3.amazonaws.com/0/177076/2b35fc79-4aac-c2fd-347a-5415a9c3b2a0.png)

機能追加ができたのでAPI Proxyを保存します。
保存する際は「Project」->「Save as New Revision」を選択すると、新しいリビジョンとしてAPI Proxyが保存されます。
また、確認ダイヤログが表示されるので[OK]ボタンを押します。
![image14.png](https://qiita-image-store.s3.amazonaws.com/0/177076/466749c6-e22f-b749-9c01-8cb8fd7a42b4.png)

API Proxyを保存すると画面上部の数字(リビジョン番号)が1から2に変更されます。
次に「Deployment」->「test」で保存したリビジョンをtest環境にデプロイします。
![image15.png](https://qiita-image-store.s3.amazonaws.com/0/177076/9f227d7b-6578-e8d5-c937-9ec5abd4c87a.png)

**その1**同様にRestClientで実行させてみたところ、レスポンス結果JSONからXMLに変わったので「JSON to XML 変換機能」の追加は成功です。
![image16.png](https://qiita-image-store.s3.amazonaws.com/0/177076/3e7f224c-2be2-2099-ba4e-33e4ac27d9a8.png)


## その3 : API Keyによるアクセス制御の追加
基本的にAPIにはそのAPIの利用者やアプリを制限するための暗号鍵をAPIのパラメータやHeaderに埋め込んで渡すのが一般的です。
そのため、**その2**で作成したAPI Proxyの利用者を制限するために、APIキーを設定します。

### その3-1 : ポリシーの追加
こちらの[公式サンプル](https://github.com/apigee/api-platform-samples/tree/master/sample-proxies/apikey)を参考にして進めていきます。
サンプルによると必要となるのはAPI Keyの検証を行う「Verify API Keyポリシー」と検証後に受け取ったAPI Keyをリクエストフローから削除する「Assign Messageポリシー」の2つなので、これらの機能を**その2**と同じ要領で追加していきます。
まずは、DEVELOP画面を開き「PreFlow」->「+Step(右上)」を選択し、「Verify API Keyポリシー」「Assigen Messageポリシー」を追加します。
![image17.png](https://qiita-image-store.s3.amazonaws.com/0/177076/0175e0ff-95f0-1d2f-652e-827b525425ee.png)

追加後は下図のように表示されます。
(「Assigen Messageポリシー」の名前はわかりやすいように「Remove Query Param」としています。)
![imgae18.png](https://qiita-image-store.s3.amazonaws.com/0/177076/25102ea0-cae2-6dff-40bd-65530e14f73b.png)

次に追加した「Remove Query Param」を下記の通り修正します。
XMLは「Navigator」->「Policies」->「Remove Query Param」を選択すると表示されます。

```xml:Remove-Query-Param.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage name="Remove-Query-Param">
    <DisplayName>Remove Query Param</DisplayName>
    <Remove>
        <QueryParams>
            <QueryParam name="apikey"/>
        </QueryParams>
    </Remove>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <AssignTo createNew="false" transport="http" type="request"></AssignTo>
</AssignMessage>
```

あとは**その2**同様に、新しいリビジョンとして保存します。

### その3-2 : APIキーの発行
ポリシー追加により、APIキーがないと番組表を取得することができなくなりました。
なので、作成したAPI Proxyに対応するAPIキーを発行します。

まずは開発者を登録します。
「Publish」->「Developers」->「+Developer」を選択し、テスト用の開発者を追加します。

![image19.png](https://qiita-image-store.s3.amazonaws.com/0/177076/5c6f0f05-c695-add0-5f2e-c304981b5004.png)

次に、「Publish」->「API Products」->「+API Product」を選択し、API Productを作成します。
API ProductのResourcesには作成したAPI ProxyのNHK-Program-Proxyとリビジョンを指定します。

![image20.png](https://qiita-image-store.s3.amazonaws.com/0/177076/7f296b5e-3b8a-dcf2-c4c7-084dc5564524.png)


「Publish」->「Apps」->「+App」を選択し、登録したユーザとAPI Productを紐づけたDeveloper Appとして登録します。
Developerに先ほど作成したTestUserを、CredentialsにNHK-API-Productを設定して保存します。

![image21.png](https://qiita-image-store.s3.amazonaws.com/0/177076/e5c8b01c-f943-d281-8212-c6e90dd6c58f.png)

これでCredentialsのConsumer KeyにAPIキーが登録されたので、API Proxyを実行する際に「?apikey=登録されたAPI Key」をつけてやれば番組表が取得できます。

![image22.png](https://qiita-image-store.s3.amazonaws.com/0/177076/cfe31522-0200-74a2-d609-53875c948b12.png)

実行結果です。
まずは**その1**、**その2**同様にAPI Keyなしで実行してみたところ、「Verfy API Keyポリシー」で「！」マークがついており、レスポンス結果も401となっていることから認証エラーとなっていることがわかります。

![image23.png](https://qiita-image-store.s3.amazonaws.com/0/177076/d918fd05-63f6-24f5-9196-961e647c1897.png)

次にAPIキーありの実行結果です。
HTTPステータスが200となっており正常に動作しています。

![image24.png](https://qiita-image-store.s3.amazonaws.com/0/177076/0a67b99f-6a2a-ac77-a532-4ebf7bc1200a.png)

# その他参考情報
* [Apigee.com](https://apigee.com/api-management/#/homepage)
* [[TechCrunch] Google、API開発の上場企業、Apigeeを6億2500万ドルで買収へ](https://jp.techcrunch.com/2016/09/09/20160908google-will-acquire-apigee-for-625-million/)
* [[Google Cloud] APIGEE API プラットフォーム](https://cloud.google.com/apigee-api-management/?hl=ja)
* [Verify API Key policy](https://docs.apigee.com/api-platform/reference/policies/verify-api-key-policy)