Twilio Autopilotをさわってみた

[Twilio Autopilot](https://twilio.kddi-web.com/magazine/2901/)からAWS API Gatewayをコールしてみました。

# やること

電話に話しかけるとTwilioがAPI Gateway経由でサーバの起動停止をするLambdaを呼び出す仕組みをつくってみます。

注）認証的なものは入れてません。

# 必要なもの

- twilioアカウント
- AWSアカウント

# 手順概要

1. [AWS] lambdaを作成する
2. [AWS] apiを作成する
3. [Twilio] virtual assistantを作成する
4. [Twilio] taskを作成する
5. [Twilio] sampleを作成して、modelをビルドする
6. [Twilio] 電話番号にvirtual assistantを紐づける
7. [Twilio] テストする

# 1. [AWS] lambdaを作成する

```python
import boto3
import json

INSTANCE_ID = 'I-*****************'
ec2 = boto3.client('ec2')


def lambda_handler(event, context):
    command = get_command(event)
    reply = ''

    if command == 'start':
        res = ec2.start_instances(
            InstanceIds=[INSTANCE_ID]
        )
        reply = 'The server is starting.'
    elif command == 'stop':
        res = ec2.stop_instances(
            InstanceIds=[INSTANCE_ID]
        )
        reply = 'The server is stopping'
    else:
        reply = 'Please tell me start or stop.'
        
    body = {
        	'actions': [
        		{
        			'say': reply
        		}
        	]
        }
        
    return({
        'isBase64Encoded': False,
        'statusCode': 200,
        'headers': {},
        'body': json.dumps(body)
    })


def get_command(event):
    try:
        command = event['pathParameters']['command']
    except KeyError as err:
        command = 'other'
    return command
```

# 2. [AWS] apiを作成する

API Gatewayでapiを作成してデプロイします。

|項目|値|
|---|---|
|メソッド|POST|
|Lambdaプロキシ統合の使用|ON|
|ステージ名|prod|

<img width="1333" alt="auto2_1_api.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/461ef945-f355-3095-4132-ae480106e2d3.png">

# 3. [Twilio] virtual assistantを作成する
twilioのコンソールから[Autopilot] - [Create a New Assistant]を選択して、virtual assistantを作成します。
<img width="602" alt="auto3.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/c7f0df70-fb7e-9504-a5f2-868aeab356cf.png">


# 4. [Twilio] taskを作成する
Taskを3個作成します。
<img width="939" alt="auto4_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/574a3c8b-7259-0ac9-6232-726211305eab.png">

### initial
```json
{
	"actions": [
		{
			"say": "Do you want to strat a hoge server or stop a hoge server?"
		},
		{
			"listen": true
		}
	]
}
```

### start
```json
{
	"actions": [
		{
			"redirect": "https://**********.execute-api.us-east-1.amazonaws.com/prod/start"
		}
	]
}
```

### stop
```json
{
	"actions": [
		{
			"redirect": "https://**********.execute-api.us-east-1.amazonaws.com/prod/stop"
		}
	]
}
```

# 5. [Twilio] sampleを作成して、modelをビルドする

<img width="935" alt="auto5_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/dc360b73-30de-0e52-b602-590d76e337d8.png">

<img width="926" alt="auto5_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/b0b7e75f-87b2-f26f-9847-22afc46b2897.png">

<img width="601" alt="auto5_3.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/7371e18c-16f1-cf4b-6b47-ba0e59d25419.png">


# 6. [Twilio] 電話番号にvirtual assistantを紐づける

[Channels] - [Programmable Voice]のVOICE URLをコピーします。

<img width="1204" alt="auto6_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/cf5c4e2a-0320-0506-816d-3252f7ef5780.png">

下図の赤枠にペーストして、電話番号と紐づけます。

<img width="1272" alt="auto6_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/8d077dce-1112-605a-5422-862ae8a760a3.png">

# 7. [Twilio] テストする

Twilioで購入した電話番号に電話して、「start」か「stop」を指示します。

# 雑感

**その１**
発音が悪いのか、stopの方しか認識してくれませんでした。早く日本語に対応しないかな。。

**その２**
最近のtwilioはSendGridを買収したりと電話の枠を超えてコミュニケーション分野全体に手を広げているように見えます。そのうちSlackやFacebookを飲み込んだりして。。。