Google HomeとAmazon Connectを使って声で電話してみる

# やったこと
Google homeに「OK, Google。電話して」というと、IFTTT経由でAmazon Connectから自分の携帯に電話する仕組みを作りました

# なぜ？
自宅内で携帯を見失い探すことがよくあるのですが、その場合は家族の携帯から電話してもらったり、TrackRなどを使ってたりするのですが、
家族がまだ寝てたり、TackRはbackgroundで動かしてないと作動しなかったりで、結局自力で探すことがあり、この仕組みを作りました。

# 構成概要
1. Google Homeが「電話して」という言葉に反応してIFTTTを呼び出します
1. IFTTTがAPI Gatewayに対して、HTTP GETリクエストを送ります
1. API GatewayがLambdaを起動します
2. LambdaがAmazon ConnectのOutboundCall APIを叩いて、事前指定した電話番号に電話します


# 準備1
まずは、Google HomeやIFTTTを覗いた部分(Amazon Connect, Lambda, API Gateway)を先に作ります

## Amazon Connect
1. 日本の番号が使えるのは今の所シドニーリージョンだけなので、シドニーリージョンで作成します
2. 日本の番号を1つ取得します
    3. トールフリー(0800-xxx)でもDID(050-xxx)でもどちらでもいいのですが、取得した電話番号には維持料金が発生するため、より安いDID(+81 50-xx)で始まる電話番号を取得します)
    4. こんな感じ
    5. ![image.png](https://qiita-image-store.s3.amazonaws.com/0/107953/e3064602-614d-5994-90d5-69c2d2e95d71.png)
6. 問合せフローの作成
    7. 電話をかけるだけなので極力シンプルしました
    8. こんな感じ
    9. ![image.png](https://qiita-image-store.s3.amazonaws.com/0/107953/b3dfcb45-e242-6dab-0965-252cf37cb124.png)
    10. 簡単に説明すると、電話にでると女性(Mizuki)の声で「携帯見つかってよかったですね」と言われるフローです
11. インスタンスIDとコンタクトフローIDのメモ
    12. Lambda作成時に必要なIDをメモしておきます。
    13. 問合せフローのURLは「https//xxxxxxxx.awsapps.com/connect/contact-flows/edit?id=arn:aws:connect:ap-southeast-2:xxxxxxx:instance/70f64a0a-f656-4dac-bc31-xxxxxxxxxx/contact-flow/b9c7e325-f947-49b0-ab78-xxxxxxxxxx」のような形になっていると思いますが、「70f64a0a-f656-4dac-bc31-xxxxxxxxxx」の部分がインスタンスIDで、「b9c7e325-f947-49b0-ab78-xxxxxxxxxx」の部分がコンタクトフローIDとなります


## Lambda
* 必須ではないですが、シドニーリージョンで作成します
* 言語もなんでもいいですが、私はpython3.6で作成しました。名前を「ConnectOutboundCall」にしています

```
import boto3

client = boto3.client('connect')

def lambda_handler(event, context):
    
    response = client.start_outbound_voice_contact(
                    DestinationPhoneNumber='AAAA',
                    ContactFlowId='BBBB,
                    InstanceId='CCCC',
                    SourcePhoneNumber='DDDD'
            )
```
* AAAAの部分は、電話する電話番号です。今回の例だと私の電話番号です。例えば、090-1111-1111の場合は、「+819011111111」といれます
* BBBBの部分は、↑でメモったコンタクトフローIDをいれます
* CCCCの部分は、↑でメモったインスタンスIDをいれます
* DDDDの部分は、Amazon Connectで取得した電話番号を入れます。例えば、「+815011111111」な感じです
* テストでLambdaを起動させて、電話がかかってくることを確認しておきます

## API Gateway
* 必須ではないですが、これもシドニーリージョンで作成


![image.png](https://qiita-image-store.s3.amazonaws.com/0/107953/659cbca6-8049-b7b6-bd75-e3c42c02a93e.png)

* (API GatewayのURL)/prod/callにGETリクエストを送ると↑で作成したLambdaが呼ばれるようにしています
* テストなので認証等は設定していません

## 準備1まとめ
以上で　API Gatewayへリクエストを送ると指定した番号へ電話をかけることができるようになりました。例えば、クエリパラメータに電話番号を入れる、POSTにしてbodyに電話番号を入れてLambdaに渡すなど改良すれば、任意の電話番号へ電話できる自動電話APIも簡単に作成できると思います。 

# 準備2
Google Homeはすでにある前提で、IFTTTの設定をします。詳細は省きますが、以下のようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/107953/5d44023b-7330-4de1-f186-13b99153f23c.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/107953/254f58a2-4c91-08d0-812b-6e616a203f51.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/107953/cb957de9-7110-3ebb-9d26-3045023993df.png)

簡単に言えば、「OK, Google。電話して」とGoogle Homeに呼びかけるとIFTTTが指定したURLへGETリクエストを送ってくれます。その先がAPI Gatewayであり、さらにLambdaが起動し、Amazon ConnectのAPIを叩いて電話してくれるという仕組みです。

# 完成
「OK, Google。電話して」をGoogle Homeに呼びかけると「電話しています」と応答してくれて、そのうち電話がかかってきます。
電話にでると、女性の声で「携帯見つかってよかったですね」と言ってくれます

# 余談
電話に出るとoutbound料金がかかってしまうので、電話が見つかった時点で着信を切ってしまうのがいいかと思います。