Azure Function から Twilio Programmable API を使って SMS 通知を送信する

データが格納された時、システムに何かイベントが発生したとき、簡単に携帯にメッセージが送れると便利かな．．．ということで Azure Function (または Azure Logic App) ＋ Twilio を使って SMS 通知を送る方法を (今更) 解説します。

# 準備

## Twilio アカウント

(無償の) Trial Account でとりあえず大丈夫です。Trial Account の制限 (注意点) として、アカウント作成時に携帯電話 (SMS または 音声) で認証を行う (verification code を取得する) のですが、**その認証に利用した携帯電話のみに SMS を送信可能**、というところです (その携帯電話以外に送りたい場合は有償版に Upgrade が必要)。

### Twilio Phone Number

Twilio Phone と呼ばれる電話番号を取得すると、そちらを発信元として SMS や音声を送受信できます。(今回は SMS 送信のみですが．．．)
Trial Account でも無料で取得することができます。International SMS / Call にならないように日本の番号を選びましょう。
**ただし、SMS を送信したい場合は US (+1) の番号を取得する必要があります。**

## Twilio SDK

今回は C# を利用します。Visual Studio から Nuget で取得しますので、ライブラリーの個別ダウンロードは不要です。もし内容などを確認したい方はこちらにあります。
Github > [Twilio / Twilio-csharp](https://github.com/twilio/twilio-csharp) 

## 開発ツール
Visual Studio 2017 or Visual Studio Code (いずれも無償版でOKです。)
Azure Functions Tools ([Visual Studio 2017 用](https://marketplace.visualstudio.com/items?itemName=VisualStudioWebandAzureTools.AzureFunctionsandWebJobsTools) / [Visual Studio Code 用](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurefunctions)) を追加インストールしておきます。

## Microsoft アカウント & Azure サブスクリプション
[準備方法](https://qiita.com/annie/items/cf93a7a832123946a7da#%E6%BA%96%E5%82%99) をご覧ください


# 手順

## Twilio で 携帯電話に SMS を送るための準備

以下を確認し、ローカルに保存しておきます。
 - AccountID
 - AuthToken
 - Twilio Phone Number (※国番号から。今回は US 番号なので "+1")

## Twilio Messaging API の動作確認

### Twilio コンソールから SMS 送信確認

アカウントにサインインしていると、AccountID, AuthToken の情報などは自動入力されています。以下の情報を入力 and/or 確認して、SMS を送信します。

 - To : SMS 送信先 (※ Trial Account の場合は、アカウント登録時に使用した携帯電話番号のみ)
 - From : 取得した Twilio Phone の番号
 - Body : SMS で送りたい本文

※ To および From の電話番号は国番号から入力する必要があります。

### Rest API ツールから Twilio API の動作確認

Postman などお好みの Rest API テストツールで確認を行います。

Twilio API の Base URL はこちらになります。
https://api.twilio.com/2010-04-01

挙動の確認として、以下のように AccountID と AuthToken をバインドして API 送信が可能です。
https://[AccountID]:[AuthToken]@api.twilio.com/2010-04-01

#### Account の情報の取得

https://[AccountID]:[AuthToken]@api.twilio.com/2010-04-01/Account

Response 200 が返されれば動作確認は OK です。 

#### SMS 送信

https://[AccountID]:[AuthToken]@api.twilio.com/2010-04-01/Accounts/[AccountID]/Messages
Get の場合、Header に電話番号をバインドします。
 - From: 発信元電話番号
 - To: 送信先電話番号

Response 200 が返されれば動作確認は OK です。(実際には SMS が送られてこなかったりしますが問題ありません)

### C# アプリケーションから Twilio API の動作確認

簡単なコンソールアプリから C# ライブラリーを使った SMS 送信を確認します。
C# コンソールアプリを作成し、NuGet で Twilio というライブラリーを追加します。
Twilio コンソールで表示されるソースコードをコピーすればOKです。
Program.cs は以下のようなコードになります。

```csharp:Program.cs
using System;
using System.Collections.Generic;
using Twilio;
using Twilio.Rest.Api.V2010.Account;
using Twilio.Types;

namespace HelloTwilio_201902
{
    class Program
    {
        private static string _accountSid = "YOUR_ACCOUNT_SID";
        private static string _authToken = "YOUR_AUTH_TOKEN";

        static void Main(string[] args)
        {
            TwilioClient.Init(_accountSid, _authToken);
            var message = MessageResource.Create(
              to: new PhoneNumber("YOUR_MOBILE_NUMBER"),
              from: new PhoneNumber("YOUR_TWILIO_NUMBER"),
              body: "こんにちは！Twilo から SMS メッセージを送るよ！");
            Console.WriteLine($"Success. message.Sid=" + message.Sid);
            Console.ReadKey(); //SMS 送信した後、ウインドウを開いたままにする

        }
    }
}
```

## Azure Function から Twilio Messaging API で SMS を送る

TimerTrigger と呼ばれる指定した時間に起動する Function を使って SMS を送信してみます。

Visual Studio で新規プロジェクトを作成し、Azure Function を作成します。
Trigger には TimerTrigger を選択します。とりあえずデフォルト (毎時0分から5分ごと) で設定します。

先ほどと同様に、NuGet から Twilio パッケージを追加しておきます。

デフォルトで作成されている Function (functions1.cs) を以下のように書き換えます

```csharp:functions1
using System;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
// 追加
using System.Net.Http;
using Twilio;
using Twilio.Rest.Api.V2010.Account;
using Twilio.Types;


namespace AzFuncSMSNotify201902
{
    public static class Function1
    {
        // Twilio アカウント情報、携帯電話情報を仮にこちらで設定します
        private static string _accountSid = "YOUR_ACCOUNT_SID";
        private static string _authToken = "YOUR_AUTH_TOKEN";
        private static string _fromPhoneNumber = "YOUR_TWILIO_NUMBER";
        private static string _toPhoneNumber = "YOUR_MOBILE_NUMBER";

        // HTTP リクエストを送信するための HTTP Client を作成しておきます
        private static HttpClient client = new HttpClient();

        [FunctionName("Function1")]
        public static void Run([TimerTrigger("0 */5 * * * *")]TimerInfo myTimer, ILogger log)
        {
            log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");

            // SMS を送信する
            TwilioClient.Init(_accountSid, _authToken);
            var twilioMessage = MessageResource.Create(
                to: new PhoneNumber(_toPhoneNumber),
                from: new PhoneNumber(_fromPhoneNumber),
                body: $"ローカル時間をお知らせします: {DateTime.Now}"
            );

        }
    }
}
```

こちらをビルドして実行します。携帯電話に SMS メッセージが送られてくれば動作確認完了です。