ask-cliでalexa-sdkのスキルをデプロイ・シュミレートする

この記事は一人Alexa Skills Kit for Node.js Advent Calendar 2017の23日目の記事です。

ここまでの記事では、あくまでAlexa SkillのバックエンドとしてのLambdaの話が中心でした。

この記事では、インタラクションなども含めたデプロイ方法について紹介します。

ask-cliとは

Amazonが提供するAlexaむけ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のプロファイルを聞かれますのでデプロイしたいアカウントのプロファイルを選びましょう。

認証画面

この画面がでればOK

プロジェクト作成

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つかなと思ったりしています。

Comment