IoTポストで投函されたら電話が鳴るようにしてみた

この投稿は、[こちらの記事（IoTポストの紹介）](https://qiita.com/roi-dev/private/5d4acc399e1f78002d1a) の続きです。

# IoTスマートポストに投函されたら電話を鳴らしてみる
前回のIoTポストでは投函されたらメールが届いていましたが、ここではAWSの機能を利用して、電話が鳴るようにしてみました。

AWSのサーバレス「Lambda」経由で「Amazon Connect」という電話コールセンターの仕組みを一部利用して、投函物を検知したら、所定の電話番号に通話が開始されて、投函物が来た旨のお知らせができるようになりました。

具体的には下記の図のように、マイコンボードから Amazon API Gateway から「Lambda」上のPythonの関数を起動し、Amazon Connectに接続して、指定の電話番号に通話する機能を構築しています。Amazon Connectを利用するメリットとしては、電話が鳴って出ると、合成音声によって、LambdaのPython上の文字列をそのまま日本語で読み上げられるというのが実現できることです。
今回は見送りましたが、ApiGatewayのパラメータの内容を動的にすることで、例えば、投函された時刻を音声で教えてくれるようにしたり、気軽に動的な読み上げが実現できる点ではないでしょうか。

<img width="864.75" alt="IoTポスト_FaaS経由電話で通知.png (60.6 kB)" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/73670ff7-9db6-7576-9097-0b787f596491.png">

所要時間は、アカウントが設定されていた状態から、調べながら・スクリーンショットを撮りながらで約2～3時間程度でした。
慣れていれば30分もかからないのではないでしょうか。

## Amazon Connectの設定
参考にしたのは、下記のブログ記事です

> Amazon Connectで月4ドルで電話発信する仕組みを構築する
> https://dev.classmethod.jp/cloud/aws/amazon-connect-system-alert/#toc-amazon-conenct

まず、

> Amazon Connectインスタンスの作成
> https://dev.classmethod.jp/cloud/aws/hello-connect-tokyo-region/#toc-amazon-connect

↑ これを見ながら、Connectのインスタンス～設定～試験まで行います。

![88d67739-299f-43ec-8a30-1534c43c7152.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/0775463a-647c-cf64-9e4f-f7e75b4daab4.png)

![746a170f-0104-4076-bda1-cade38615b4b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/9ef0cdc1-f9ec-9ba4-54a8-7935f608f56a.png)

テレフォニーオプションの着信にチェックを入れておいて、電話番号を取得～電話番号に問い合わせフローを紐付けておけば、得られた電話番号にかけると、試験ができます。
試験が終わったら、テレフォニーオプションの設定で着信のチェックは外しておきましょう。

## Lambdaの設定
LambdaからPython経由で電話をかけるような仕組みが出来ます。
ここでは、iotPost_AmazonConnect という名前で関数を作成しました。

``` lambda_function.py
import boto3
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    logger.info(event)
    logger.info(context)

    connect = boto3.client('connect', region_name='ap-northeast-1')
 
    message = 'IoTスマートポストからの通知です。投函を検知しました。投函物を取り出してご確認ください。ご利用ありがとうございました。'
    logger.info(message)

    response = connect.start_outbound_voice_contact(
        DestinationPhoneNumber='+810000004717',
        ContactFlowId='edf8xxxx-xxxx-xxxx-xxxx-xxxxxxxx16f4',
        InstanceId='e82dxxxx-xxxx-xxxx-xxxx-xxxxxxxx6cf3',
        SourcePhoneNumber='+815000000000',
        Attributes={
            'message': message
        }
    )
    logger.info(response)
```

![b14efede-1f92-4038-83ca-9146de809456.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/23079572-a878-ed6d-6af7-3da82b3df703.png)

### Lambda 関数のロールも設定しておきます。
ここでは、この関数にAmazon Connectの全権（AmazonConnctFullAccess）を与えておきます。
![0d9215b2-a22e-450f-9cf6-bf47cebd1db3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/9e970ea1-8de0-6289-90c4-b157b8428b35.png)

#### 鳴るかテスト１
ここでテストボタンを押して、適当な json で起動すると、電話が鳴り、lambda_function.py で指定した文字列が、日本語で読み上げられます。

<img width="320" alt="電話呼び出しイメージ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/3e1563a7-0f16-95c9-bd22-183f4d84f44b.png">


## API Gateway の設定
先程の記事にあった下記図のように、通常はAWSのSNSから通知先としての１つというイメージになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/afe37707-87ac-8918-bd71-5562da61d772.png" alt="一般的な位置づけ" width="400" />

今回は、API GatewayからLambdaの関数を呼び出します。
ここではPOSTメソッドでのセットアップでスクリーンショットを取っていますが、実際はGETメソッドでセットアップしました。
![56f3c482-1a9f-4949-b8b4-4a7d561378cb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/45858d09-b9be-28d4-6c87-5911b13b57a4.png)

リソースを確認すると、スクリーンショットのような画面が表示されます。

#### 鳴るかテスト２
テストをクリックすると、実際に電話が鳴り、アナウンスが聞こえるハズです。
![1a3bbdda-f8bb-44b8-bf51-c91a7b4ca749.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/a36207a6-1fa0-e7eb-9ca7-57260a808315.png)

#### 鳴るかテスト３
↓ API Gatewayの設定まで一通り終わると、このようなURLが得られるので、実際にGETメソッドでアクセスすると、電話が鳴り、投函された旨が通知されます。
https://？？？？？？？？？？？？.execute-api.ap-northeast-1.amazonaws.com/public
![a6714a54-ee6e-44f8-b156-2df363e6f399.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/50fd5fc4-fd04-9862-1123-316c895cc940.png)


## マイコンボード上の通知先URLを変更
あとは、Arduino IDEでマイコンボードの通知先URLを変更すればOK。

#### ルート証明書の問題が…
今回利用した ESP8266 側（Scketch上の WiFiClientSecure.h）に、AWSのSSL向けのサーバ証明書（ルート証明書）を含まれていないので、ApiGatewayへの直接SSLで通信が出来ず、http（非SSL）で別サーバかCloudFront経由で転送が必要でした。
もし実際に出荷するようなマイコンボードでSSLのような暗号化通信が要件の場合は、このルート証明書の発行元や有効期限などには気を使わないとダメですね。

DEMOは以上です。