[GCP] Apigee触ってみよう

# 何のメモ
Apigeeを初めて触ってみたときの記録。

# どんな時に役立つ？
次回Apigeeを触る時にどんな感じだったかを思い出すのに使う個人的なメモ。

# Apigeeとは
公式：https://cloud.google.com/apigee/api-management/?hl=ja
自分まとめ：https://qiita.com/risa0320/items/8a01182a1756278f5f5a

# 触ってみる
## 参考にしたもの
公式で用意されていた「簡単な『Hello world』APIの実行」を手順に。
https://docs.apigee.com/api-platform/get-started/create-account
## 準備
### アカウント作成
まずはトライアルのアカウント作成。
https://login.apigee.com/sign__up?int_source=website&int_medium=pricing
アカウントを作成するとメールが届くので、そのままログインする。

APIプロキシを呼び出す際は以下の形式で。

```
https://your_org_name-[test|prod].apigee.net/path/to/resource
例）
https://ahamilton-eval-test.apigee.net/getstarted
```

## 本題
### APIプロキシを作成
次にAPIプロキシを作成する。
https://apigee.com/edge ログインし、[API Proxies]を押下。
[+ Proxy]ボタンでプロキシを作成できる。
最初にプロキシの種類が選べるので、[Reverse proxy (most common)] を選択して [Next] 。
<img width="1086" alt="スクリーンショット 2019-10-14 14.01.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380480/d6ff9a71-0637-f68e-a216-8a192e9b73ec.png">
プロキシの詳細設定ができる画面に来るので、以下を設定。
<img width="1075" alt="スクリーンショット 2019-10-14 14.14.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380480/00aa5e35-54a4-f155-2ce7-160da9a20dfa.png">

* **Proxy Name**
   * プロキシ名
   * すでに存在する名前では作成できない
* **Proxy Base Path**
   * APIに対するリクエストを行うために使用されるURLの一部で、適切なAPIプロキシにルーティングに使用される。
* **Existing API**
   * Apigee EdgeがAPIプロキシに対するリクエストで呼び出すターゲットURLを定義する
   * 「https://mocktarget.apigee.net」サービスを利用すると、 APIキーやアクセストークンを必要とせずApigee でホストされ、単純なデータを返す。
* **Description**
   * 任意で記入できる説明文

上記を設定したらNextボタンを押下し、次にセキュリティ設定を行う。
<img width="1075" alt="スクリーンショット 2019-10-14 14.16.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380480/0ce1c496-d555-d2dd-beea-1a2c6223479b.png">

Virtual Hosts画面では今回はデフォルトの設定のままNextボタン。

Build画面ではDeployが「test」になっていることを確認し、「Build and Deploy」ボタン。
Apigee は新しい API プロキシを作成し、それをテスト環境にデプロイする。
<img width="1070" alt="スクリーンショット 2019-10-14 14.29.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380480/d45271c9-9211-07d5-d17b-bd550a06ed8e.png">
<img width="1072" alt="スクリーンショット 2019-10-14 14.32.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380480/d45ff290-dd22-d0f5-50ca-86d0fd43e6a1.png">
「Exit」を押して、完了。

作成したAPIプロキシを押下するとAPIプロキシのOverViewページが見れる。
<img width="1077" alt="スクリーンショット 2019-10-14 14.35.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380480/2ca41988-c4aa-e97f-a764-c643bacaa67f.png">
URLの[+]ボタンを押下するとHTTP,HTTPSのURL両者が表示される。

### プロキシをテスト

* テスト方法
   * curl
   * Webブラウザ

作成したプロキシのURLにcurlを投げると、「Hello, Guest!」というのが返ってくる。
Webブラウザでも同様のレスポンスが返ってくる。
<img width="90" alt="スクリーンショット 2019-10-14 14.49.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380480/0778afcc-5a96-a6b9-541f-674c2358effa.png">

### ターゲットエンドポイントを変更
プロキシのポリシーを追加する前に、プロキシのデータを返すエンドポイントに変更する必要がある。
エンドポイント「 https://mocktarget.apigee.net 」ではデータを返さないため、XML を返すものにエンドポイントを変更してみる。
コンソールTOP画面から「API Proxy」を選択し、変更するAPIを選択する。
「DEVELOP」タブに変更し、
<img width="1077" alt="スクリーンショット 2019-10-14 14.56.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380480/27d83f1f-f2d7-f73d-f7b3-46087a9b2152.png">
API Proxy Editor が表示される。
Proxy Editor を使用すると、API プロキシの構造を表示して、そのフローを構成できる。
（別途チュートリアルありとのこと。）
<img width="1275" alt="スクリーンショット 2019-10-14 14.58.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380480/0ebe413c-87d1-dacc-2c22-2c663b512cce.png">
[Navigator] ペインで、[Target Endpoints] > [default] を選択すると
<img width="310" alt="スクリーンショット 2019-10-14 15.01.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380480/62b5457a-c0e7-6efc-48be-6fd287f831f7.png">
Edge の [Code] ペインにエンドポイント設定が表示される。（画面中央部分）
以下のように<URL>内のURLを末尾に「/xml」をつける。

