Azure Functions の開発のサポートって VS2017 Preview 版でしかされてないんですよね…。ということで今回は VS2017 Preview を使ってます。15.3のバージョン早く正式版にならないかなぁ。
因みに、ドキュメントでは拡張機能でFunctions用の拡張機能入れろって書いてあるけど最新の VS2017 Preview にしたら無くてもできるっぽいですね。(逆に拡張機能入れてたから消さない?っていうダイアログが出てきた)
Functions の作成
プロジェクトの新規作成から Azure Functions を選んで作成できます。
local.settings.json を見てみるとストレージアカウントの接続文字列入れる感じの雰囲気をかもしだしてるのですが、今回は無視します。
HTTPトリガー以外を使う場合は設定しないといけないみたい
関数の作成
さて関数を追加しましょう。項目の追加で Azure Function というのがあるので、それを選びます。とりあえず Echo って名前で作ってみました。
トリガーを選べるので Http POST CRUD を選んで他の設定項目は特にいじらずにOKをします。
そうすると、デフォルトでテーブルストレージにデータを出力する関数が作成されます。
using System; 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 Microsoft.WindowsAzure.Storage.Table; namespace MyFuncApp { publicstaticclass Echo { [FunctionName("Echo")] publicstatic async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "post")]HttpRequestMessage req, [Table("person", Connection = "")]ICollector<Person> outTable, TraceWriter log) { dynamic data = await req.Content.ReadAsAsync<object>(); string name = data?.name; if (name == null) { return req.CreateResponse(HttpStatusCode.BadRequest, "Please pass a name in the request body"); } outTable.Add(new Person() { PartitionKey = "Functions", RowKey = Guid.NewGuid().ToString(), Name = name }); return req.CreateResponse(HttpStatusCode.Created); } publicclass Person : TableEntity { publicstring Name { get; set; } } } }
ここらへんの構成情報が全てアトリビュートでつけれるところが C# のいいところですね。JavaScriptでやる時は、function.jsonでメタデータ的なものを書いてたので、それに比べると凄くいい…。
ということで、簡単なEcho的な内容にさくっと書き直しました。
using System; 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 Microsoft.WindowsAzure.Storage.Table; using Newtonsoft.Json; namespace MyFuncApp { publicstaticclass Echo { [FunctionName("Echo")] publicstatic async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "post")]HttpRequestMessage req, TraceWriter log) { var data = await req.Content.ReadAsAsync<HttpRequestParameter>(); if (string.IsNullOrEmpty(data?.Name)) { return req.CreateResponse(HttpStatusCode.BadRequest, "Please pass a name in the request body"); } return req.CreateResponse(HttpStatusCode.OK, new { message = $"Hello {data.Name}!!", }); } } class HttpRequestParameter { [JsonProperty("name")] publicstring Name { get; set; } } }
素晴らしい。タイプセーフ。型がある!いい!!
F5で実行できます。私の場合は先日node.jsで実行環境とか整えてたのですんなりいきましたが、人によってはここで追加のツールインストールなどを求められるみたいですね。(ドキュメントによると)
Postman を使ってURLに対して適当なJSON突っ込むといい感じに結果が返ってきました。
配備してみよう
作ったら Azure で配備ですね。もともとこのBlog記事はこのつぶやきの疑問を解消するためなので、ここからが本題!
Lambda的なものかなー使ってみたいなーって思ってVSのプラグインとか入れたりAzure見に行ったりしてみたけどデプロイの仕方がわからずに詰んでます……
— 緋狐 (@aki_lua87) 2017年8月13日
プロジェクトを右クリックして発行をクリックします。するとこんな感じの画面が出てきます。
今回はAzure関数アプリの発行ですね。今回は新規に作りましょう。そして適当に項目を埋めていきます。
あとは、作成を押すといい感じにAzure上に必要なものを作ってくれます。作り終わったらこんな画面になるので発行を押しましょう。
ポータルで以下のように確認できます。
ポータルの右上の関数のURLを取得を選択して呼び出すためのURLをゲットしたら Postman で適当な JSON を叩き込んでみましょう。
いい感じですね。
まとめ
VS2017 で C# で Functions を開発すると
- タイプセーフでとてもいい。(個人の感想です)
- ツールサポートが充実しているので、とても快適に作れる。
- ASP.NET WebAPIやASP.NET CoreよりもちょっとしたAPI作るのには手軽でいい。好きになりそう。
ということでした!おしまい。