Azure Serverless ワークショップ Deep Dive : モジュール 1 - 2

ハロウィーン楽しんでますか?

今回は Serverless Conf 開催記念ということで、GitHub 上にある Azure Serverless ワークショップの Deep Dive をやります。各モジュール事に、まずワークショップをやってからこちらをご覧ください。

GitHub: Azure Serverless Workshop 日本語版

ワークショップの概要

このワークショップはボットをフロントエンドに使い、バックエンドに各種 Azure Serverless テクノロジーを使っています。各モジュールごとにボットが強化されていく様は、なかなか面白いです。ユーザーがボットにタスク(コマンド)を送ると、ボットが必要なことを聞いてくるので、すべて返信すると結果が返される仕組みです。

前提条件

Windows でも Mac でも動作するように作られています。必要なものはワークショップの手順にあるのでそちらを参照。このブログでは、Windows ベースでの検証をします。

モジュール 1

ワークショップの紹介と事前準備だけのため、Deep Dive 不要。Visual Studio 2017 など各種ツールは最新にすることを推奨します。

モジュール 2 モジュール 2 では Azure ファンクションの作成が学べます。

Azure Functions Core Tools (@core)

Azure Function Core Tools は .NET Core で動作する Azure Function を作成したり実行できるツールです。実はこのツールバージョン 2 であり、Windows 環境用にバージョン 1 もあります。挙動が違いますがコマンドが同じため間違えると面倒です。必ず以下コマンドでモジュールをインストールしてください。

 npm install -g azure-functions-core-tools@core 

以下、簡単な見分け方です。

- func new とした時の言語選択 : 今日時点でバージョン 2 は選択肢が C# と JavaScript のみだが、バージョン 1 は豊富。
- application.json と local.settings.json : バージョン 1 は構成ファイルとして application.json を作成するが、バージョン 2 は local.settings.json

ここさえ間違えなければほぼ大丈夫です。

デバッグ方法

ワークショップでは紹介していないものとして、VSCode でのデバッグがあります。

1. 以下のコマンドで Azure ファンクションを起動。

 func host start --debug vscode

2. VSCode を起動して、デバッグメニューを開く。Attach to Azure Functions があるので、そのまま F5 押下。

image

3. ブレークポイントを張って、Postman 等でアクセス。ブレークポイントにヒットするか確認。

C# での Azure ファンクション

ワークショップの最後に C# もやってみてくださいとあるので、Visual Studio 2017 と C# で同じ Azure ファンクションを作成します。

1. 新しいプロジェクトより、”Azure Funcitons" を選択。名前を任意で作成。ここでは ”MyFunctions” にして作成。

image

2. プロジェクト右クリック | 追加 | 新しい項目 より、”Azure 関数” を “LanceFetcher.cs” として追加。

3. Azure ファンクションは様々な方法で呼び出しが可能。ここでは Http trigger を選択。また権限はだれでも実行できるように Anonymous を選択。

image

3. 作成されたテンプレートにはサンプルコードがあるため、内容を確認。やり方が分かった所で以下のコードに差し替え。

 using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
using System.Net.Http.Formatting;
using Newtonsoft.Json.Linq;

namespace MyFunctions
{
    public static class LanceFetcher
    {
        [FunctionName("LanceFetcher")]
        public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log)
        {
            log.Info("C# HTTP trigger function processed a request.");

            dynamic data = await req.Content.ReadAsAsync<object>();

            // Body を確認。
            if (data != null)
            {
                const string long_lance = @"
         TTT
       TTTTTTTTT
    TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
       TTTTTTTTT
         TTT";

                const string short_lance = @"
       TTT
    TTTTTTTTTTTT
       TTT";
                
                var material = data?.lance_material == "wood" ? "w" : "m";
                var lance = data?.lance_length == "short" ? short_lance.Replace("T", material) : long_lance.Replace("T", material);
                JObject resData = new JObject();
                resData["message"] = $"Here's your lance! {lance}";
                return req.CreateResponse(HttpStatusCode.OK, resData, JsonMediaTypeFormatter.DefaultMediaType);
            }
            else
            {
                return req.CreateResponse(HttpStatusCode.BadRequest, "I couldn't figure out how to do that...");
            }
        }
    }
}

4. F5 を押下してデバッグ。起動するとコンソールで以下の表示。Azure 関数が起動した URI を確認。

image

5. Postman で POST を実行。結果を確認。

image

6. デバッグはいつも通りなので割愛。

まとめ

今回はモジュール 2 までの内容を深堀してみました。次回はモジュール 3 の紹介と Deep Dive を紹介します。

中村 憲一郎