かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

Azure Functions を VS2017 Preview を使って開発する方法

Azure Functions の開発のサポートって VS2017 Preview 版でしかされてないんですよね…。ということで今回は VS2017 Preview を使ってます。15.3のバージョン早く正式版にならないかなぁ。

因みに、ドキュメントでは拡張機能でFunctions用の拡張機能入れろって書いてあるけど最新の VS2017 Preview にしたら無くてもできるっぽいですね。(逆に拡張機能入れてたから消さない?っていうダイアログが出てきた)

docs.microsoft.com

Functions の作成

プロジェクトの新規作成から Azure Functions を選んで作成できます。

f:id:okazuki:20170813122926p:plain

local.settings.json を見てみるとストレージアカウントの接続文字列入れる感じの雰囲気をかもしだしてるのですが、今回は無視します。

HTTPトリガー以外を使う場合は設定しないといけないみたい

関数の作成

さて関数を追加しましょう。項目の追加で Azure Function というのがあるので、それを選びます。とりあえず Echo って名前で作ってみました。

トリガーを選べるので Http POST CRUD を選んで他の設定項目は特にいじらずにOKをします。

f:id:okazuki:20170813125718p:plain

そうすると、デフォルトでテーブルストレージにデータを出力する関数が作成されます。

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
{
    public static class Echo
    {
        [FunctionName("Echo")]
        public static 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);
        }

        public class Person : TableEntity
        {
            public string 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
{
    public static class Echo
    {
        [FunctionName("Echo")]
        public static 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")]
        public string Name { get; set; }
    }
}

素晴らしい。タイプセーフ。型がある!いい!!

F5で実行できます。私の場合は先日node.jsで実行環境とか整えてたのですんなりいきましたが、人によってはここで追加のツールインストールなどを求められるみたいですね。(ドキュメントによると)

Postman を使ってURLに対して適当なJSON突っ込むといい感じに結果が返ってきました。

f:id:okazuki:20170813131206p:plain

配備してみよう

作ったら Azure で配備ですね。もともとこのBlog記事はこのつぶやきの疑問を解消するためなので、ここからが本題!

プロジェクトを右クリックして発行をクリックします。するとこんな感じの画面が出てきます。

f:id:okazuki:20170813131602p:plain

今回はAzure関数アプリの発行ですね。今回は新規に作りましょう。そして適当に項目を埋めていきます。

f:id:okazuki:20170813132001p:plain

あとは、作成を押すといい感じにAzure上に必要なものを作ってくれます。作り終わったらこんな画面になるので発行を押しましょう。

f:id:okazuki:20170813132351p:plain

ポータルで以下のように確認できます。

f:id:okazuki:20170813132559p:plain

ポータルの右上の関数のURLを取得を選択して呼び出すためのURLをゲットしたら Postman で適当な JSON を叩き込んでみましょう。

f:id:okazuki:20170813132756p:plain

いい感じですね。

まとめ

VS2017 で C# で Functions を開発すると

  • タイプセーフでとてもいい。(個人の感想です)
  • ツールサポートが充実しているので、とても快適に作れる。
  • ASP.NET WebAPIやASP.NET CoreよりもちょっとしたAPI作るのには手軽でいい。好きになりそう。

ということでした!おしまい。