[Functions] Azure Functions - とりあえず立ち上げて公開

今日から何度かに分けてAzure Functionsに関して書いていきます。

今日の記事は3分ぐらいで読み切れます。
対象となる方は、これからAzure Functionsやってみようかな、サーバーレース環境ってどんなもんだろうと思っている方々でC#の知識をある程度もっている方々となります。

# Azure Functions?

Azure FunctionsとはVM、Webappなどの個サーバーを所持することなく、スクリプトやコードを起動することができます。最近よく聞く「サーバーレス」っていうやつです。

# まずは

いろいろ説明するよりもまずは使ってみましょう。「いろいろ」部分はこちらをご参照ください。https://docs.microsoft.com/ja-jp/azure/azure-functions/

## VS2017から新しいプロジェクト作成

Visual Studio を開いて新しいプロジェクトを作成、Azure Functionsを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/241909/35f01447-b497-6080-91d9-49d36b99bad9.png)

次に、Functionsのタイプを選択し、ストレージアカウントとアクセス権限を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/241909/0413a758-062c-d622-ef07-812aadf03f07.png)

## Function1.cs

「OK」をクリックすると、自動でFunction1.cs（"Hello" + Name を返すAPI
）が生成されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/241909/0b4f6804-20dc-6589-12ce-3bc5b755fc1e.png)

```csharp:Function1.cs
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;

namespace FunctionApp1
{
    public static class Function1
    {
        [FunctionName("Function1")]
        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.");

            // parse query parameter
            string name = req.GetQueryNameValuePairs()
                .FirstOrDefault(q => string.Compare(q.Key, "name", true) == 0)
                .Value;

            if (name == null)
            {
                // Get request body
                dynamic data = await req.Content.ReadAsAsync<object>();
                name = data?.name;
            }

            return name == null
                ? req.CreateResponse(HttpStatusCode.BadRequest, "Please pass a name on the query string or in the request body")
                : req.CreateResponse(HttpStatusCode.OK, "Hello " + name);
        }
    }
}
```

## Run - Endpointの取得
早速ローカル環境で起動してみます。FunctionApp1プレイボタンをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/241909/1b455519-b942-10f5-a43b-b8cccb2077d9.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/241909/4ac3bb8e-e000-41d1-a20c-36bbd3c95e5c.png)

## Run - nameを指定
http://localhost:7071/api/Function1 がendpointであると出てきました。.
指定されたエンドポイントのパラメターでname値を渡してみます。 http://localhost:7071/api/Function1?name=Sho

![image.png](https://qiita-image-store.s3.amazonaws.com/0/241909/47ce18c4-b256-5b16-b259-c92af6416626.png)

APIを介して値が生成されました。　下記でFunctionsが動いている内容を確認することができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/241909/8cd06af7-0f35-b3e6-0514-ca51cea27a16.png)

# 公開

次はFunctionsを公開して一般のユーザーが使えるようにします。

プロジェクトを右クリックして発行を選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/241909/91bb91b5-7341-7146-d73d-514302945580.png)

新規に作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/241909/cecb4c03-4420-b560-2bf8-3793ea3b1637.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/241909/58f784e4-f1a0-7363-610c-120448ed50b6.png)

作成できました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/241909/309c164d-c5d5-c85c-5865-cd5e31e6fdd6.png)

発行されたURLをたたいてみます。「Functions App は稼働しているよ」とのことで。次はパラメターを指定してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/241909/3cd788f0-386f-3dae-b05d-b3dcb570a42f.png)

では試しに
https://functionapp120190322072250.azurewebsites.net/api/Function1?name=Sho

![image.png](https://qiita-image-store.s3.amazonaws.com/0/241909/680f6bd2-299d-3a8d-aa28-bee480f229fa.png)

いけましたね。これで、Azure Functionsの本番化ができました。