Twilioを使ってIoTボタンで連続架電を行う


はじめに

本記事は「SORACOM LTE-M Button powered by AWS Advent Calendar 2018」12月7日(金)の記事です。
https://qiita.com/advent-calendar/2018/soracom

やりたいこと

SORACOM LTE-M Buttonを使って電話をかける記事については、以下のブログがとても参考になります。
SORACOM Buttonで会議脱出ボタンをつくる

SORACOM LTE-M Buttonのセットアップ方法については、以下の記事が参考になります。
SORACOM LTE-M Button powered by AWS 「ご購入、利用開始方法」のチュートリアル #SORACOM

本記事ではより実践的に、予め通知したい相手を複数用意しておいて、誰かが応答するまで順番に電話をかけていくようにしたいと思います。
Twilioには、ドラッグアンドドロップでコールフローが作成できる「Twilio Studio」と呼ばれる機能があり、この機能を利用することでプログラミングをしなくても応用ができるようになります。

Twilio Studioを使って順番に電話をかける方法については、私が書いた以下の記事がありますので、今回はこちらの記事にある連続架電のトリガーとして、SORACOM LTE-M Buttonを利用したいと思います。
Twilio FunctionsとStudioを使って連続架電を行う

この記事を読まれている方は、すでにボタンの設定方法やLambdaのデプロイなどはご存知かと思いますので、ここでは連続架電についてと、それを呼び出す方法にフォーカスをして解説をしていきます。

準備

まずは、上記の連続架電の記事に従って、Twilio Studioを使った架電フローを作成してください。

作成したFunctionのRuntimeドメイン名と、作成したTwilioアカウントのAuthTokenが必要になりますので、予め調べておきます。
Runtimeドメインは、管理コンソールのRuntimeの概要ページに表示されています。

AuthTokenは、管理コンソールのダッシュボードに表示されています。

ハンズオン

では早速始めていきましょう。
今回は以下の環境で作業をします。

  • Node 8.x以降
  • npm
  • git

ソースコードの準備

まずは、適当な作業フォルダに移動してから以下の手順でLambdaのコードを生成します。

$ git clone https://github.com/mobilebiz/iotstudio.git
$ cd iotstudio
$ npm install

展開されたソースコードは以下のようになっています。
基本的には、すでに作成しているTwilio Function(SerialCallStudio)をLambdaから呼び出すコードですが、Functionのセキュリティ対策として、X-Twilio-Signatureを利用したアクセス認証を実装しています。
X-Twilio-Signatureの実装については、こちらの記事でも解説しています。

exports.handler = function(event, context, callback) {
    const crypto = require('crypto');
    const https = require('https');

    // Twilio Account Sid and Auth Token
    const authToken = process.env.AUTH_TOKEN;

    // Twilio Function Domain
    let functionDomain = process.env.FUNCTION_DOMAIN;

    // Make a X-Twilio-Signature
    const signature = crypto.createHmac('sha1', authToken)
        .update(new Buffer(`https://${functionDomain}/serial-call-studio`, 'utf-8'))
        .digest('Base64');

    // HTTPS Options
    const options = {
        hostname: functionDomain,
        port: 443,
        path: '/serial-call-studio',
        headers: {
            'X-Twilio-Signature': signature
        }
    };

    // Function request
    const req = https.get(options, (res) => {
        let result = '';
        res.setEncoding('utf8');
        res.on('data', (chunk) => {
            result = chunk;
        });
        res.on('end', () => {
            callback(null, result);
        })
    });

    // Error handling
    req.on('error', (e) => {
        callback(e);
    });

    req.end();
}

Lambdaへのアップロード

作成したコード一式をZIPファイルにして、AWS Lambdaにデプロイしていきます。

  • 以下のコマンドを使って、index.jsとnode_modulesフォルダをiotstudio.zipというファイルに圧縮します。
$ zip iotstudio.zip -R index.js node_modules

次にAWS Lambdaを作成していきます。今回は、すでにLTE-M ButtonはIoT 1-Clickでデバイス登録されている前提ですすめます。

  • AWSにログインして、AWS Lambdaサービス画面に移動します([注意] ボタンをセットアップしたリージョンで作業してください)。

  • 右上にある関数の作成ボタンを押します。

  • 一から作成が選択されている状態で、名前フィールドに「IoTStudio」、ランタイムは、「Node.js 8.10」、ロールは「既存のロールを選択」、既存のロールのプルダウンから「lambda_basic_execution」を選択します。

  • 関数の作成ボタンを押します。

次に先ほど作成したZIPファイルをアップロードします。

  • 関数コードセクションにスクロールします。
  • コード エントリ タイプのプルダウンから、「.zip ファイルをアップロード」を選択します。
  • 関数パッケージの下にあるアップロードボタンを押して、先程作成したiotstudio.zipを選択します。

次に環境変数を設定していきます。

  • 環境変数セクションに移動します。
  • 以下のキーと値を設定します。
キー
AUTH_TOKEN 先程控えておいたTwilioのAuth Token
FUNCTION_DOMAIN 先程控えておいたTwilio Runtimeのドメイン名

  • 右上の保存ボタンがオレンジ色に変化するので、そのボタンを押します。

この時点で連続架電ができるかを確認します。

  • 画面上部にあるテストボタンを押します。
  • テストイベントの設定ダイアログが開きます。
  • 新しいテストイベントの作成にチェックが入っている状態で、イベント名に「run」と入力します。
  • イベントのコードが5行表示されているので、2行目から4行目までを削除します。

  • 作成ボタンを押します。

  • 画面がもとに戻るので、画面上部にあるテストボタンを押します。

  • 実行が完了し、以下のように成功すればOKです。

LTE-M Buttonの設定

ここからは、LTE-M Buttonの設定となります。ここでは、すでにデバイスの登録は完了しているとして作業を進めます。

  • AWSのAWS IoT 1-Clickサービス画面に移動します。
  • 管理メニューに移動します。

  • プロジェクトの作成ボタンを押します。

  • プロジェクト名に、「IoTStudio」と入力し、次へボタンを押します。

  • デバイステンプレートの定義の右側にある開始というリンクをクリックします。

  • すべてのボタンタイプというリンクをクリックします。

  • デバイステンプレート名に「IoTStudio」と入力し、アクションのプルダウンから「Lambda関数の選択」を選択します。

  • AWSリージョンは、先程Lambda関数を作成したリージョンを選択し、Lambda関数のプルダウンリストから「IoTStudio」を選択します。

  • 画面下部のプロジェクトの作成ボタンを押します。

つぎに、実際のボタンと今作成したプロジェクトを紐付けます。

  • プレイスメントの作成ボタンを押します。
  • デバイスのプレイスメント名には、何か適当な名前をつけます。
  • IoTStudioテンプレートセクションのデバイスの選択をクリックします。
  • 登録されているボタンの一覧が表示されるので、割り当てたいボタンを選択します。

  • プレイスメントの作成ボタンを押します。

以上でAWS側の設定はすべて完了です。
ボタンを押して、電話がかかってくるかを確認します。

Functionの設定

このままでも利用はできますが、今回はX-Twilio-Signatureを設定したので、最後にTwilio Function側の設定を行います。

  • Twilioの管理コンソールにログインします。
  • RuntimeFunctionsを選択し、さらに管理メニューの中から、「SerialCallStudio」を選択します。
  • ConfigurationセクションにあるCheck for valid Twilio Signatureのチェックを入れます。

  • Saveボタンを押して、デプロイが完了するのを待ちます。

以上で作業はすべて終了です。