前回に引き続き、Google Home向けのサービスを作って遊びます。
今回はFulfillmentを使って、AWSにWebhookさせてみます。
Fulfillment | Dialogflow ES | Google Cloud
概要
処理のフローは以下になります。
Google Homeに話しかける
→ Actions on GoogleのAppを呼び出し
→ Appにメッセージ送信
→ DialogflowのIntentsからFulfillmentでWebhook
→ Webhook先のAmazon API Gatewayで処理を行う
→ 結果(発話・テキスト)をDialogflowに返す
Google Homeに話しかけてDialogflowで定型文を返すところまでは簡単にできるので、FulfillmentでAmazon API Gatewayと連携する部分を作ります。
Fulfillmentを設定する
外部サービスへのWebhookを行うには、Fulfillmentを設定します。
Dialogflow内にメニューがあります。
とりあえずは連携だけ確認したいので、Webhook先のURLだけ設定します。
URLは後述のAmazon API Gatewayで作成したものです。
画面の下の方にSaveボタンがあるので、忘れずに更新してください。
Amazon API GatewayでAPIを作る
API GatewayはAWSの各サービスや外部のWebAPIをエンドポイントとして、APIを提供できるサービスです。
AWSアカウントでログインし、API Gatewayのコンソール画面を開いたら、まず[APIの作成]を行います。
API名はリクエストURLには含まれないので、わかりやすい名称なら何でもOK。その他は任意入力。
APIが作成されたらリソース、メソッドを作ります。リソース、メソッドに付いては一般的なRESTの概念なので、この場では説明を割愛。
アクション > メソッドの作成(リソースの作成)で追加できます。今回はリソースを作らず、ルート直下にPOSTメソッド(FulfillmentでのWebhookがPOSTのため)だけ作りました。
メソッドを作成したらエンドポイントにつなぎます。
設定次第でいろいろなサービスと連携できるのですが、今回はMockで固定値を返すようにします。
Mockの出力は統合レスポンスブロックの本文マッピングテンプレートになります。
FulfillmentのResponse仕様に沿って、レスポンスを整形します。
ここまで設定できたら、テスト実行が行なえます。出力固定のMockなので、何も入力せずに[テスト]ボタンを押して、レスポンス本文がマッピングテンプレートの通りになっていれば正しく設定できています。
テストが期待通りになっていたら、アクション > APIのデプロイで外部からアクセスできるようにします。
デプロイはステージを指定するようになっているので、運用前ならtest、betaなど、本運用に入ったらv1,v2,v3,...と切っていくと並行運用ができます。
デプロイメントの説明に書いた内容はデプロイ履歴に一覧で残りますし、デプロイ履歴からのロールバックもワンクリックでできるので、書いておくと便利です。
デプロイが完了すると、作成したステージに呼び出し用のURLが表示されます。
東京リージョン(ap-northeast-1)で作ったのであれば、以下になっているはず。
https://[ランダムな文字列].execute-api.ap-northeast-1.amazonaws.com/[ステージ]/([リソース]/...)
このURLをFulfillmentに設定してあげれば、Dialogflowから叩けるようになります。
Intentsを設定する
ここまでできれば、あと少し。
Dialogflowに戻って、Intentsを追加します。
User saysにメッセージを定義して、Fulfillmentの"Use webhook"にチェックを入れます。
レスポンスはWebhookで返すので、Responseの欄は何も入力しなくてOKです。
設定したらSaveを忘れずに。
Actions on Googleでテストする
Dialogflowで設定したActionをActions on GoogleのSimulatorでテストします。
マイクが使えない場合はキーボード入力で確認できます。
IntentsのUser saysに設定したメッセージを送信すると、Amazon API Gatewayに定義されているMockのメッセージが発話・テキスト表示されました!
まとめ
FulfillmentによるWebhookは連携URLを指定するだけで簡単です。
リクエスト先では指定のフォーマットでレスポンスを返す必要があり、AWSを利用するのであれば、API GatewayやLambdaファンクションで整形してあげるとよいです。
Mockではなく、エンドポイントをAWSサービスやWebサービスとの連携にすれば、対話形式での検索やデータベースへの登録もできるし、セッションが管理できればインターネットでの予約・購入など、割と何でもできそう。
今はまだ定型文のメッセージでしか操作していないので、Entities、Actions and Parameters、Eventsなどを理解して使いこなせるようになりたい。