はじめに

今回はAzureが提供するAPIゲートウェイサービスである「Azure API Management」について説明します。サービスの中心的な機能であるAPIゲートウェイの概念について説明し、API Managementの特徴と使い方について説明していきます。

APIゲートウェイとは

APIゲートウェイとは、RESTful APIに代表されるWeb APIを使ったアプリケーション間連携のためのアーキテクチャのひとつです。ゲートウェイという名前の通り、データを要求するクライアントとデータを提供するサーバーの間に位置しており、サービスが提供するAPIを一括で管理し様々な処理を仲介する役割を担っています。例えばマイクロサービスアーキテクチャのように、一つの処理がクライアントから各マイクロサービスのAPIを数回に渡って呼び出すことで成立するようなケースでは、クライアント側で各APIの管理を行う必要が出てしまい、クライアント側のコードが煩雑になってしまいます。APIゲートウェイを導入することで、クライアントはAPIゲートウェイに対して1回だけAPIの呼び出しを行い、APIゲートウェイ側に各マイクロサービスへのAPI呼び出しを委ねることができます。
また、APIゲートウェイは様々なプロトコルでサービスとやり取りを行うことができるため、APIゲートウェイを配置することでこれまでWeb APIとして公開することができなかった、企業やサービスが持つデータ資産をAPIとして世界に公開することができ、企業の価値を高めることができます。

クライアントとサーバーが直接やりとりするAPI連携の課題点

APIゲートウェイの必要性を理解するためには、クライアントとサーバー間で直接APIのやりとりを行う、従来の連携方法における課題点を知る必要があります。
直接連携する場合、クライアントとサーバー双方において自ら解決すべき課題が生じます。まずクライアント側では、複数のAPIの呼び出し方(URLやプロトコル等)の違いを考慮した実装をする必要があるため、API呼び出しの管理コストが増大します。
また一度の操作で複数のAPIを呼び出す必要がある場合は、エラーハンドリングをクライアント側に組み込む必要が出てきてしまいます。
サーバー側では各APIに対する認証・認可や監査の設定といったセキュリティ面での保護やクライアントのAPI使用量制限などAPIの健全性を保つ仕組みを自前で構築する必要があります。

APIゲートウェイの導入によりクライアントとサーバーを分離し、APIにまつわる横断的な検討事項をAPIゲートウェイに集約することで、クライアントとサーバーは本来の責務に集中することができるようになります。

APIゲートウェイの機能

APIゲートウェイが有する機能は多岐に渡り、その中から必要なものを選択して利用していくことになります。APIゲートウェイの機能は以下の3パターンに分類することができます。

・ルーティング
APIゲートウェイは、ルーティング機能を提供することで、複数のAPIの中からクライアントが指定したAPIへと要求を渡すリバースプロキシサーバー(クライアントとサーバーの中間に位置して負荷を肩代わりするサーバー)として機能します。これによって、クライアントに対して単一のエンドポイントを提供することができ、クライアントとAPIの結合を疎に保つことができるようになります。
以下の図では、異なるクライアントからの異なるAPIリクエストをAPIゲートウェイが受信し、適切なバックエンドAPIにルーティングを行っている様子を表しています。

  • APIゲートウェイによるルーティング

    APIゲートウェイによるルーティング

APIゲートウェイ内部にあるURLの対応表(ルーティングテーブル)によってAPIゲートウェイが公開するAPIのパスとバックエンドAPIのパスを異なるものに変更することも可能となっています。

・APIの集約
APIゲートウェイを使用することにより、複数のAPI呼び出しを1回に集約できます。クライアントは一つのAPIを呼び出すだけになり、APIゲートウェイ側で各APIの呼び出しを実行して結果をまとめてクライアントに返却します。これによって通信回数を削減でき、またクライアント側でのエラーハンドリングの実装を削減することができます。
以下の図では、クライアントからの1回のリクエストに対してAPIゲートウェイが2つのバックエンドAPIを呼び出しています。

  • APIゲートウェイによるAPIの集約

    APIゲートウェイによるAPIの集約

・横断的機能の集約
APIゲートウェイに横断的な機能を集約することで、これまで各自で実装する必要のあったさまざまな機能をAPIゲートウェイにまとめられるようになります。APIゲートウェイに集約できる横断的機能には、以下のようなものがあります。

