Alexaスキルの開発を効率化するBespoken Toolsを試してみた
大阪の方の持田です。今回は、Alexaスキルの開発を効率化したり、その後のモニタリングやテストに使えるBespoken社のサービスのうち、CLIツールであるBespoken Toolsをざっくり試した結果をご紹介します。
Bespoken Toolsとは
Bespoken Toolsは、Bespoken社によるAlexaスキルの開発を効率化するサービスです。 Bespoken社は、会社概要によると、南米ペルーの企業です。AlexaスキルやGoogle Homeのスキルに対して、スキル開発を効率化するツールや、スキルのモニタリング、バリデーション、ロギングが可能なダッシュボードを提供しています。
これらのサービスは、Alexaスキルの呼び出し先(エンドポイント)を、同社のプロキシーサーバーに設定することで実現されています。
http://docs.bespoken.io/en/latest/alexa_skills_kit_configuration/ に掲載の図
今回は、このコマンドを使うことで、ローカルで開発しているlambdaの修正を、再デプロイすることなしにAlexaコンソールでテストすることができます。
前提条件
Bespoken Toolsを試すため、以下の環境を用意しました。
- node.jsがインストールされている
- ASK CLIがセットアップされている
- AWS LambdaがデプロイできるAWSアカウント(IAMユーザーおよびクレデンシャル)
ASK CLIでのデプロイ
はじめに、Bespoken Toolsを使わず、ASK CLIでデプロイしてみます。
Bespoken Toolsと比較するため、デプロイの時間を計測しておきます。
引数などの説明を簡略化するため、以下ASK CLIで、バージニアリージョンに英語のスキル"Hello World"をデプロイします。
また、各コマンドをtime
コマンドを使って処理時間を計測します。
$ time ask new --skill-name "Hello World"
New project for Alexa skill created. real 0m3.621s user 0m2.226s sys 0m0.409s
ローカルマシンにスキルを新規作成するのは3秒あまりでした。引き続き、このままデプロイしてみます。
$ cd Hello\ World/ $ time ask deploy
-------------------- Create Skill Project -------------------- Profile for the deployment: [default] Skill Id: amzn1.ask.skill.xxxxxxxxxxxxxxxxxxxx Skill deployment finished. Model deployment finished. Lambda deployment finished. Lambda function(s) created: [Lambda ARN] arn:aws:lambda:us-east-1:xxxxxxxxxxxxxxxxxxxx:function:ask-custom-Hello-World-default real 0m54.129s user 0m1.572s sys 0m0.248s
初期のスキルのデプロイに54秒あまりかかりました。 少しlambdaのコードを書き換えてみます。
handle(handlerInput) { const speechText = 'Welcome to the Alexa Skills Kit, you can say hello!';
最後の "hello!" を "hello world!" に修正します。
handle(handlerInput) { const speechText = 'Welcome to the Alexa Skills Kit, you can say hello world!';
以上のように書き換えました。 再度、今度はlambdaだけをデプロイしてみます。
$ time ask deploy -t lambda
Lambda deployment finished. Lambda function(s) updated: [Lambda ARN] arn:aws:lambda:us-east-1:xxxxxxxxxxxxxxxxxxxx:function:ask-custom-Hello-World-default real 0m5.774s user 0m1.140s sys 0m0.178s
5秒かかりました。 今後、lambdaのコードを修正して、Alexaコンソールでテストするたびに、デプロイに5秒待つことになります。 そこで、Bespoken Toolsを使ってみます。
Bespoken Toolsのセットアップ
ドキュメントの通り、npm
にてインストールを行います。
$ npm install bespoken-tools -g
私はnodebrew
を使っているので、ドキュメントの通り-g
オプションを付加しました。
bst
コマンドの出力を確認します。
$ bst
BST: v1.2.11 Node: v8.11.3 Usage: bst [options] [command] Options: -h, --help output usage information Commands: proxy <lambda|function|http> Proxies a Lambda, Google Cloud Function or HTTP service launch Sends a launch request to your service intend <intent> [SlotName=SlotValue...] Sends the specified intent to your service utter <utterance> Sends an intent with the specified utterance to your service sleep <location> Instructs bst to sleep using specified location deploy <lambda> Deploys a lambda speak <utterance> Sends your message to your virtual alexa device help [cmd] display help for [cmd]
問題なさそうです。次に進みます
Bespoken Toolsの実行とコードの修正
まず、先ほどの"Hello World"スキル内の./lambda/custom/
ディレクトリに移動して、bst
コマンドを実行します。
$ cd lambda/custom/ $ bst proxy lambda index.js
BST: v1.2.11 Node: v8.11.3 Your public URL for accessing your local service: https://xxxxxxxxxx.bespoken.link Your URL for viewing requests/responses sent to your service: https://apps.bespoken.io/dashboard?id=xxxxxxxxxx&key=xxxxxxxxxx Copy and paste this to your browser to view your transaction history and summary data. INFO 2018-07-06T06:37:41.308Z Connected - proxy.bespoken.tools:5000
これでプロキシが起動しました。このコンソールはプロキシの動作ログなどが表示されるので、以後別のコンソールで作業します。
次に、"Hello World"スキル内のコードを少し修正します。
まずはskill.json
です。
"apis": { "custom": { "endpoint": { "sourceDir": "lambda/custom" } } },
ここのsourceDir
を、さきほどbst
コマンドの最初の出力にあったプロキシのURIに書き換えます。
そのほか、ワイルドカード証明書を受け入れる設定を加えて、次のようになります。
"apis": { "custom": { "endpoint": { "uri": "https://xxxxxxxxxx.bespoken.link", "sslCertificateType": "Wildcard" } } },
この skill.json
の構文については、スキルマニフェスト(スキル管理API)をご参照ください。
次に、.ask/config
です。
{ "deploy_settings": { "default": { "skill_id": "amzn1.ask.skill.xxxxxxxxxxxxxxxxxxxx", "was_cloned": false, "merge": { "manifest": { "apis": { "custom": { "endpoint": { "uri": "ask-custom-Hello-World-default" } } } } },
このmerge
ブロックを全削除します。
{ "deploy_settings": { "default": { "skill_id": "amzn1.ask.skill.xxxxxxxxxxxxxxxxxxxx", "was_cloned": false
修正しましたので、スキル全体を一度デプロイします。
$ time ask deploy
-------------------- Update Skill Project -------------------- Skill Id: amzn1.ask.skill.xxxxxxxxxxxxxxxxxxxx Skill deployment finished. Model deployment finished. [Info]: No lambda functions need to be deployed. real 0m42.224s user 0m1.133s sys 0m0.184s
出力の通り、Lambdaのコードは修正していません。 いったん、ここでAlexaコンソールでテストをしてみます。
このサンプルスキルの呼び出し名は "greeter"です。 まずは、現状のままでテストを有効にして "open greeter" と呼び出してみます。
"Welcome to the Alexa Skills Kit, you can say hello world!"と返ってきました。先程の修正が反映されています。
次に、Lambdaのコードを修正します。"hello world!" を "hello proxy!" に変更してみます。
handle(handlerInput) { const speechText = 'Welcome to the Alexa Skills Kit, you can say hello proxy!';
通常であれば、このあと ask deploy -t lambda
を実行して5秒待たなければAlexaコンソールではテストができませんが、そのままでコンソールからスキルを呼び出してみます。
ただ、今回は修正したコードが Launch Request のため、いったん "quit" とスキルを終了させています。
"Welcome to the Alexa Skills Kit, you can say hello proxy!"と返ってきました。デプロイせずに、修正したコードをテストできています。
おわりに
今回は、Bespoken Toolsのごく基本的な使い方をみてみました。ASK CLIと重なる機能もありますが、開発が効率化する面もありますので、もう少し調べてみようと思います。