Azure Functions で HTTP エンドポイントをカスタマイズする
この記事では、API 設計内の特定のアクションを処理するように HTTP トリガーをカスタマイズして、Azure Functions を使用して高度にスケーラブルな API をビルドする方法について説明します。 Azure Functions には、組み込みの HTTP トリガーとバインドのコレクションが含まれており、作成者は Node.js、C# などのさまざまな言語で簡単にエンドポイントを作成できます。 また、API を Azure Functions プロキシと統合し、モック API を設定して、API を拡張する準備を行います。 これらのタスクは Functions のサーバーレス コンピューティング環境上で行われるため、リソースのスケーリングについて心配する必要はなく、 API のロジックのみに集中できます。
重要
Azure Functions プロキシは、Azure Functions ランタイムのバージョン 1.x から 3.x 用のレガシ機能です。 プロキシのサポートは、バージョン 4.x で再有効化され、関数アプリを最新のランタイム バージョンに正常にアップグレードできます。 できるだけ早く、関数アプリと Azure API Management の統合に切り替える必要があります。 API Management では、Functions ベースの API の定義、セキュリティ保護、管理、収益化のためのより完全な機能セットを利用できます。 詳しくは、「API Management 統合」をご覧ください。
Functions バージョン 4.x でプロキシのサポートを再度有効にする方法については、「Functions v4.x でプロキシを再度有効にする」を参照してください。
前提条件
- データをセキュリティで保護する HTTP テスト ツール。 詳細については、「HTTP テスト ツール」を参照してください。
この記事では、「Azure portal から初めての関数を作成する方法」で作成したリソースを使用して作業を開始します。 リソースの作成が済んでいない場合は、すぐにこれらの手順に従って Function App を作成してください。
この関数アプリを作成したら、この記事の手順に従うことができます。
Azure へのサインイン
Azure アカウントで Azure Portal にサインインします。
HTTP 関数のカスタマイズ
既定では、任意の HTTP メソッドを受け入れるように HTTP トリガー関数を構成します。 このセクションでは、/api/hello
の GET 要求にのみ応答するように関数を変更します。 既定の URL https://<yourapp>.azurewebsites.net/api/<funcname>?code=<functionkey>
を使用できます。
Azure Portal で関数に移動します。 左側のメニューで [統合] を選択し、 [トリガー] で [HTTP (req)] を選択します。
次の表で指定されている HTTP トリガーの設定を使用します。
フィールド 値の例 説明 [ルート テンプレート] hello この関数の呼び出しに使用するルートを決定します 承認レベル Anonymous 省略可能:API キーを使用せずに関数にアクセスできるようにします [選択した HTTP メソッド] GET この関数の呼び出しには、選択した HTTP メソッドのみが使用できます ルート テンプレートの基本パス プレフィックス
/api
はグローバル設定によって処理されるため、ここで設定する必要はありません。[保存] を選択します。
HTTP 関数のカスタマイズの詳細については、「Azure Functions の HTTP トリガーとバインドの概要」を参照してください。
API のテスト
次に、関数のテストを行い、新しい API サーフェスでどのように機能するかを確認します。
[関数] ページで、左側のメニューから [コードとテスト] を選択します。
上部のメニューから [関数の URL の取得] を選択し、URL をコピーします。 関数でパス
/api/hello
が使用されるようになったことを確認します。URL をブラウザーの新しいタブまたはお使いの REST クライアントにコピーします。 ブラウザーでは既定で GET が使用されます。
URL のクエリ文字列にパラメーターを追加します。 たとえば、
/api/hello/?name=John
のようにします。Enter キーを押して、関数が動作していることを確認します。 "Hello John" という応答が表示されます。
また、別の HTTP メソッドを使用してエンドポイントを呼び出し、関数が実行されないことを確認することもできます。 GET 以外の HTTP メソッドの場合は、セキュリティで保護された HTTP テスト ツールを使用する必要があります。
Proxies の概要
次のセクションでは、プロキシを経由して API を公開します。 Azure Functions プロキシを使用すると、要求を他のリソースに転送できます。 HTTP トリガーと同様に、HTTP エンドポイントを定義します。 ただし、エンドポイントの呼び出しの際に実行するコードを記述する代わりに、リモート実装への URL を指定します。 これにより、クライアントが簡単に使用できる単一の API サーフェイスに複数の API ソースをまとめることができ、これは API をマイクロサービスとしてビルドする場合に便利です。
プロキシは、以下のような任意の HTTP リソースを指定できます。
- Azure Functions
- Azure App Service 内の API アプリ
- App Service on Linux 内の Docker コンテナー
- その他のホストされている API
Azure Functions プロキシの詳細については、「レガシ プロキシを使用する」を参照してください。
Note
Azure Functions プロキシは、Azure Functions バージョン 1.x から 3.x までで使用できます。
最初のプロキシの作成
このセクションでは、API 全体に対してフロントエンドとして機能する新しいプロキシを作成します。
フロントエンド環境を設定する
「Function App を作成する」の手順を繰り返し、プロキシを作成する新しい関数アプリを作成します。 この新しいアプリの URL は、API のフロントエンドとして機能し、先ほど編集した関数アプリはバックエンドとして機能します。
ポータルで新しいフロントエンドの Function App に移動します。
[設定] を展開し、[環境変数] を選択します。
キーと値のペアが格納されている [アプリ設定] タブを選択します。
[+ 追加] を選択して、新しい設定を作成します。 その [名前] に「HELLO_HOST」と入力し、[値] を、バックエンド関数アプリのホスト (例:
<YourBackendApp>.azurewebsites.net
) に設定します。この値は、先ほど HTTP 関数をテストするときにコピーした URL の一部です。 後ほど構成でこの設定を参照します。
Note
プロキシのハード コーディングされた環境依存を防ぐために、アプリ設定をホスト構成に使用することをお勧めします。 アプリ設定を使用すると、プロキシの構成を環境間で移動でき、その環境に合わせたアプリ設定が適用されます。
[適用] を選択して、新しい設定を保存します。 [アプリの設定] タブで [適用] を選択し、[確認] を選択して関数アプリを再起動します。
フロントエンドでプロキシを作成する
ポータルでフロントエンドの関数アプリに戻ります。
左側のメニューで、[関数] を選択し、[プロキシ]、[追加] の順に選択します。
[新しいプロキシ] ページで、次の表の設定を使用し、[作成] を選択します。
フィールド 値の例 説明 名前 HelloProxy 管理にのみ使用するフレンドリ名です [ルート テンプレート] /api/remotehello このプロキシの呼び出しに使用するルートを決定します [バックエンド URL] https://%HELLO_HOST%/api/hello 要求の送信先となるエンドポイントを指定します Azure Functions プロキシでは基本パス プレフィックス
/api
は提供されないため、これをルート テンプレートに含める必要があります。%HELLO_HOST%
構文では、以前作成したアプリ設定が参照されます。 解決済みの URL は元の関数を指します。プロキシの URL をコピーし、ブラウザー内、または任意の HTTP クライアントでテストすることで、新しいプロキシを試します。
- 匿名関数の場合は、
https://YOURPROXYAPP.azurewebsites.net/api/remotehello?name="Proxies"
を使用します。 - 承認がある関数の場合は、
https://YOURPROXYAPP.azurewebsites.net/api/remotehello?code=YOURCODE&name="Proxies"
を使用します。
- 匿名関数の場合は、
モック API の作成
次に、プロキシを使用して、ソリューションのモック API を作成します。 このプロキシにより、バックエンドを完全に実装する必要なく、クライアント開発を進めることができます。 開発中、後ほど、このロジックをサポートしてプロキシをリダイレクトする新しい関数アプリを作成できます。
このモック API を作成するには、新しいプロキシを作成します (今回は App Service Editor を使用します)。 作成を開始するには、Azure portal でお使いの関数アプリに移動します。 [プラットフォーム機能] を選択し、[開発ツール] で [App Service Editor] を選択します。
App Service Editor が新しいタブで開きます。
左側のウィンドウで
proxies.json
を選択します。 このファイルには、すべてのプロキシの構成が格納されます。 Functions のデプロイ方法のいずれかを使用する場合、このファイルはソース管理で保持します。 このファイルの詳細については、Proxies の詳細な構成に関するページを参照してください。proxies.json ファイルは次のようになります。
{ "$schema": "http://json.schemastore.org/proxies", "proxies": { "HelloProxy": { "matchCondition": { "route": "/api/remotehello" }, "backendUri": "https://%HELLO_HOST%/api/hello" } } }
モック API を追加します。 proxies.json ファイルを次のコードに置き換えます。
{ "$schema": "http://json.schemastore.org/proxies", "proxies": { "HelloProxy": { "matchCondition": { "route": "/api/remotehello" }, "backendUri": "https://%HELLO_HOST%/api/hello" }, "GetUserByName" : { "matchCondition": { "methods": [ "GET" ], "route": "/api/users/{username}" }, "responseOverrides": { "response.statusCode": "200", "response.headers.Content-Type" : "application/json", "response.body": { "name": "{username}", "description": "Awesome developer and master of serverless APIs", "skills": [ "Serverless", "APIs", "Azure", "Cloud" ] } } } } }
このコードにより、新しいプロキシ
GetUserByName
が追加され、backendUri
プロパティは省略されます。 別のリソースを呼び出す代わりに、応答のオーバーライドを使用して、Azure Functions プロキシからの既定の応答を変更します。 また、バックエンド URL で要求と応答のオーバーライドを使用することもできます。 この手法は、ヘッダー、クエリ パラメーターなどを変更することが必要な場合があるレガシ システムへのプロキシ経由にする際に役立ちます。 要求と応答のオーバーライドの詳細については、「要求と応答を変更する」をご覧ください。ブラウザーまたはお使いの REST クライアントで
<YourProxyApp>.azurewebsites.net/api/users/{username}
エンドポイントを呼び出して、モック API をテストします。 {username} を、ユーザー名を表す文字列値に置き換えてください。
関連するコンテンツ
この記事では、Azure Functions で API をビルドおよびカスタマイズする方法について説明しました。 また、モック API を含む複数の API を 1 つの統合 API サーフェイスとしてまとめる方法についても説明しました。 これらの手法を使用することで、Azure Functions のサーバーレス コンピューティング モデルで API を実行しながら、複雑な API も構築できます。
API の開発の詳細については、次のコンテンツを参照してください。