APIゲートウェイが提供する横断的機能の例

機能 内容
SSLターミネーション クライアントとAPIゲートウェイ間の通信をHTTPS化し、APIゲートウェイから各APIの呼び出しはHTTPで行う
認証 各APIを利用することができるユーザーを制限
ホワイトリスト登録 IPアドレスなどによってAPIにアクセスすることのできるネットワークを制限
流量制限 クライアントに対してAPIの呼び出しレートの制限を設定し、負荷を調整
ログの記録と監視 アクセスログの収集と監視
レスポンスのキャッシュ APIのレスポンスをキャッシュしてスループットを向上
Web Application Firewall(WAF) アプリケーションレベルでの解析を行うファイアウォールを設置
GZIP圧縮 コンテンツを圧縮してネットワーク負荷を抑える
静的コンテンツの処理 画像などの静的コンテンツを保持

これらの横断的な機能を各サービスに実装するのは骨が折れる作業ですが、APIゲートウェイを挟むことでこれらの構築や設定を一括管理することができるようになります。

APIゲートウェイのユースケース

APIゲートウェイの利用シーンには、以下のものが挙げられます。
・デジタル資産の公開 企業が保有するデータやサービスといったデジタル資産をAPIとして公開し、多くのクライアントに提供することでデジタル資産の価値を高めることが期待できます。APIゲートウェイを利用することで、一貫した形式でのデータの提供ができたり、認証・認可機能によってアクセスできるデータの範囲を制限できるようになります。

・APIのマネタイジング
価値の高いデジタル資産であれば、APIに利用料金を設けることでマネタイジングを行うことも可能です。APIゲートウェイが提供するログ記録と監視機能によって課金のしくみを設けたり、流量制限によって利用プランに応じたデータ量の調整などが可能となります。

・多様なクライアントデバイスのサポート
スマートフォンやタブレットなどのモバイルアプリケーションからのデジタル資産へのアクセスもAPIを提供することにより可能となります。またデバイスの増加によるアクセス数の増加に対しても、APIゲートウェイのスケールや流量制限を設けることによって柔軟に対応できます。

・クラウドサービスの管理
企業やサービスがシステムの一部としてクラウドサービスを利用している場合、クラウドサービスを管理するためにAPIゲートウェイを活用できます。大抵のクラウドサービスは管理用のAPIを提供しているため、仮想マシン(VM)インスタンスの起動・停止などのオペレーションやオートスケールの設定などをAPIから行うことができます。APIゲートウェイと組み合わせることで、クラウドサービスの操作や監査といった管理を一本化することができます。

Azure API Managementとは

Azure API Managementは、Azureが提供するAPIゲートウェイのサービスです。API ManagementはAzure上でPaaSの形態で提供されており、Azureポータルに統合されている管理コンソールからAPIの設定や管理を行うことができます。

Azure API Managementの構成

API Managementには大きく分けて2つのロールが存在します。APIの作成や公開などを行う「管理者」とAPIを利用する側の「開発者」です。管理者は作成した1つ以上のAPIをまとめ、「成果物」としてAPIの製品化を行います。開発者はこの成果物に含まれているAPIを利用してアプリケーションを構築することができます。

また、API Managementは以下の3つの主要なコンポーネントから構成されています。

・APIゲートウェイ
前項で説明したAPIゲートウェイとしての機能を提供する、API Managementの中核となる機能です。APIリクエストを集約して、バックエンドサービスにルーティングする基本機能はもちろんのこと、認証・認可や流量制限、監視、分析などの横断的機能を備えています。

・Azureポータル
管理者がAPIをセットアップするために、Azureポータルを使用します。具体的には、APIスキーマの定義やインポート、APIの製品化、APIのポリシー設定、分析、ユーザー管理などを行います。

・開発者ポータル
Azureポータルとは別に、API Managementは開発者用のポータル画面を提供しています。開発者ポータルではAPIのドキュメントの参照やAPIのテスト、APIキーの取得などを行うことができます。

Azure API Managementを使ってみる

ここからは実際にAPI Managementを操作しながら、APIの公開を行っていきます。

API Managementの作成

