前回の記事では、サーバーレスの意味と Azure Functions で何ができるのかを説明しました。
今回は、Azure Functions で HTTP トリガーで動作する関数を作成する方法について説明します。
なお、本記事は Microsoft Docs の「Azure Portal で初めての関数を作成する」を参考にしています。
HTTP トリガーとは?
そもそも Azure における「トリガー」とは、Azure 関数がどのように呼び出されるかを定義するオブジェクトのことを指します。
本記事で取り扱う HTTP トリガーとは、文字通り HTTP 要求で呼び出す関数のことです。
HTTP トリガーには、以下に示す機能やカスタマイズがあります。
- キーを指定して、承認されたアクセスを提供する
- どの HTTP 動詞をサポートするかを制限する
- 呼び出し元にデータを戻す
- クエリ文字列のパラメーターや要求のあった本文を介して、データを受け取る
- 関数 URL を修正するために URL ルート テンプレートをサポートする
HTTP トリガーを作成するには、プログラミング言語の選択、トリガー名の指定、承認レベルの選択が必要です。
HTTP トリガーの作成
Azure Portal へのサインイン
ここからが本題となります。
はじめに、Azure Portal にサインインします。
Azure Functions の作成
Azure Portal にサインインをしたら、Aure サービス一覧にある「関数アプリ」をクリックします。一覧に「関数アプリ」がない場合は、「その他のサービス」をクリックし、表示された一覧から「関数アプリ」をクリックします。
関数アプリの作成
次に「関数アプリ」のページに遷移するので、「+追加」をクリックします。
「+追加」をクリックすると、「関数の作成」画面に遷移します。
上記の入力欄は、以下の表を参考に入力してください。最後に画面下にある「確認および作成」をクリックします。
サブスクリプション | ご自身で使用している任意のサブスクリプションを選択します。筆者は Visual Studio Ultimate with MSDN を選択しました。 |
---|---|
リソースグループ | 任意のリソースグループを選択します。存在しない場合は新規作成をクリックします。本記事では「AzureFunctions」としました。 |
関数アプリ名 | 任意の関数アプリ名を入力します。本記事では「httpTriger」としました。 |
公開 | コードか Docker のどちらかを選択します。本記事では「コード」を選択しました。 |
ランタイムスタック | ランタイムスタックを選択します。 C# 関数および F# 関数を作成する場合は、 [.NET Core] を選択します。本記事では「.NT Core」を選択しました。 |
バージョン | インストールされているランタイムのバージョンを選択します。本記事執筆時点では選択可能な「3.1」にしました。 |
地域 | ユーザーに近いリージョン、または関数がアクセスする他のサービスの近くのリージョンを選択します。本記事では「Japan East」を選択しました。 |
デプロイが完了すると以下の画面に遷移しますので、画面下にある「リソースに移動」をクリックします。
HTTP トリガーの作成
続いて HTTP トリガーを作成します。
先ほどの「リソースに移動」をクリックすると以下の画面に遷移しますので「関数」をクリックします。
以下の画面に遷移しますので、「追加(①)」をクリックし、テンプレートの一覧で「HTTP trigger(②)」を選択します。
画面を下の方にスクロールすると「テンプレートの詳細」欄があります。任意の新しい関数名を入力し、Authorization level(承認レベル)を入力します。ここでは「Anonymous(匿名)」を選択しました。最後に「追加」をクリックします。
作成した関数のテスト
先ほどの「追加」をクリックすると、以下の画面に遷移します。
「関数のURLの取得(①)」をクリックし、アイコンをクリック(②)してURLをコピーします。
新しく、ブラウザを起動して URL を貼り付けたら、末尾に「?name=<任意の文字列>」を入力します。今回は「?name=HIRO」と入力してみました。
実行すると、以下のように結果が返ってきます。「Hello, HIRO. This HTTP triggered …」のように「?name=」に渡した値が表示されます。
作成されたコードの確認
先ほど、関数のテストを実行しましたが、どのようなコードが作成されたのかを確認してみましょう。以下画面のように「コードとテスト」をクリックすると、作成されたコードを確認することができます。
コードの詳細は以下の通りです。
#r "Newtonsoft.Json" using System.Net; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Primitives; using Newtonsoft.Json; public static async Task Run(HttpRequest req, ILogger log) { log.LogInformation("C# HTTP trigger function processed a request."); string name = req.Query["name"]; string requestBody = await new StreamReader(req.Body).ReadToEndAsync(); dynamic data = JsonConvert.DeserializeObject(requestBody); name = name ?? data?.name; string responseMessage = string.IsNullOrEmpty(name) ? "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response." : $"Hello, {name}. This HTTP triggered function executed successfully."; return new OkObjectResult(responseMessage); }
8行目からが関数の本体で、引数は req と log の2つです。
req は HttpRequest 型ですので、URL でアクセスしてきた時の情報を保持しています。また log は ILogger 型ですので、ログの記録時に使用する物です。
10行目は、引数 log を使用して、C# の HTTP trigger が成功したことをログに書き込みをしています。ILogger についての詳しい情報は こちら を参照してください。
12行目は、変数 req から、name の情報を取り出しています。URLを入力して実行した際に「?name=HIRO」としましたので、ここでは「HIRO」を取得していることになります。
14行目は、HTTP リクエストの body 部分を読み込んで文字列に変換をしています。
15行目は、14行目の文字列をデシリアライズしています。Json のデシリアライズについては過去記事で説明をしていますので参考にしてください。
16行目は、あらかじめ取得していた name か デシリアライズによって取り出した name のいずれかの null ではない方を変数 name に代入しています。
18行目は、name が null のときは「This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.」を、null 以外のときは「Hello, {name}. This HTTP triggered function executed successfully.」という文字列を responseMessage に代入しています。
最後に 22行目で、responseMessage を呼び出し元に返しています。OkObjectResult クラスの詳細な情報は、こちら を参照してください。
コメント