未分類

「Azure Functions」をC#で触ってみました。

どうも、お久しぶりです。kenji.mです。 今回は「Azure Functions」に触っていこうと思います。

Azure Functionsって何ですか?

まずはそこから確認してみます。 Microsoft Docsには 大体こんな感じのことが書いてあるようです。

  1. Azure上でプログラムを実行できます。
  2. 様々なイベントをトリガーとしてプログラムを起動できます。
  3. Azure上のプログラムから様々なサービスにアクセスできます。

これだけ見るとバッチやスクリプトに似ているような気がします。 具体的な詳細につては上記リンクを確認してくださいね。

早速触ってみよう!

今回もVisualStudioで触っていきます。

1.プロジェクトの作成 「Azure Functions」を選択して「次へ(N)」

※「Azure Functions」が選択肢にない場合は「Visual Studio Installer」の「ワークロード」で「Azureの開発」にチェックを付けてください。

2.プロジェクトの構成 プロジェクト名を「AzureFunctionApp」に変更し、「作成(C)」

3.Functionの構成 「Authorization level」を「Anonymous」に変更

4.プロジェクトが作成されました。

ソースは以下の通り。 何も変更していないので、ここでは特に書くことはありません。

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;

namespace AzureFunctionApp
{
    public static class Function1
    {
        [FunctionName("Function1")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] 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);
        }
    }
}

5.徐に実行

ブロックされた場合はアクセスを許可してください。

6.コマンドプロンプトが自動で起動します。

7.「Function1:[GET,POST]」以降のURLをコピーして、ブラウザで開いてみましょう。

このように表示されていれば正常に実行されていると思われます。

8.コマンドプロンプトに情報が追加されています。

9.一通り動作したのでプログラムを停止します。

10.コマンドプロンプトも閉じましょう。

特に問題なく実行されたと思います。
ソースが動作することがわかりました。

どんなことをしているの?

具体的にどんなことをしているのかを確認してみましょう。

1~9行目 インポート

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;

プログラムで使う処理を含む名前空間をインポートしておくことで、プログラムを短くすることが出来ます。 また、適切に宣言されているとプログラムの持つ機能の傾向が予想できます。

  • 「System.IO」と「Newtonsoft.Json」があるので、Json形式のデータの入出力があるのかもしれない。
  • 「System.Threading.Tasks」があるので、非同期処理があるのかもしれない。
  • 「Microsoft.Azure.WebJobs」「Microsoft.Azure.WebJobs.Extensions.Http」があるので、Webjobsの拡張Httpの機能を使うのかもしれない。
  • 「Microsoft.Extensions.Logging」があるので、ログに関係する処理を行うかもしれない。

このプログラムの場合はこんな感じに予想できますが、実際はどうなんでしょうかね。

11行目  名前空間

プログラムの目次のようなものといったイメージでしょうか。 階層(入れ子)を持つことができ、外部から参照するときの名称になります。 インポートする場合は、1~9行目のように上位の名前空間から「.(ドット)」で区切って連ねていきます。

12行目他の「{」「}」

各ブロックの範囲を示しています。
インデントと合わせて、ソースは見やすく書きましょう。

13行目  クラス

具体的な処理やそこで使用する値、変数などをまとめておく単位。ここでは「Public static」で宣言されているので、外部から呼び出すことができ、その時にインスタンスの生成は必要ありません。

15行目  Azure Functions独自の属性

今回のプログラムを呼び出すときの名称になります。ここの引数を変更すると、手順の7.のURLの最後の部分も変更されます。

16~17行目  メソッド

具体的な処理を記述するブロックです。

・「Public static」はクラスのときと大体同じ意味です。

・「async」は非同期処理として実行されることを表しています。

・「Task<IActionResult>」はIActionResult型の戻り値を戻す非同期処理であることを表しています。

・「Run([HttpTrigger(AuthorizationLevel.Anonymous, “get”, “post”, Route = null)] HttpRequest req,ILogger log)」について

  1. Run(①,②)」は指定された処理(①)をキューに配置し、ハンドルを戻します。
  2. 「 [HttpTrigger(AuthorizationLevel.Anonymous, “get”, “post”, Route = null)] HttpRequest req 」は認証レベル[匿名]で「get」「post」のリクエストを認識し、reqに格納します。
  3. ILogger log」は必須ではありません。設定しない場合は、20行目を削除する必要があります。そうした場合、コマンドプロンプトに出力される情報が少なくなります。

20行目 ここからが処理部分

コマンドプロンプトのURLをブラウザで開いた時の処理になります。

引数の文字列をコマンドプロンプトに出力します。

22行目

メソッド(16~17行目)の第一引数のreqの中の「name」という項目を抽出し、変数:nameに取り込みます。
ブラウザで開くURLの最後に「?name=」を追加することで、「name」パラメーターを追加することができます。

24行目

reqの中の「body」という項目を非同期で読み込み、変数:requestBodyに取り込みます。

25行目

requestBodyを逆シリアル化して変数:dataに取り込みます。
dynamic型はコンパイル時に型チェックを行い型を決定します。object型に近い動作をするようです。

26行目

nameがnull以外の場合nameを返し、nullの場合はdata?.nameの値をnameに取り込みます。

??演算子:左側がnull以外の場合はその値を返し、nullの場合は右側の値を返します。
data?.name:dataがnullの場合null返し、それ以外の場合はdata.nameを返す。

28~30行目

if文ですね。 変数:responseMessage に取り込む文字列を判定しています。

nameがnullかemptyの場合、「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.」を取り込む。

32行目

変数:responseMessage を含めたステータス200のエンティティボディを生成しメソッドの戻り値として返します。

これで一応ソースについての説明が終わりました。
長くなったので今回はいったんここまで。

次はとりあえずプロジェクトのデプロイについて書きたいと思います。

L7 負荷分散 Azure Application Gateway について:3回目前のページ

Azure VMの自動起動停止を行う次のページ

関連記事

  1. 未分類

    「Azure Functions」をC#で触ってみました。#5

    どうも、kenji.mです。 Durable Functionsを…

  2. 未分類

    「Azure Functions」をC#で触ってみました。#2

    どうも、kenji.mです。前回はプロジェクトを作成して、どのような…

  3. 未分類

    「Azure Functions」をC#で触ってみました。#3

    どうも、kenji.mです。今回は#2でデプロイしたプログラムについ…

  4. 未分類

    「Azure Functions」をC#で触ってみました。#4

    どうも、kenji.mです。 今回はDurable Function…

関連記事

  1. Azure

    AADDSを構築する記事
  2. Azure

    Azure Key Vaultでみんなしあわせ
  3. Azure

    WindowsVirtualDesktopがGAされているので(その1)
  4. Azure

    Azure 資格試験の更新(2020年版)AZ-203編
  5. Azure

    祝日判定を使った自動起動について:Azure Automation
PAGE TOP