Help us understand the problem. What is going on with this article?

SwaggerでLambdaのデバッグ環境を作る(3):Dialogflowをデバッグする

More than 1 year has passed since last update.

第1回投稿で、SwaggerでLambdaのデバッグ環境を作りました。

 SwaggerでLambdaのデバッグ環境を作る(1)

今回はこの環境を使って、Dialogflowをローカルでデバッグしてみます。
Lambdaに配置して動作確認するトライアンドエラーは、効率は悪いので、ローカルでブレイクポイント等を活用してデバッグした方が断然効率的です。

DialogflowのAgentを作成する

まだ作成していない場合は、DialogflowのWebコンソールから新規にAgentを作成します。

Dialogflow Console
 https://console.dialogflow.com/

適当なAgent名を付けます。例えば、「TestAgent」とします。
LANGUAGEにはJapaneseを選択します。

image.png

とりあえず、適当にIntentを追加します。
例えば、「Thanks」という名前で作成し、「ありがとう」というと「どういたしまして」と返すようにしてみます。

image.png

右側にある「Try it now」に、「ありがとう」と入力すると期待通りの答えが返ってきました。

ローカル環境に転送する

上記までは、Dialogflowの中で、決まった入力に対して、決まった出力をしました。今度はこれを、別のサーバに転送して、入力内容に従ってレスポンスを自由に定義して返すようにします。
Intentごとに、別のサーバに転送する対象を選択できます。
Intentの「Fulfillment」のところで、「Enable webhook call for this intent」を有効にすることで、このIntentが転送されるようになります。

image.png

どのサーバに転送するかどうかは、左側のナビゲータのFulfillmentで指定できます。

image.png

WebhookをEnableにして、URLに転送先のURLを指定します。
ここで指定するURLはこれから立ち上げるローカルデバッグ環境のエンドポイントと同じにする必要がありますので、覚えておきます。

ローカルデバッグ環境にエンドポイントを作成する

それでは、Dialogflowからの転送を受け付けるエンドポイントを作成していきます。

まずは、Swagger定義ファイルに、エンドポイントを定義します。
今回は、「test-dialogflow」としました。

swagger.yaml
・・・
  /test-dialogflow:
    post:
      x-swagger-router-controller: routing
      operationId: test-dialogflow
      parameters:
        - in: body
          name: body
          schema:
            $ref: "#/definitions/CommonRequest"
      responses:
        200:
          description: Success
          schema:
            $ref: "#/definitions/CommonResponse"
・・・

次に、api/conntrollers/routing.jsに、実装の場所を指定します。

routing.js
const func_table = {
"test-dialogflow" : require('./test-dialogflow').fulfillment,
};

次は実装に入るのですが、DialogflowのAgentの開発に有用なnpmライブラリを使いましょう。

npm install --save actions-on-google

それでは実装に入ります。以下のフォルダとファイルを作成します。

 api/controllers/test-dialogflow/index.js

index.js
'use strict';

const {dialogflow} = require('actions-on-google');
const app = dialogflow({debug: true});

app.intent('Thanks', (conv) =>{
    conv.ask('こちらこそ');
});

exports.fulfillment = app;

app.intentの第一引数に、Intent名を指定することで、このIntentの転送を受け取ることができます。
ここら辺のお作法は、actions-on-googleで決まっています。
処理内容は、単に「こちらこそ」と返すだけです。

それでは、ローカルデバッグ環境を再起動してみます。
Visual Studio Codeであれば、右上の丸い矢印のマークをクリックすることで、再起動されます。

image.png

もう一度、Dialogflowの右上の「Try it now」から「ありがとう」と入力してみると、ローカルデバッグ環境に転送され、ブレイクポイントを入れておけばそこで止まることがわかるかと思います。
継続すると、Dialogflowに、今度は「こちらこそ」と返ってきます。

Lambdaにアップロードする

無事に動作が確認できたので、Lambdaにアップロードしてみましょう。
今回は、actoins-on-googleのnpmモジュールを使っているので、それらを含めてZIP化してアップロードします。

api/controllers/test-dialogflow のフォルダに移動します。

以下のように実行します。

npm init -y
npm install --save actions-on-google

(またactoins-on-googleをインストールするの?と思われるのかもしれませんが、ここで行っているのは、アップロードするZIPにこのモジュールを含めるためのものです。ローカルデバッグ環境で実行しているときにはここでインストールしたモジュールは使われません。)

そして、そのフォルダにあるすべてのファイルをZIPで固めておきます。

次に、AWSのWebコンソールから、Lambda関数を作成します。
例えば、名前を「test-dialogflow」とします。

image.png

関数のコード、のところで、まずは、ハンドラを「index.fulfillment」に変更します。次に、作成したZIPファイルを選択して、アップロードします。

image.png

次は、API Gatewayでエンドポイントを設定します。
Swagger定義ファイルからエンドポイントを作ってもよいのですが、今回は手動でエンドポイントを追加します。
「リソースの作成」を選択して、リソース名として例えば「test-dialogflow」を指定します。API Gateway CORSを有効にする、にチェックを入れます。

image.png

できあがった「test-dialogflow」にPOSTメソッドを追加します。
Lambdaプロキシ統合の使用にチェックを入れ、Lambda関数には作成した関数「test-dialogflow」を指定します。

image.png

最後に、「APIのデプロイ」を実行します。

image.png

ステージとして表示されるURLに、先ほど作成したエンドポイント名「test-dialogflow」をくっつけたURLを覚えておきます。

DialogflowからLambdaを呼ぶようにする

次に、Dialogflow Consoleに戻ります。
設定するところは、FulfillmentのWebhookです。

WebhookのURLにさきほどのAPI GatewayのURL+/test-dialogflowに書き換えます。

image.png

もう一度、右上の「Try it now」のところに、「ありがとう」と入力すると、「こちらこそ」と返ってくれば成功です。

Googleアシスタントで試す

最後に、Googleアシスタントで試してみます。

Dialogflowの左側のナビゲーションから「Integrations」を選択し、「Google Assistant」を選択するため、「INTEGRATION SETTINGS」をクリックします。

image.png

そのあとに表示されるダイアログボックスで、TESTをクリックします。
その時、Auto-preview changesをOnにしておくと便利です。

image.png

Google Assistantのエミュレータが立ち上がります。
ここで、「テスト用アプリにつないで」、「ありがとう」というと、「こちらこそ」と返ってくるはずです。

image.png

エミュレータでは動作したので、Androidでやってみます。
Androidのホームボタンを長押しして、Googleアシスタントを立ち上げてください。
ここでも同じように、「テスト用アプリにつないで」、「ありがとう」というと、「こちらこそ」と返ってくるはずです。

(ちなみに、まだテスト状態ですので、Dialogflowと同じGoogleアカウントでGoogleアシスタントを立ち上げる必要があります。)

image.png

以上です。

poruruba
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした