Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
ハロウィーン楽しんでますか?
今回は 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 押下。
3. ブレークポイントを張って、Postman 等でアクセス。ブレークポイントにヒットするか確認。
C# での Azure ファンクション
ワークショップの最後に C# もやってみてくださいとあるので、Visual Studio 2017 と C# で同じ Azure ファンクションを作成します。
1. 新しいプロジェクトより、”Azure Funcitons" を選択。名前を任意で作成。ここでは ”MyFunctions” にして作成。
2. プロジェクト右クリック | 追加 | 新しい項目 より、”Azure 関数” を “LanceFetcher.cs” として追加。
3. Azure ファンクションは様々な方法で呼び出しが可能。ここでは Http trigger を選択。また権限はだれでも実行できるように Anonymous を選択。
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 を確認。
5. Postman で POST を実行。結果を確認。
6. デバッグはいつも通りなので割愛。
まとめ
今回はモジュール 2 までの内容を深堀してみました。次回はモジュール 3 の紹介と Deep Dive を紹介します。
中村 憲一郎