Visual Studio Codeを使用してAzure API ManagementからFunctions APIをテストしてみた

# はじめに
OpenAPI仕様をベースに設計したAPIをAzure API Managementにインポートした後、実際にAPIを処理するバックエンドを用意してテストするにはAzure Portalを使うにしてもなかなか大変だと思います。

今回Windows10の端末にてVisual Studio Codeを用いてAzure API Managementに定義したAPIからAzure Functions用のAPIを作成し、作成したAPIをAzure FunctionsにデプロイしてAzure API Managementのテスト機能にてAPIをテスト送信する方法を紹介します。

　　[事前準備](https://qiita.com/drafts/01ec28f92f295a8a4999/edit#%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99)
　　　　↓
[Functions APIを作成]
(https://qiita.com/drafts/01ec28f92f295a8a4999/edit#functions-api%E3%82%92%E4%BD%9C%E6%88%90)
　　　　↓
[Functionsへデプロイ](https://qiita.com/drafts/01ec28f92f295a8a4999/edit#functions%E3%81%B8%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4)
　　　　↓
[Functions APIをテスト](https://qiita.com/drafts/01ec28f92f295a8a4999/edit#functions-api%E3%82%92%E3%83%86%E3%82%B9%E3%83%88)

# 事前準備
* [Visual Studio Code (VS code)](https://code.visualstudio.com/)をインストール

VS Codeをインストールした後にVS Code拡張機能であるAPI ManagementとFunctionsをそれぞれインストールします。

[Azure API Management拡張機能]
![2020-12-08_15h35_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/919924/0f763ecc-5bfe-1029-850d-99bba80b9a0f.png)

[Azure Functions拡張機能]
![2020-12-08_15h36_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/919924/d27f1342-6e44-3360-d792-32f30d4b6b5a.png)


API Management拡張機能の以下アイコンをクリックし、 "*Extension Settings*" をクリックします。
![2020-12-08_22h16_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/919924/1a03ad46-6130-3ab0-c6f3-107d6c8fc3b2.png)

"*Scaffold Azure Functions*" を有効にします。
![2020-12-08_22h18_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/919924/9fafc816-dac8-9afa-edc2-8f4473d0f953.png)



* [Node.js](https://nodejs.org/en/download/)をインストール

Node.jsをインストール後にコマンドプロンプトを起動して、以下を実行しAutoRestをインストールします。
AutoRestとはMicrosoftがオープンソースとして公開しているOpenAPI仕様から様々な言語に対応したAPI読み出しライブラリを自動生成するツールです。

```
npm install -g autorest
```
* API Managementに[APIをインポート](https://github.com/microsoft/vscode-apimanagement#create-an-api-by-importing-an-openapi-specification)
今回はAPIがインポートされている状態から開始します。もちろん[VS Codeからのインポート](https://github.com/microsoft/vscode-apimanagement#create-an-api-by-importing-an-openapi-specification)も可能です。

# Functions APIを作成
ここではAPI Managementに定義したAPIをベースにFunctionsに実装するAPIライブラリを作成します。


対象のAPI（Demo Conference API）にカーソルを合わせて右クリックし、"*Scaffold Azure Functions*" をクリックします。
![2020-12-08_15h55_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/919924/36ddd838-7e9c-e8c7-cdf8-10c77e22e1bf.png)

Functionsにて関数を実装する際の言語を選択します。
![2020-12-08_15h57_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/919924/2bfc13ce-0b42-ab83-ea60-cddc7b4af77a.png)

自動生成されるFunctions用のAPIライブラリを格納する任意のフォルダ（空でＯＫ）を選択して "*Functions Location*" をクリックします。
![2020-12-08_16h03_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/919924/b79fb4bd-9fd2-b79e-57d4-194617b104df.png)

上記実行後に任意のフォルダにFunctions用のAPIライブラリが作成されます。
![2020-12-08_16h11_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/919924/b2b29017-08c6-7b31-4173-5d12abb96be4.png)


# Functionsへデプロイ
ここでは上記で作成したAPIライブラリをFunctionsを新規作成してデプロイします。

VS Codeのプロジェクトとして先程作成したFunctions用のAPIライブラリが格納されている任意フォルダがOpenになっていることを確認します。
![2020-12-08_16h34_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/919924/dbe3623e-3236-1ad0-d3c2-2505e72a77a7.png)

"*Deploy to Function App...*" のアイコンをクリックします。
![2020-12-08_16h13_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/919924/ccd1ac85-9cbb-467a-8f01-29d6a5a965fa.png)

対象のサブスクリプションを選択します。
![2020-12-08_16h14_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/919924/5cfefce3-0e2b-87ab-3add-e6e869a2ca78.png)


"*+Create new Function App in Azure...*" を選択します。
![2020-12-08_16h15_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/919924/dcad2b7e-3178-9e20-537e-0962f306b490.png)

新規に作成するFunctions名を入力します。
![2020-12-08_16h16_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/919924/c8659cac-8ed6-894e-0f8f-c593c62c54d7.png)

Runtime stackを選択します。
![2020-12-08_16h19_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/919924/e8be0b0b-a62f-eee8-0808-9a74b9734262.png)

ロケーションを選択するとFunctionsの生成・デプロイが開始されます。
![2020-12-08_16h19_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/919924/5af0cf93-a154-cd27-98ee-96a7ea8707ec.png)

Functionsの生成・デプロイが完了すると以下の通りAPI Managementにて定義した各APIがFunctionsに関数として作成されていることを確認することができます。
![2020-12-07_23h02_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/919924/3a43e5ea-b9b0-4521-4433-bf04e0bb8cef.png)


# Functions APIをテスト
それでは作成したFunctions APIをテストしてみます。

テスト対象のAPI（GetSpeakers）にカーソルを合わせて右クリックし、"*Test operation*" をクリックします。
![2020-12-08_16h41_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/919924/385f9082-9900-dc99-2436-0927dcd3a04d.png)

以下のようなAPI画面が表示されます。APIをAPI ManagementからFunctionsにテスト送信するために適切なFunction URIとサブスクリプションIDに置き換える必要があります。
![2020-12-08_16h42_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/919924/022b106d-fdc0-dbba-b9f0-0d9eb22a3f83.png)

API Management名（apim-test-khigashi）にカーソルを合わせて右クリックし、"*Copy Subscription Key*" をクリックすることでサブスクリプションIDをコピーすることができます。
![2020-12-08_16h42_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/919924/b5873ea8-f5c3-9fba-f867-8bcbe047e537.png)

テスト対象のAPI関数（GetSpeakers）にカーソルを合わせて右クリックし、"*Copy Function Url*" をクリックすることでFunction URI（API関数のURI）をコピーすることができます。
![2020-12-08_16h43_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/919924/d2a7a349-cb55-28db-c1a9-a81be30aab05.png)

上記コピーしたFunction URIとサブスクリプションIDを以下の通り置き換えます。
![2020-12-07_23h41_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/919924/0140a9b2-66f0-095d-7937-054ec6b57dc5.png)


API画面の "*Send Request*" をクリックすると右画面にResponse結果が表示され結果を確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/919924/69b06616-d386-c547-06d8-8c7dc2fe3947.png)



# おわりに
Azure portalを使わずにVS Codeだけで簡単にAPI ManagementのバックエンドとしてFunctionsを配置してAPIテストをすることができました。特に開発者にとってはAPI設計⇒コード自動生成⇒APIテストの一連の流れをVS Codeのみで開発できるのは大変有効なのではないかと思います。また[API ManagementのVS Code拡張機能](https://github.com/microsoft/vscode-apimanagement)はその他にも便利な機能がございます。オープンソースとしてGithub上で日々アップデートされておりますのでチェックしてみてください。

# 参考

* [Azure API Management Extension for Visual Studio Code (Preview)](https://github.com/microsoft/vscode-apimanagement)
* [AutoRest](https://github.com/Azure/AutoRest)