Azure API Management を Azure Functions と Amazon API Gateway のゲートウェイとして動作させる

2022.10.31

いわさです。

API ゲートウェイパターンを実現する際にいくつかの API 統合向けマネージドサービスを利用することが出来ますが、今回 Azure API Management を使ってみました。

Azure API Management を使うと様々な環境でホスティングされているバックエンド API を統合管理したゲートウェイとして機能させることが出来ます。
今回は以下のように Azure と AWS にそれぞれ API を用意し、クライアントから一貫したアクセス方法(今回は API キーを利用)で各サービスの API を利用するイメージをしています。

まずはそれぞれのパブリッククラウド上にシンプルなバックエンド API を用意します。

Azure Functions

Azure Functions は新規作成後に HTTP trigger テンプレートを選択します。

以下のように固定で JSON 文字列を応答するだけのものです。

import azure.functions as func
import json


def main(req: func.HttpRequest) -> func.HttpResponse:
    return func.HttpResponse(json.dumps({"hoge":"azure-hoge"}))

Amazon API Gateway

続いて Amazon API Gateway です。
こちらは Lambda は用意せずにモックの統合レスポンスで固定の JSON 文字列をレスポンスさせます。

こちらあとから気がついたのですが、最近であれば Lambda の HTTP URL を使ったほうが Azure Functions と近い形で、かつ Lambda 単体で不足している API 周りの機能が Azure API Management でカバー出来る形なので、そちらのほうが利用用途ありそうだなと気がつきました。

忘れずに API をデプロイしておきます。

Azure API Management

さて、ここからは Azure API Management をデプロイし各環境の API を統合管理しましょう。

Azure API Management を作成

Azure API Management インスタンスの作成自体は非常にシンプルで以下のパラメータを入力してデプロイするだけです。
ただしデプロイ時間がちょっと長い(数十分かかる)のでその点だけご注意ください。

ポイントとしては価格レベル (Pricing Tier) ですね。
何がどう違うのかは価格ページに表形式でまとまっているのでこちらを見るのが一番良いと思います。

今回は評価環境なので Developer を選択しています。
各プランで料金も違いますが、キャッシュやスケールアウトの上限も異なっています。

また Premium では可用性ゾーンのサポート、複数リージョンデプロイがサポートされており、API ゲートウェイの弱点として挙げられやすい単一障害点への対策を行うことも出来ます。

Amazon API Gateway をバックエンドに

API メニューからインスタンスに API を追加していくのですが、外部の API となるので新しく API 定義を作成します。
OpenAPI などのドキュメントからインポートすることも可能です。Amazon API Gateway ではドキュメントエクスポートが出来るのでそちらのほうが楽だったかもと今気がつきました。

エンドポイントを指定します。

さらに、この API を利用する際にはサブスクリプションを必須とすることで API キーを知っている許可された利用者へのみ API を公開します。

Azure Functions をバックエンドに

Azure リソースでホスティングされている API は統合が簡単です。
対象リソースを選択すると自動で API として追加してくれます。

ここでは Functions App を選択し、作成していた 2 つの API を以下のようにインポート対象として選択しました。

使ってみる

API 統合の準備が整いました。
では実際に Azure API Management をゲートウェイとして API を利用してみます。

開発者ポータルから使う

Azure API Management では開発者ポータルという機能が用意されています。 開発者ポータルを API 利用者へ公開することで、セルフオンボーディングから API 情報の取得まで、API 利用にあたって必要な様々な機能を利用者へ提供することが出来ます。

開発者ポータルの編集モードは Portal Overview メニューから起動することが出来ます。

デフォルトで以下のような形で作成されているので今回は不要なコンポーネントをいくつか削除だけしました。

開発者ポータルの更新後は Publish する必要があります。

では実際に利用者が開発者ポータルへアクセスしサインアップして使ってみましょう。

利用者はプロダクトごとにサブスクリプションを作成し API キーを利用します。
前提としてサブスクリプションが API を含んでいる必要があります。

任意の API・操作を選択します。
API キー発行済みであればドキュメント上から HTTP リクエストを送信してパラメータごとの挙動をその場で確認することが出来ます。
API としても提供されている SaaS とかでたまに見るやつですね!

HTTP クライアントから使う

cURL で実行してみます。

% curl -i -H "Ocp-Apim-Subscription-Key:6806ed2c82f24b883339b66f907e681c" "https://yuruweb-api.azure-api.net/azure/azure-func1"
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: text/plain; charset=utf-8
Request-Context: appId=cid-v1:33c30125-1844-4f18-9bdf-abfec4ade9fa
Date: Sun, 30 Oct 2022 03:40:22 GMT

{"hoge": "azure-hoge"}

% curl -i -H "Ocp-Apim-Subscription-Key:6806ed2c82f24b889b59b66f907e681c" "https://yuruweb-api.azure-api.net/aws/fuga"
HTTP/1.1 200 OK
Content-Length: 26
Content-Type: application/json
x-amzn-RequestId: f18fa338-f7ac-4860-852e-602a9b9405c6
x-amz-apigw-id: azJ_PGzrtjMFkpQ=
Date: Sun, 30 Oct 2022 03:32:49 GMT

{
    "fuga": "fugafuga"
}

% curl -i "https://yuruweb-api.azure-api.net/azure/azure-func2"                                                                
HTTP/1.1 401 Access Denied
Content-Length: 152
Content-Type: application/json
WWW-Authenticate: AzureApiManagementKey realm="https://yuruweb-api.azure-api.net/azure",name="Ocp-Apim-Subscription-Key",type="header"
Date: Sun, 30 Oct 2022 03:40:43 GMT

{ "statusCode": 401, "message": "Access denied due to missing subscription key. Make sure to include subscription key when making requests to an API." }

Azure も AWS も API Management のバックエンドとして機能していますね。
さらに API キーがないとアクセス出来ないことも確認が出来ました。

さいごに

本日は Azure API Management を Azure Functions と Amazon API Gateway のゲートウェイとして動作させてみました。

API ゲートウェイパターンは特にマイクロサービスアーキテクチャーで検討されることが多いと思いますが、障害点をリスクヘッジしつつマネージドサービスとして運用出来る Azure API Management は検討候補になりそうです。