まずは管理者として、Azure上にAPI Managementのサービスを新規作成します。Azureポータルにログインし、左側のメニューから「すべてのサービス」を選択し、検索フィールドに「api」と入力してAPI Management サービスを選択します。

  • 「すべてのサービス」からAPI Management サービスを選択する

    「すべてのサービス」からAPI Management サービスを選択する

選択後、画面下部の「API Management サービスの作成」ボタンからサービスの新規作成画面に遷移します。

  • 「API Management サービスの作成」を選択する

    「API Management サービスの作成」を選択する

新規作成画面で必須項目を入力していきます。「名前」には任意の名前を入力します。ここで入力した名前がAPIゲートウェイとして公開されるエンドポイントURLとなります。
「サブスクリプション」には、自分のサブスクリプションを選択します。「リソースグループ」、「場所」は任意のものを、「組織名」は開発者ポータルやメールでの通知に使用される名称です。任意の分かりやすい名称を入力します。「管理者のメールアドレス」にはデフォルトでは現在Azureにログインしているユーザーのメールアドレスが入力されています。管理者となる方のメールアドレスを入力します。最後に「価格レベル」ではAPI Managementの利用プランを選択します。今回はサンプルのため「開発者」プランを選択します。

  • API Management サービスの新規作成

    API Management サービスの新規作成

必須項目の入力が完了したら「作成」ボタンを押して、API Management サービスの作成を開始します。作成には少々時間がかかりますが、完了すると管理者宛にメールで通知されるのでしばらく待ちます。 作成が完了すると、Azureポータル上からAPI Management サービスのダッシュボード画面に遷移することができます。

  • API Management サービスのダッシュボード画面

    API Management サービスのダッシュボード画面

APIの定義

続いてAPIの定義を行っていきます。今回はAPI Managementから呼び出されるバックエンドAPIとして、Microsoftからサンプル用として提供されている「カンファレンスAPI」というAPIを利用していきます。このAPIは、技術カンファレンスのセッション内容やトピック、講演者などの情報を取得することができるサンプル用のAPIです。 サービスのダッシュボード画面上のメニューから「API」の項目を選択すると、APIの追加画面が表示されます。この画面では、様々な方法でAPIをAPI Managementに追加することができるようになっています。今回はカンファレンスAPIの仕様がOpenAPI(RESTful APIを記述するための標準フォーマット)形式で公開されているため、「OpenAPI specification」を選択します。
OpenAPI以外には、WADL(REST APIの定義書)やWSDL(SOAP APIの定義書)といったXMLベースで記述された定義書であったり、APIを公開することのできる他のAzureサービス(Logic App、API App、Function App)からAPIをインポートすることも可能です。

  • APIの追加画面

    APIの追加画面

選択すると「Create from OpenAPI specification」というAPI追加画面が表示されますので、項目を入力していきます。
「OpenAPI specification」にはOpenAPIの仕様に沿って記述されたAPI仕様のURLあるいはファイルを選択します。今回は「http://conferenceapi.azurewebsites.net/?format=json」というカンファレンスAPIのOpenAPI仕様が記述されたURLを入力します。URLを入力すると、OpenAPI仕様の内容を読み取って自動で「Display name」、「Name」、「Description」が入力されます。これらはAzureポータルや開発者ポータル上で表示されるAPIの名称や説明文として表示されるものです。「URL scheme」はデフォルトのまま「Both」を選択、「API URL suffix」には「conference」と入力します。「API URL suffix」は、URLのパスに使用されるもので必須項目ではありませんが、入力しておくことで今後別のAPIを追加する際にパス名が衝突してしまうといったトラブルを回避するために指定することをおすすめします。
「Tags」はAPIに自由にタグを付けることで、Azureポータルや開発者ポータルからAPIを探す際のフィルター条件として使用することができる機能ですが、今回は未入力とします。「Products」では作成するAPIを含める製品を選択します。製品については後の手順で作成するので、ここでは未入力のままとします。「Version this API?」ではAPIにバージョンを持たせるかを選択することができます。APIにバージョンを持たせることによって、クライアントとサーバーのアプリケーション更新タイミングを分離できるようになります。今回はチェックを入れず、最後に右下の「Create」ボタンを選択してAPIの追加を実行します。

  • カンファレンスAPIの追加画面

    カンファレンスAPIの追加画面