```
    <HTTPTargetConnection>
        <Properties/>
        <URL>https://mocktarget.apigee.net/xml</URL>
    </HTTPTargetConnection>
```

これでXMLが返るようになるので[Save]ボタンで変更を保存。
変更内容は Edge によって保存され、自動的にデプロイされるとのこと。
エラーがある場合、Edge は変更内容を保存するが、プロキシはデプロイされない。
その際の解決法は以下。
> a.プロキシ構成を修正します。Edge で構文ガイダンスがポップアップ表示されることがあります。
> b.Edge で変更内容が自動的にデプロイされない場合、[Deployment] > [test] をクリックして、変更内容を test 環境に手動でデプロイします。

フローエディタの上にある [Deployment] プルダウンを選択して、プロキシが正常にデプロイされているかどうかを確認し、緑であればプロキシがその環境に正常にデプロイされている。
<img width="832" alt="スクリーンショット 2019-10-14 15.08.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380480/1f860b9e-eddd-c24d-74ea-13bf2f84b6f3.png">

以上で設定の変更は完了しているので、curlやWebブラウザを使ってレスポンスを確認する。

### ポリシーを追加
ポリシーとは、
> ポリシーは、API プロキシを介してメッセージ フロー内のさまざまなポイントに添付できる Edge コンポーネントです。ポリシーは、メッセージの形式の変換、アクセス制御の実施、リモート サービスの呼び出し、ユーザーの認可、潜在的な脅威に関するメッセージ コンテンツの調査など、多くのことを行うことができます。

今回は、XMLtoJSON ポリシーをプロキシに追加してみる。
このポリシーは、XML メッセージのペイロードを JSON に変換し、また、レスポンスの Content-Type ヘッダーも変更されるもの。

同様に、コンソールTOP画面から「API Proxy」を選択し、変更するAPIを選択。
「DEVELOP」タブに変更し、[Navigator] ペインで、[Proxy Endpoints] > [default] > [PreFlow] をクリック。
<img width="1098" alt="スクリーンショット 2019-10-14 15.18.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380480/a3469d77-ccc3-2a1f-e4cb-286ef6055cb3.png">
Edge にフローエディタの未加工バージョンと、Edge の [Code] ペインにはデフォルトのプロキシ エンドポイント構成が表示されので
[+ Step] ボタンを押下して、プロキシにポリシーを追加する。
フローに追加できるポリシーの分類リストが出てくるので、
[Mediation] カテゴリの [XML to JSON] ポリシーを選択。
<img width="740" alt="スクリーンショット 2019-10-14 15.21.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380480/7614673a-0c77-f61b-24f1-8d3ded92d93f.png">
デフォルト名のまま、[Add] を押下し、Edge で新しいポリシーがレスポンスの PreFlow に添付する。
> [Add] をクリックすると、Edge では次のことが行われます。
・[Navigator] ペインの [Policies] の下に新しいポリシーを追加します。
・XML to JSON ポリシーを [Flow] ペイン内に追加します。
・ポリシーの構成 XML を [Code] ペインに表示します。

[Save] をクリックして、現在のリビジョンを変更内容と一緒に保存。
<img width="1057" alt="スクリーンショット 2019-10-14 15.23.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380480/86f8702d-f0d1-1e31-8754-55bde5823f0a.png">
再度curlを投げてみると

```
<?xml version="1.0" encoding="UTF-8"?> <root><city>San Jose</city><firstName>John</firstName><lastName>Doe</lastName><state>CA</state></root>
```
XML形式だった内容が

```
{"root":{"city":"San Jose","firstName":"John","lastName":"Doe","state":"CA"}}
```
JSONに変わった。

## 感想
今回は5分でできる簡単なものをお試しとして作ってみたが、
簡単にGUIで設定を変えられたり、今回は載せなかったが「TRACE」タグでトレースが見れたり、
「OverView」タグでステータスなど全体像が見れるのはとてもいいなと思った。
近々、GCP上で Deep Learngin APIを実装しようとしているので、その際にはApigeeを是非使おうと思った。
またその時は記事書く。