API Management

API Managementのアクセスをサブスクリプション必須にしてみた

Azure API Managementを経由してAzure Functionsを呼び出す際、サブスクリプションの指定をしないと、Azure API Managementを経由したAPI呼び出しができなくなるような設定を行うことで、アクセス制限をかけることができる。

今回は、Azure API Managementを経由してAzure Functionsを呼び出す際のサブスクリプションを必須にしてみたので、その手順を共有する。

前提条件

下記記事の実装が完了していること。

Azure FunctionsをAzure API Management経由で呼び出してみたこれまでは、Azure App ServiceからAzure Functionsを直接呼び出していたが、Azure API Manage...

また、以下の記事のPostmanをインストール済であること。

POSTメソッドでリクエストされるAzure FunctionsのAPIをPostmanによって呼び出してみたAzure App Serviceを利用せずに、HTTPトリガーによって呼び出されるAzure Functionsの動作確認を行うには、...

やってみたこと

  1. API Managementのサブスクリプション必須化
  2. サブスクリプションの作成
  3. 作成したサンプルプログラム(App Service側)の内容
  4. サンプルプログラムの実行結果

API Managementのサブスクリプション必須化

API Managementのサブスクリプションを必須化する前は、以下のように、サブスクリプションの指定がなくても、Azure API Managementを経由したAPI呼び出しが行える。

1) Azure環境でのAPI Management経由でAzure FunctionsのAPIを呼び出すために、Postmanを起動後、以下のようにメソッド・URL・リクエストボディを設定し、「Send」ボタンを押下する。
サブスクリプションの必須化_1

2) 指定したAPIが呼び出され、以下のように、レスポンスが画面下に表示されることが確認できる。
サブスクリプションの必須化_2_1

なお、このとき指定するAPIの「https://azureapipurinit.azure-api.net/azureFuncDemoApp」の部分は、Azure Portal上のAPI Managementの「BaseURL」から確認できる。
サブスクリプションの必須化_2_2

また、API Managementのサブスクリプションの必須化は、Azure Portal上で行える。その手順は、以下の通り。

3) Azure Portalにログインし、作成済のAPI Managementの「API」メニューから「azureFuncDemoApp」を選択後、「Settings」タブを押下する。ここで「Subscription required」のチェックを入れ、「Save」ボタンを押下する。
サブスクリプションの必須化_3

4) 保存が完了すると、以下のように、右上に完了メッセージが表示される。
サブスクリプションの必須化_4

5) 再度Azure環境でのAPI Management経由でAzure FunctionsのAPIを呼び出すために、以下のようにメソッド・URL・リクエストボディを設定し、「Send」ボタンを押下する。
サブスクリプションの必須化_5

6) サブスクリプションの指定が必須になるため、以下のように、HTTP 401エラーが発生することが確認できる。
サブスクリプションの必須化_6



サブスクリプションの作成

サブスクリプションの作成は、Azure Portal上で行える。その手順は、以下の通り。

1) Azure Portalにログインし、作成済のAPI Managementの「サブスクリプション」メニューを選択する。
サブスクリプションの作成_1

2)「サブスクリプションの追加」ボタンを押下する。
サブスクリプションの作成_2

3) 以下のように、右側にサブスクリプションの追加画面が表示されることが確認できる。
サブスクリプションの作成_3

4) 「スコープ(範囲)」は、「すべてのAPI」「API」「製品」が選択できるが、ここでは「API」を指定する。
サブスクリプションの作成_4

5) スコープを「API」とした場合は、対象のAPIを指定する必要があるため、デプロイ済のAzure Functionsを選択する。
サブスクリプションの作成_5

6) その他、任意の名前(必須)と表示名を指定し、「保存」ボタンを押下する。
サブスクリプションの作成_6

7) 以下のように、指定した表示名「apiSubscription」のサブスクリプションが作成されたことが確認できる。
サブスクリプションの作成_7

8) サブスクリプションの「主キー」「2次キー」を表示するには、コンテキストメニューを表示し、「キーの表示/非表示」を選択する。
サブスクリプションの作成_8

9) 以下のように、主キー・2次キーの値が表示されることが確認できる。なお、キー右のコピーマークを押下すると、キー値のコピーが行える。
サブスクリプションの作成_9

10) Azure環境でのAPI Management経由でAzure FunctionsのAPIを呼び出すために、Postmanを起動後、以下のようにヘッダーに、キーに「Ocp-Apim-Subscription-Key」、値にサブスクリプションの主キーをもつ値を追加した上で、「Send」ボタンを押下する。
サブスクリプションの作成_10

11) 指定したAPIが呼び出され、以下のように、レスポンスが画面下に表示されることが確認できる。
サブスクリプションの作成_11_1

なお、このときのリクエストボディの値は以下の通りで、特に変更していない。
サブスクリプションの作成_11_2



作成したサンプルプログラム(App Service側)の内容

修正したサンプルプログラム(App Service側)の構成は以下の通り。
サンプルプログラムの構成(AppService)
なお、上記の赤枠は、前提条件のプログラムから変更したプログラムである。また、Azure Functions側のソースコードは修正していない。

コントローラクラスの内容は以下の通りで、callFunctionApi関数の呼び出し時に、ヘッダーに、キーに「Ocp-Apim-Subscription-Key」、値にサブスクリプションの主キーをもつ値を追加している。

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/azure/tree/master/api-management-need-subscription/demoAzureApp



サンプルプログラムの実行結果

修正したサンプルプログラムの実行結果は、以下の通り。

1) Azure App ServiceのURL「https://azureappdemoservice.azurewebsites.net/」とアクセスすると以下の画面が表示されるため、「ファンクション呼び出し」ボタンを押下する。
サンプルプログラムの実行結果_1_1

なお、上記URLは、下記Azure App ServiceのURLから確認できる。
サンプルプログラムの実行結果_1_2

2) callFunctionApi関数が呼び出され、以下の画面に遷移する。その後「戻る」ボタンを押下する。
サンプルプログラムの実行結果_2

3) 以下のように、初期表示画面に戻ることが確認できる。
サンプルプログラムの実行結果_3_1

なお、App Serviceのapplication.propertiesを以下の設定にした状態で、Azure上に、Azure App Service, Azure Functionsのプログラムをデプロイし、実行している。
サンプルプログラムの実行結果_3_2

要点まとめ

  • Azure API Managementを経由してAzure Functionsを呼び出す際、サブスクリプションの指定をしないと、Azure API Managementを経由したAPI呼び出しができなくなるような設定を行うことで、アクセス制限をかけることができる。
  • サブスクリプションの指定は、ヘッダーに、キーに「Ocp-Apim-Subscription-Key」、値にサブスクリプションの主キーをもつ値を追加することで行える。