追加に成功すると、APIの一覧に「Demo Conference API」が追加されているかと思います。API名の部分を選択すると、APIが持つすべての操作が表示されます。

  • カンファレンスAPIの一覧

    カンファレンスAPIの一覧

これで、カンファレンスAPIがAPI Managementに追加されました。管理者の場合、この画面からAPIの設定やテストの実行などを行うことができます。ただし、現時点ではカンファレンスAPIはどの成果物にも属していないためまだAPIを実行することはできません。先に成果物として、カンファレンスAPIを含む製品の作成を行います。

製品の作成

API Managementでは、1つ以上のAPIを含む「成果物」を作成することを製品化と呼びます。製品化された成果物に含まれたAPIを管理者、開発者が呼び出すことができるようになります。
製品化を行うには、API Management サービスのダッシュボードから「製品」を選択した画面で、「追加」ボタンを選択して「製品の追加」画面に遷移します。「表示名」、「ID」、「説明」に任意の内容を入力し、「状態」は「発行済み」を選択します。「発行済み」を選択した場合は開発者にもAPIが公開され、「未発行」を選択した場合は管理者のみがAPIを呼び出すことができます。この設定は後から変更可能です。
次に「サブスクリプションを要求する」のチェックを外します。サブスクリプションを要求すると、開発者が成果物をを利用する前に、管理者による審査が行われるようになり、承認された開発者のみが成果物を利用できるようになる仕組みです。最後に「APIの選択」ボタンを選択して、この製品に追加するAPIを選択します。今回は「Demo Conference API」のみ選択します。

  • 製品の作成

    製品の作成

ここまで入力して「作成」ボタンを選択すると、製品が作成されます。これでAPIを呼び出すことができるようになりました。

APIのテスト呼び出し

カンファレンスAPIを成果物に含めたので、APIの呼び出しが可能になりました。API Management サービスのダッシュボードから「API」を選択し、左側の「All APIs」の項目から「Demo Conference API」を選択します。画面上部のタブから「Test」タブを選択して、「GetTopics」というAPIを選択します。

  • APIのテスト実行画面

    APIのテスト実行画面

APIを選択すると、画面右側にテスト用のREST APIクライアントが表示されます。ここではAPIにリクエストする際のリクエストパラメーターやリクエストヘッダーの編集を行うことができ、さまざまなパラメーターを使ってAPIの動作確認をすることができるようになっています。なお、画面下部に表示されている「Request URL」に表示されているURLの通り、このクライアントが呼び出すのはカンファレンスAPIではなくAPIゲートウェイのAPIです。そのため、複数のバックエンドAPIをAPIゲートウェイで1つに集約したAPIや、APIゲートウェイによってレスポンス内容を書き換えているAPIなどの検証もここから行うことができるのです。
今回はシンプルに単一のバックエンドAPI(GetTopics)が呼び出せるかを確認します。リクエストパラメーターやヘッダーは何も編集せずに画面下部にある「Send」を選択します。少し待つとAPIのレスポンスが表示されます。

  • APIのテスト実行結果

    APIのテスト実行結果

「HTTP Response」という項目の下にAPIからのレスポンス内容が表示されています。「Message」タブ内の1行目で「200 OK」と表示されていれば、APIの呼び出しは成功です。
このようにAzureポータル画面上から非常に簡単にAPIの呼び出しができることが分かったかと思います。この機能を使うことで、APIゲートウェイの構築、テスト、リファクタリングといった開発サイクルをスムーズに回すことができるようになっています。

開発者ポータルの利用

次は開発者ポータルからAPIを実行してみましょう。API Management サービスのダッシュボードで「概要」を選択した画面の上部の「開発者ポータル」を選択すると、別タブで開発者ポータルの画面が表示されます。

  • 開発者ポータルへの遷移

    開発者ポータルへの遷移

「API」タブを選択すると、参照可能なAPIの一覧が表示されます。

  • 開発者が参照できるAPIの一覧

    開発者が参照できるAPIの一覧

一覧から「Demo Conference API」を選択し、「GetTopics」のAPIを選択します。するとAPIの仕様を確認することができます。

  • 開発者ポータルからAPI仕様を参照する

    開発者ポータルからAPI仕様を参照する

