Azure API Management【APi Gateway】


過去、Apigeeを利用してAPi Gatewayを作成しました。

APi Gateway Platform Apigee (1) XMLからJSONへのデータ変換
http://qiita.com/snomoto/items/3a68d5127e703505b23f

本記事においては、"Azure API Management"を利用してAPi Gatewayを作成してみようと思います。

アカウント作成

メールアドレスとパスワードを登録すると、PINコードが送られてくるので、それをコピペしてサインアップします。
https://azure.microsoft.com/ja-jp/services/api-management/

  • 基本的な、名前などの情報を入力します。
  • 電話番号を登録し、改めてAuthコードをSMSで受けとり入力します。
    (基本情報で入力する電話番号は固定電話ですかね?)
  • クレジットカードを登録します。残念なことに、クレジットカードを持ってない方は使えないですね。。

APi Managementリソースのアクティベーション

※ Azureでは様々なリソースが用意されており、それらのインスタンスを作成しアクティベーションする形で利用します。(個人的な理解

まず明らかにしておきたいのが、AzureにはAPiに関する2種類のサービスがあります。
- Azure API Management
- Azure API Apps

API Appsの方が新しくできたため、棲みわけなどについてはAPI Apps側の資料の方に詳しく書いてあります。下記のリンク先に図が書いてありますが、API AppsはAPi自体を構築するためのサービスで、すでに他のクラウド環境などでAPiを構築済みの場合は不要です。API Managementはその名の通り、APiの管理ツールであり、Gatewayを用いてAPiの統合や分析環境などを実現します。

https://docs.microsoft.com/en-us/azure/app-service-api/app-service-api-apps-why-best-platform#whats-the-difference-between-api-apps-and-azure-api-management

早速、Azure API Managementを利用してAPi Gatewayを作成してみましょう。


  

  • 公式のドキュメントがクラシックデザインを使えと言っているので、その通りにします。 2016年11月時点で、MSお得意のタイルデザインだとAPI Managementが(プレビュー)となっています。おそらく、新デザイン上で不具合でもあったのでしょう。クラシックデザインではプレビュー版ではありません。

API Management を使用するにあたって最初に行うことは、サービス インスタンスの作成です。Azure クラシック ポータルにサインインし、[新規]、[App Services]、[API Management]、[作成] の順にクリックします。
https://azure.microsoft.com/ja-jp/documentation/articles/api-management-get-started/#create-service-instance

  • クラシックデザインと新デザインで、微妙に選べるリージョンが違うような気がするのですが、バシバシ入力を進めていきます。

  • 作成時、アクティベーションにメッチャ時間がかかるので、気長に待ちましょう。。30分くらい??


翌日

出来たには出来たのですが、時間のかかり方が異常です。
無料試用版でやってたからかも知れないので、ちゃんと課金した状態で利用します。

改めてクラシックポータルにサインインしようとしたところ、出来なくなっていました。ドキュメントも微妙に変わっています。

API Management を使用するにあたって最初に行うことは、サービス インスタンスの作成です。 [Azure Portal][Azure Portal] にサインインし、[新規]、[Web + モバイル]、[API Management] の順にクリックします。
https://azure.microsoft.com/ja-jp/documentation/articles/api-management-get-started/#create-service-instance

なぜ[Azure Portal]を2回繰り返しているのでしょう。。。

  • とにかく、作成します。12月になってしまいましたが、未だにプレビュー版です。   
        
        

  • 必要な情報を入力します。

  
- そして待ちます。課金していれば早いでしょうか。。。


翌日

課金してる・してない関係ないぐらい時間かかりました。なぜ。。。
以下、無料試用版ではなく、課金可能状態であることを前提に作業します。

サンプルコードを走らせてみる

用いる環境については、以下のリンク先を参考に構築してみてください。
VMの用意(CentOS7、ApacheWebServer2.4、PHP7.1)

PHPだと"http_request2"を利用するので、PEARでインストールします。

termina
$sudo php71-pear install http_request2

開発者ポータルのページに移動します。
デフォルトで"Echo API"というAPiが存在していると思います。JSONデータであるリクエストbodyの内容を、XML形式に変換してくれます。
"Echo API"のページに各種言語でのサンプルコードがあると思います。(なんと親切な!)
更に、「Try it」の遷移先のページでは、APiの試し打ちができます。

  • PEARを使ってhttp_request2をインストールします。
    sudo php71-pear install http_request2

  • どこか適当なフォルダに、サンプルコードをコピペし{body}と{subscription key}を書き換えて実行します。

terminal
$ php71 sample.php
<Document><vehicleType>train</vehicleType><maxSpeed>125</maxSpeed><avgSpeed>90</avgSpeed><speedUnit>mph</speedUnit></Document>

JSONデータがXMLデータになって返って来ました。

APi Gatewayの作成

今度は、改めてQuick Startに例示されているように、APi Gatewayをインポートしてみます。Publisher Portalを開くとすぐにインポートへのリンクがあります。

編集画面が変わっているようです。Swagger仕様のJSONファイルを読み込ませます。

作成したら、「Products」から、作成したcalcのAPiを「Starter」に割り当てます。

「Starter」への紐つけが完了すると、Developer Portalの方にも反映されます。

単純な、四則演算を実装したAPiが無事にインポートされました。

アクセス制限をかける

ココカラ2016年12月5日追記

  • 何もしてない状態のEcho Apiを叩いてみる
terminal
$php71 echo.php 

<Document><vehicleType>train</vehicleType><maxSpeed>125</maxSpeed><avgSpeed>90</avgSpeed><speedUnit>mph</speedUnit></Document>

IPアドレスを利用したアクセス制限

「Policies」から、設定します。下図の上から順に設定してみてください。矢印の"CONFIGURE POLICY"をクリックすると、XMLを編集出来ます。

  • 特定のIPアドレスからだけ、アクセスを許容する。という設定を書き込みます。 レンジで範囲指定したい場合は、"from" "to"の行を利用してください。
sampleXML
<policies>
    <inbound>
        <base />
        <ip-filter action="allow">
            <address>指定するIPアドレスを入力</address>
        </ip-filter>
        <json-to-xml apply="always" consider-accept-header="false" />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
</policies>

これを「Save」で保存するだけです。
サーバからアクセス出来ることを確認したら、Developer Portalの方で「アクセスできないこと」を確認してみましょう。IPアドレスが許容されていないので、アクセス出来なくなっているはずです。

先ほどまではアクセス出来ていたのに、"403 Forbidden"に変わりました。
IPアドレスを利用したアクセス制限が出来ました。
別のサーバからも叩いてみます。

terminal
$ php71 echo.php 
{ "statusCode": 403, "message": "Forbidden" }

大丈夫そうです。

おわりに

ApigeeのようにGatewayに機能を追加するには、Publisher Portalの「Policies」から操作すれば良さそうです。
やはりBasic認証については、Apigeeと同じく御助け機能的な感じで、裏側にアクセスする際に上手くユーザ/パスワードを効かせてくれるものでした。そもそも、もうBasic認証なんて使わないで!という。。