Lambda不要！SMSを送信するAlexaスキルを作る

# はじめに
Alexaは、『声』という直感的なインターフェイスを使って様々なサービスを利用することができます。
利用するサービスは自分で『スキル』を構築することにより拡張でき、オリジナルのサービスをAlexaを通して利用することができます。
ここでは、Twilioを使ってSMSを送信するAlexaスキルの作り方を紹介します。Lambdaを使わないので、AWSアカウントは必要ありません。

## 前提
この記事では以下を前提としています。

- Alexa 開発者アカウントを持っている（https://developer.amazon.com/ja/alexa からサインインできる）
- Twilioアカウントを持っている
 - もしTwilioアカウントをもっていない場合は、[https://jp.twilio.com/try-twilio/kddi-web](https://jp.twilio.com/try-twilio/kddi-web)からサインアップしてください。

## 目次
1. SMS送信用の電話番号を取る
2. Alexaスキルを作る
3. スキルの呼び出し名、インテントを設定する
4. Twilio FunctionでSMS送信処理部分をつくる
5. AlexaスキルとTwilio Functionをつなぎこむ
6. テスト

### 1. SMS送信用の電話番号を取る
Twilioコンソールに[こちら](https://jp.twilio.com/console)からログインします。

左のメニューから『Phone Numbers』を選択し、『番号の管理』から『番号を購入』（+ボタン）を選択します。

<img width="776" alt="phone_number_menu.png" src="https://qiita-image-store.s3.amazonaws.com/0/268190/3f83d783-99c0-46ae-bcd1-b58d0ea8e135.png">

Twilioでは、日本の番号からSMSを送信することができません。アメリカ番号（+1で始まる番号）を購入する必要があります。そのため、『COUNTRY』では『United States』を選択し、『機能』で『SMS』にチェックを入れて検索してください。

<img width="1162" alt="phone_number_search.png" src="https://qiita-image-store.s3.amazonaws.com/0/268190/45fb0d3a-5fce-e67c-6b33-bc3a41d032df.png">


検索結果に表示された番号の中から好きなものを選び、『購入』ボタンをクリックして購入してください。

<img width="1134" alt="phone_number_purchase.png" src="https://qiita-image-store.s3.amazonaws.com/0/268190/3d2dcac7-9623-fdb1-d608-17e1f8a6c077.png">


### 2. Alexaスキルを作る
Alexaデベロッパーコンソールに[こちら](https://developer.amazon.com/ja/alexa)からサインインします。
『スキルを作成』ボタンをクリックし、スキル作成画面に遷移します。

<img width="1336" alt="skill_create.png" src="https://qiita-image-store.s3.amazonaws.com/0/268190/01e82ef3-b26f-e3c0-edfa-61cf4acf61ce.png">

スキル名、デフォルトの言語（日本語）、スキルに追加するモデル（カスタム）を選択し、『スキルを作成』ボタンをクリックすると、新しいスキルが作成できます。

<img width="1342" alt="skill_create_finish.png" src="https://qiita-image-store.s3.amazonaws.com/0/268190/d22e1433-68ac-b5a9-e914-9cbd3644bbd1.png">


### 3. スキルの呼び出し名、インテントを設定する
スキルの管理画面で、左のメニューから『呼び出し名』を選択します。

<img width="1340" alt="skill_call_name.png" src="https://qiita-image-store.s3.amazonaws.com/0/268190/93a4fabf-17d1-df83-2551-454e7f6ec558.png">

呼び出し名は、『アレクサ、〇〇で■■して』とAlexaに話しかけたときの『〇〇』にあたる部分です。
好きな名前を入力してください（今回は『おくるくん』とします）。入力したら、『モデルを保存』ボタンで入力値を保存します。

<img src="https://vigorous-crush-3355.twil.io/assets/skill_call_name_finish.png">


次に、左メニューのインテントで『追加』をクリックします。

<img src="https://vigorous-crush-3355.twil.io/assets/skill_intent_add.png">

インテントは、『アレクサ、〇〇で■■して』とユーザーからリクエストを受けたあと、そのリクエストに対応して行われる処理のことを指します（詳細については、[こちら](https://developer.amazon.com/ja/docs/custom-skills/understanding-how-users-invoke-custom-skills.html)をご参照ください）。

『追加』をクリックすると、インテントの名前入力欄が表示されます。インテントの名前はこの後作成するTwilio Functionのコードでも使用しますので、アルファベットの大文字、小文字、アンダースコアのみを使い、わかりやすい名前をつけてください（今回は『SendSms』とします）。
名前の入力後、『カスタムインテントを作成』をクリックします。

<img src="https://vigorous-crush-3355.twil.io/assets/skill_intent_create.png">

カスタムインテントの作成後、そのインテントの詳細設定画面に遷移します。ここでは『サンプル発話』を入力します。
サンプル発話は、『アレクサ、〇〇で■■して』の『■■して』の部分にあたります。サンプル発話に登録した内容がAlexaにリクエストされると、サンプル発話が登録されているインテントが実行されます。
ここではサンプル発話を一つ入力します（実際にAlexaスキルを作成する場合は、表記ゆれを考慮し複数のパターンの発話を登録する必要があります）。
サンプル発話を入力したら、エンターキーで登録ができます。登録後、『モデルを保存』ボタンで入力値を保存します。

<img src="https://vigorous-crush-3355.twil.io/assets/skill_intent_create_finish.png">


### 4. Twilio FunctionでSMS送信処理部分をつくる
次に、Twilioコンソールで左メニューから『Runtime』>『Functions』を選択します。
Functionsの『Configure』メニューを選び、『Enable ACCOUNT_SID and AUTH_TOKEN』にチェックを入れます。

<img src="https://vigorous-crush-3355.twil.io/assets/function_configure_enable.png">

次に、『Environmental Variables』に以下のキーと値を追加します。

- APP_ID

スキルIDを入力します。
スキルIDは、AlexaデベロッパーコンソールのAlexaスキル一覧画面で『スキルIDの表示』から取得できます。

<img src="https://vigorous-crush-3355.twil.io/assets/skill_list.png">

- TWILIO_SMS_FROM_NUMBER

手順1で取得したTwilioのSMS送信用電話番号を入力します。
なお、このとき電話番号は[E.164形式](https://ja.wikipedia.org/wiki/E.164)で入力します。E.164形式の電話番号は、Twilioコンソールで『Phone Numbers』>『番号の管理』で該当番号をクリックし、表示される詳細画面の『電話番号』で確認できます。

- TWILIO_SMS_TO_NUMBER

SMSの送信先の電話番号です。同じくE.164形式で入力します。例えば、080-1234-5678に送信したいときは、+818012345678と入力します。
また、Twilioアカウントがトライアルアカウントの場合、SMS送信先に指定できるのはTwilioアカウント作成時に入力した電話番号だけです。

<img src="https://vigorous-crush-3355.twil.io/assets/function_conficure_env.png">

最後に、Dependenciesでモジュールを追加します。Nameに『alexa-sdk』、バージョンに『1.0.25』と入力します。

<img src="https://vigorous-crush-3355.twil.io/assets/function_configure_dependency.png">

終わったら、『Save』ボタンをクリックして入力値を保存します。

次に、Functionコンソールで『+』ボタンをクリックし、Functionを作成します。タイプは『Blank』を選び、『Create』をクリックします。

<img src="https://vigorous-crush-3355.twil.io/assets/function_create.png">

Functionの編集画面に移動するので、『FUNCTION NAME』と『PATH』を入力します。

<img src="https://vigorous-crush-3355.twil.io/assets/function_name.png">

『ACCESS CONTROL』と『EVENT』は特に入力する必要はありません。
『CODE』の部分には以下のコードを貼り付けます。

```javascript
const Alexa = require('alexa-sdk');

const HELP_MESSAGE = 'エスエムエスを送信できます。おくるくん、エスエムエスを送ってと言ってみてください';
const MESSAGE_BODY = 'こんにちは！ AlexaからのSMSです';
const SENT_MESSAGE = 'エスエムエスを送信しました。';
const HELP_REPROMPT = '何ができますか?';
const STOP_MESSAGE = 'さようなら';

const handlers = {
    'LaunchRequest': function () {
        this.emit(':ask', HELP_MESSAGE, HELP_MESSAGE);
    },
    'SendSms': function () {
        const client = this.context.getTwilioClient();
        client.messages
        .create({
            body: MESSAGE_BODY,
            from: this.context.TWILIO_SMS_FROM_NUMBER,
            to: this.context.TWILIO_SMS_TO_NUMBER
       })
      .then(message => {
        console.log(message.sid);
        this.response.speak(SENT_MESSAGE);
        this.emit(':responseReady');
      })
    },
    'AMAZON.HelpIntent': function () {
        const speechOutput = HELP_MESSAGE;
        const reprompt = HELP_REPROMPT;

        this.response.speak(speechOutput).listen(reprompt);
        this.emit(':responseReady');
    },
    'AMAZON.CancelIntent': function () {
        this.response.speak(STOP_MESSAGE);
        this.emit(':responseReady');
    },
    'AMAZON.StopIntent': function () {
        this.response.speak(STOP_MESSAGE);
        this.emit(':responseReady');
    },
    'Unhandled': function () {
        this.response.speak(HELP_MESSAGE);
        this.emit(':responseReady');
    },
};

exports.handler = function (context, event, callback) {
    const alexa = Alexa.handler(event, context, callback);
    alexa.appId = context.APP_ID;
    alexa.registerHandlers(handlers);
    alexa.execute();
};
```

（コード内の'SendSms'が、手順3で作成したインテントと対応する処理です。）

<img src="https://vigorous-crush-3355.twil.io/assets/function_config.png">


終わったら、『Save』ボタンをクリックしてFunctionを保存・デプロイします。

デプロイ完了後、『PATH』のURLをコピーしてメモしておきます。このURLは手順5で使用します。


### 5. AlexaスキルとTwilio Functionをつなぎこむ
Alexaデベロッパーコンソールで左メニューの『エンドポイント』を選択します。

『サービスのエンドポイントの種類』で『HTTPS』を選択し、『デフォルトの地域』に手順4で作成したFunctionのURLを入力します。
証明書は、『開発用のエンドポイントは、証明機関が発行したワイルドカード証明書を持つドメインのサブドメインです』を選択します。

<img src="https://vigorous-crush-3355.twil.io/assets/function_endpoint.png">


入力が終わったら『エンドポイントを保存』ボタンで入力値を保存します。

### 6. テスト
Alexaデベロッパーコンソールの上部メニューで『ビルド』を選択し、『モデルをビルド』をクリックします。

<img src="https://vigorous-crush-3355.twil.io/assets/alexa_skill_build.png">

ビルド完了までには数分かかり、完了したらそのメッセージが表示されます。
ビルドが完了したら『テスト』を選択します。もしスキルのテストが無効になっていた場合は有効化します。
入力欄に『アレクサ、{呼び出し名}で{サンプル発話}』と入力します。例えば、『呼び出し名』に『おくるくん』、『サンプル発話』に『エスエムエスを送って』と入力していたら、『アレクサ、おくるくんでエスエムエスを送って』と入力します。
すると処理が実行され、SMSが送信されてきます。

<img src="https://vigorous-crush-3355.twil.io/assets/alexa_test.png">

<img src="https://vigorous-crush-3355.twil.io/assets/sms.png">

これでSMSを送信するAlexaスキルの作成は完了です。

## Twilio SDKについて
今回、Twilio FunctionではTwilioのSDKを利用してSMSを送信しています。
TwilioSDKでは、SMS以外にも『電話をかける』『LINEやFacebook Messangerにメッセージを送る』『プッシュ通知』『Faxを送る』など様々な機能を簡単に利用することができます。

Alexaスキル開発にTwilioを利用し、様々なコミュニケーション機能を組み込んでみてください。

ほかにもいくつかの例を用意しました。参考になれば幸いです。

[AlexaにTwilioを使用してコミュニケーション機能を組み込む](https://qiita.com/twilioforkwc/private/2e31347acda73e4ba1a8)