ask-cliでalexa-sdkのスキルをデプロイ・シュミレートする
この記事は一人Alexa Skills Kit for Node.js Advent Calendar 2017の23日目の記事です。 ここまでの記事では、あくまでAlexa SkillのバックエンドとしてのLambda […]
目次
この記事は一人Alexa Skills Kit for Node.js Advent Calendar 2017の23日目の記事です。
ここまでの記事では、あくまでAlexa SkillのバックエンドとしてのLambdaの話が中心でした。
この記事では、インタラクションなども含めたデプロイ方法について紹介します。
ask-cliとは
スキルの作成・デプロイ・シュミレートなどさまざまな操作をCLIから行うことができます。
セットアップ
npm i -g ask-cli
でインストールできます。
そのあとはinitでプロファイルを作成しましょう。
$ ask init
? Please create a new profile or overwrite the existing profile.
Create new profile
? Please type in your new profile name:
sample
-------------------- Initialize CLI --------------------
Setting up ask profile: [sample]
? Please choose one from the following AWS profiles for skill's Lambda function deployment.
sample-aws
Lambdaをデプロイしたい場合、途中でAWSのプロファイルを聞かれますのでデプロイしたいアカウントのプロファイルを選びましょう。
プロジェクト作成
ask new
で新規プロジェクトを作れます。
-n
オプションでスキル名を指定できます。
$ ask new -n example -p sample
New project for Alexa skill created.
$ cd example
$ tree -L 2
.
├── lambda
│ └── custom
├── models
│ └── en-US.json
└── skill.json
3 directories, 2 files
lambda/custom
配下にalexa-sdkもしっかりインストールされています。
$ cat lambda/custom/package.json | jq .
{
"name": "skill-sample-nodejs-hello-world",
"version": "1.0.0",
"description": "Hello world sample skill",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"dependencies": {
"alexa-sdk": "^1.0.0"
}
}
デプロイする
ask deploy
でLambdaごとデプロイしてくれます。
$ ask deploy -p sample
-------------------- Create Skill Project --------------------
Profile for the deployment: [sample]
Skill Id: amzn1.ask.skill.XXXX-XXXX-XXXX
Skill deployment finished.
Model deployment finished.
Lambda deployment finished.
各種設定について
ドキュメントみるのが一番てっとり早いです。
skill.json
と.ask/config
にだいたいのことがJSON形式で記録されているので、そのあたりをよしなにすればよいでしょう。
シュミレートする
シュミレート(ask simulate-skill
)では、ただLambdaをInvokeするだけでなく自然言語処理部分も含めたテストができます。
ただしask api simulate-skill
した後で、ask api get-simulation
しないといけないという実装のため、以下のようにワンライナーにしておくと良いかもしれません。
export profile='{YOUR ASK PROFILE}';export skill_id='{YOUR_SKILL_ID}'; ask api get-simulation -s ${skill_id} -i $(ask api simulate-skill -l en-US -s ${skill_id} -t 'ask hello world' --profile ${profile} | jq .id -r) --profile ${profile}
ask hello world
の部分は必要に応じて変更してください。
また下のようなエラーが出る場合は、テストモードがオンになっていないので管理画面から設定しましょう。
{
"status": "FAILED",
"result": {
"error": {
"message": "Skill is currently disabled in development stage. Please enable skill in order to call this API."
}
}
}
成功すると、リクエスト内容やレスポンス内容などをJSON形式で確認できます。
export profile='{YOUR ASK PROFILE}';export skill_id='{YOUR_SKILL_ID}'; ask api get-simulation -s ${skill_id} -i $(ask api simulate-skill -l en-US -s ${skill_id} -t 'ask hello world' --profile ${profile} | jq .id -r) --profile ${profile} | jq .result.skillExecutionInfo.invocationResponse
{
"body": {
"version": "1.0",
"response": {
"shouldEndSession": true,
"outputSpeech": {
"type": "SSML",
"ssml": "<speak> Hello World! </speak>"
},
"card": {
"type": "Simple",
"title": "hello world",
"content": "hello world"
}
},
"sessionAttributes": {}
}
}
最後に
LambdaのデプロイをServerless FWでやるかこちらでやってしまうかはちょっと悩ましいなと思います。
ask-cliの方は既存のLambdaのARNを指定することができますので、Lambdaと関連リソースはServerless FWでデプロイして、それをask-cliから利用するという形も1つかなと思ったりしています。