仕様の文中にある「Try it」のボタンを選択すると、REST APIのクライアントツールが使用できるようになります。「Send」ボタンを選択すると、管理者ポータルと同様にAPIのレスポンスを確認することができます。

  • 開発者ポータルからAPIのテストを実行する

    開発者ポータルからAPIのテストを実行する

このように開発者ポータルでも、APIの仕様と動作確認を行えることが分かりました。
なお、現在は管理者としてAzureポータルにログインした状態から開発者ポータルに遷移したため、開発ポータル上も管理者権限でログインした状態となっています。開発者のロールを持つユーザーの作成は、API Management サービスのダッシュボードの「ユーザー」からユーザーを追加し、「グループ」で追加したユーザーを「Developers」グループに追加させることで行うことができます。

流量制限の設定

最後にAPIに流量制限を設定してみましょう。Azureポータルに戻り、API Management サービスのダッシュボードから「API」を選択し、「GetTopics」APIを選択して「Design」タブを表示します。 Designタブには4つの大きな枠があります。「Frontend」はAPI ManagementがAPIゲートウェイとして公開するAPIに関する設定を行うエリアです。同様に「Backend」はAPI Managementを経由して実際に呼び出されるバックエンドAPIに関する設定を行うエリアです。「Inbound Processing」は、API Managementがリクエストを受信してからバックエンドAPIを呼び出す前に差し込むことのできる処理について設定を行うエリアで、「Outbound Processing」はその逆でバックエンドAPIからのレスポンスをAPI Managementからクライアントへ返却するまでの間で差し込むことができる処理について設定を行うエリアです。
流量制限を行う際は、「Inbound Processing」の処理として設定を追加していきます。「Inbound Processing」の枠の右上にある下向きの矢印を選択し、「Code editor」を選択します。

  • Inbound Processingの編集

    Inbound Processingの編集

「Code Editor」を選択すると、「GetTopics」APIのポリシー編集画面が表示されます。ここではXML形式でポリシーを記述していきますが、右側にあるポリシーのメニューから設定したいポリシーを選択することで、テンプレートを挿入することができます。
まず、XMLの編集画面で「inboundタグ」内の「base」タグの末尾でエンターキーを押して改行し、空白行にカーソルが置かれている状態にします。次に、右側のメニュー内「Access restriction policies」カテゴリーの「Limit call rate per key」を選択して流量制限のポリシーテンプレートを挿入します。

  • Code Editorでの流量制限の設定例

    Code Editorでの流量制限の設定例

テンプレート挿入後は、上図のように値を設定していきます。ここでは「calls」に「3」、「renewal-period」に「30」を設定しています。これにより30秒間に3回のAPI呼び出しまでは許可し、4回目以降は制限する設定となります。また、「counter-key」に設定した「context.Subscription.Id」によって、サブスクリプションID単位での流量制限のカウントとなるようにしています。ここまで記入したら、画面下部の「Save」を選択して編集を完了させます。 開発者ポータルに戻り、流量制限がかかるかどうか確認してみます。開発者ポータルで「APIS」タブから「GetTopics」APIの「Try it」を選択してAPIのテスト実行画面に移ります。パラメータはそのままで「Send」ボタンを選択します。「Response status」が「200」が返ってきたら繰り返し「Send」ボタンを選択し、4回目のAPI呼び出しで「Response status」が「429 Too Many Requests」となっていることを確認します。

  • 開発者ポータルでの流量制限の確認

    開発者ポータルでの流量制限の確認

これで流量制限を確認することができました。なお、「Response content」に含まれるJSONの「message」フィールドには、流量制限が解除されるまでの時間が表示されています。記載されている時間が経過した後に再度「Send」を選択すると、再びAPIからデータが取得できるようになっていることも確認することができます。

まとめ

今回はAzure API Managementについて説明しました。本稿ではごく基本的な機能の紹介にとどまってしまいましたが、API Managementには多岐に渡る機能が用意されていますので、サンプルのAPIを使って色々と試行錯誤して要件に合ったAPIゲートウェイの構築に近づけていくことをお勧めします。

WINGSプロジェクト 秋葉龍一 著/山田祥寛監修
<WINGSプロジェクトについて>テクニカル執筆プロジェクト(代表山田祥寛)。海外記事の翻訳から、主にWeb開発分野の書籍・雑誌/Web記事の執筆、講演等を幅広く手がける。一緒に執筆をできる有志を募集中