4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ASK CLI(v2)でAlexaスキルを作る際の注意点

Last updated at Posted at 2020-09-20

Alexaスキルを開発するためのコマンドラインツールASK (Alexa Skill Kit) CLIを使う際にいろいろと嵌りましたので、今後迷う方が少なくなるようここにメモを残しておきます。
今回使ったのはWindows版のバージョン2.15.0です。ASK CLIについて検索したときにask apiコマンドを使って開発をする記事が多くヒットしてその通り打ち込んだのですが以下のようなエラーになってしまいました。おそらく現在とは古いバージョンのaskコマンドについて書かれており、コマンドの引数などが大きく異なっているので注意してください。こういう互換性が大きく変わる変更は開発者を混乱させますね。

> ask api
Command not recognized. Please run "ask" to check the user instructions.

ASK CLIのインストール

ASK CLIをインストールするにはnpmコマンドが必要なのでNode.jsをインストールして使えるようにしておきます。npmコマンドで以下のを実行してインストールします。

npm install -g ask-cli

手元の環境で実施したときはすんなりと成功とはいかず以下のようなエラーが出ました。ただaskコマンドは使えるようになり、今のところ正しく動作しているようなので一旦無視することにします。(いいのか?)

gyp ERR! UNCAUGHT EXCEPTION
gyp ERR! stack Error: spawn C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\15.0\Bin\MSBuild.exe ENOENT
gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:240:19)
gyp ERR! stack     at onErrorNT (internal/child_process.js:415:16)
gyp ERR! stack     at process._tickCallback (internal/process/next_tick.js:63:19)
gyp ERR! System Windows_NT 10.0.18363
gyp ERR! command "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js" "rebuild"
gyp ERR! cwd C:\Users\jito\AppData\Roaming\npm\node_modules\ask-cli\node_modules\dtrace-provider
gyp ERR! node -v v10.16.0
gyp ERR! node-gyp -v v3.8.0
gyp ERR! This is a bug in `node-gyp`.
gyp ERR! Try to update node-gyp and file an Issue if it does not help:
gyp ERR!     <https://github.com/nodejs/node-gyp/issues>

念のためaskコマンドが使えるようになったかとバージョンを確認しておきます。2.x 系であることが表示されれば大丈夫だと思います。

> ask --version
2.15.0

ASKコマンドの環境設定

Amazon開発者ポータルの、どのアカウントで作業をするかを設定します。ask configureコマンドを使って出てくるメニューに従って設定をします。

> ask configure

Alexaスキルを作る

新しいAlexaスキルはask newコマンドを使用して作成します。メニューに従ってコードを書く言語、スキル名、プロジェクト名を指定してしばらく待つとスキルが作成できます。スキルの定義やコードなどはプロジェクト名のサブフォルダに格納されます。

> ask new
? Choose the programming language you will use to code your skill:  NodeJS
? Choose a method to host your skill's backend resources:  Alexa-hosted skills
  Host your skill code by Alexa (free).
? Choose the default locale for your skill:  ja-JP
? Choose the default region for your skill:  us-east-1
? Please type in your skill name:  Hello World Skill
? Please type in your folder name for the skill project (alphanumeric):  HelloWorldSkill
? Creating your Alexa hosted skill. It will take about a minute.

Project directory for Hello World Skill created at
        c:\work\mitoco\PushTest2\HelloWorldSkill

Lambda code for Hello World Skill created at
        ./lambda

Skill schema and interactionModels for Hello World Skill created at
        ./skill-package

Skill is enabled successfully.
Hosted skill provisioning finished. Skill-Id: amzn1.ask.skill.xxx-xxx-xxx-xxx-xxx
Please follow the instructions at https://developer.amazon.com/en-US/docs/alexa/hosted-skills/build-a-skill-end-to-end-using-an-alexa-hosted-skill.html#askcli to learn more about the usage of "git" for Hosted skill.

Alexaスキルの操作

スキルマニフェストはスキルの設定ファイルになります。プロジェクトのフォルダのskill-package\skill.jsonに保存されています。
スキルの設定を変更する場合はこのJSONファイルを変更しますが、スキルに反映するにはask amapi update-skill-manifestコマンドでアップデートをかけます。-sオプションで更新対象のスキルIDを指定しますがスキルIDはプロジェクトフォルダの.ask\ask-states.jsonに記載されているのでそちらを参照してください。またファイルは--manifestオプションで指定しますが、file:{ファイル名}のように指定をします。file:を頭につけるのが最初わからずに苦労しました。

ask smapi update-skill-manifest -s {スキルID} -g development --manifest "file:skill.json"

Alexa Developer Consoleのほうでスキルの設定を変更した場合はローカルのマニフェストをアップロードするとポータルでの変更が上書きされて消えてしまうので、最新のマニフェストをダウンロードするにはask amapi get-skill-manifestを使用します。標準出力にマニフェストの内容がjsonで出力されるのでファイルにリダイレクトして保存します。

ask smapi get-skill-manifest -s {スキルID} > skill.json

Lambdaのログが見られないとき

Alexaスキルでインテントに対する処理はLambda関数で作ることが多いと思います。Lambda関数は例えばNode.jsの場合はconsole.log()でログ出力をすることができます。ログはAWSの中にに保存されCloud Watchのロググループから参照することができます。ログはプログラム作成するときのデバッグに非常に役に立つのですが、Lambda関数をAlexa-hosted skillsを選んで作った場合には、Alexa Developer Consoleからコードエディタの左下にあるログ: Amazon CloudWatchをクリックするとCloud Watchに飛んでログを見ることができます。
codeeditor.PNG
クリックしたときに以下のようなエラーが表示されログが見られないことがあります。

ロググループが存在しません
特定のロググループ: /aws/lambda/xxx-xxx-xxx-xxx はこのアカウントまたはリージョンに存在しません。

公開をしていないスキルの場合は実行されてもログが作成されず上記エラーが表示されるようです。(公開かどうかは関係なかったので改訂)この場合は焦らなくてもよく、実際にLambda関数が動作したAWSの別リージョンにログが出力されているはずなので、画面右上のリージョン選択からログのあるリージョンを探します。

cloudwatch.png

ask newでスキルを作成したときにChoose the default region for your skillus-east-1を選択していたので、てっきりこのリージョンで動くのかと思っていましたが、Lambda関数は別リージョンで動くこともあるようです。リージョンはたくさんあり探すのが大変です。環境変数AWS_DEFAULT_REGIONに実行中のリージョンが設定されるようなので、こんなLambda関数を書くとどのリージョンで実行されたかが分かるようになります。

const LaunchRequestHandler = {
    canHandle(handlerInput) {
        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'LaunchRequest';
    },
    handle(handlerInput) {
        var region = process.env.AWS_DEFAULT_REGION;
        const speakOutput = 'ハロハロ起動 ' + region;
        return handlerInput.responseBuilder
            .speak(speakOutput)
            .reprompt(speakOutput)
            .getResponse();
    }
};

codetest.PNG

ただ、リリース時にリージョン名を読み上げ出力するわけにはいかないので、他の方法としてはスキルマニフェストにリージョンの設定のようなものがあるのでこの中のどれかのリージョンを調べれば良いかもしれません。まだ調査中なので追って紹介できればと思います。

この問題の解決方法はこちらを参考にさせていただきました。

おわりに

Alexaスキルを開発するきっかけとしては、Amazon Echoと自社の会話プラットフォームとつないで音声会話でのFAQ回答システムや業務システム操作UIを開発しています。
会話プラットフォームENOKI

ASK CLIは最近使い始めたばかりなので、これからも色々と試してみたいと思います。

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?