[Alexa] 遂にでた! Alexa Skill Kit のCLIでデプロイまでやってみた
1 はじめに
先日(日本時間で9月6日)、新しく次の3つの機能追加が発表され、スキルをプログラムで管理したり、テストすることが、できるようになったと言うことです。
- Alexa Skill Management API(SMAPI)スキルの管理
- Alexa Skill Kit Command-line Interface(ASK CLI)コマンドラインツール
- Alexa Skill Kit Event スキルイベント
今回は、とりあえず、Alexa Skill Kit Command-line Interface(以下、ASK-CLI)を使って、新しくSkillを生成してデプロイする所まで試してみました。
2 ASK CLI
ASK CLIは、Alexaスキルと接続されたAWS Lambda(以下、Lambda)の作成、読み込み、更新、そして、スキルのテストや、提出、撤回を行うことができます。
ASK CLIでは、AWS CILと同様に、認証情報等はプロファイルで管理され、プロファイルを切り替えることで、簡単に作業環境を切り替えることができます。
ASK CLIの各プロファイルで管理されているのは、次の3つです。
- AWS-CLIのプロファイル名
- Amazon開発者コンソールのアカウント(Login with Amazonのトークン)
- Amazon開発者アカウントで紐づくベンダー(複数のベンダーに紐づいている場合、それを区別するため)
3 インストールとプロファイル作成
インストールは、npmで行うことができます。
1 2 3 | $ npm install -g ask-cli $ ask --version 1.0.0-beta.0 |
続いて、initコマンドで、プロファイルを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 | $ ask init ? Please type in your new profile name: furuya02 <=プロファイル名を指定する -------------------- Initialize CLI -------------------- Setting up ask profile: [furuya02] ? Please choose one from the following AWS profiles for skill's Lambda function deployment. default <= AWS-CLIで設定されているプロファイル名を指定する Switch to 'Login with Amazon' page... Tokens fetched and recorded in ask-cli config. Vendor ID set as MKXXXXXXXXXG3Y Profile [furuya02] initialized successfully. |
途中で、Amazon開発者コンソールへアクセスするためのLogin with Amazonの認可のためのウインドウが表示されます。
そして、認可した場合、Login with AmazonにASK-CLIが追加されていることを確認できます。
プロファイルは、~/.ask/cli_configに作成されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | { "profiles": { "furuya02": { "aws_profile": "default", "token": { "access_token": "Atza|XXXXXXXXXX", "refresh_token": "Atzr|XXXXXXXXXX", "token_type": "bearer", "expires_in": 3600, "expires_at": "2017-09-10T00:24:22.390Z" }, "vendor_id": "MKXXXXXXXXG3Y" } } } |
プロファイルは、initコマンドで複数設定でき、-lで一覧されます。
1 2 3 | $ ask init -l Profile Associated AWS Profile [furuya02] "default" |
4 スキルの作成
newコマンドで、新規にスキルを作成できます。
1 2 3 4 | $ ask new -p furuya02 ? Please type in your new skill name: hello-world New project for Alexa skill created. |
作成されたスキルは、次のようになっています。
1 2 3 4 5 6 7 8 9 10 | └── hello-world ├── lambda │ └── custom │ ├── index.js │ ├── node_modules │ ├── package-lock.json │ └── package.json ├── models │ └── en-US.json └── skill.json |
/lambda/custom/index.jsが、alexa-adkを利用したスキルの本体です。alexa-sdkは、既にnode_modulesにインストールされています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 'use strict' ; var Alexa = require( "alexa-sdk" ); exports.handler = function (event, context) { var alexa = Alexa.handler(event, context); alexa.registerHandlers(handlers); alexa.execute(); }; var handlers = { 'LaunchRequest' : function () { this .emit( 'SayHello' ); }, 'HelloWorldIntent' : function () { this .emit( 'SayHello' ); }, // ・・・略・・・ 'Unhandled' : function () { this .response.speak( "Sorry, I didn't get that. You can try: 'alexa, hello world'" + " or 'alexa, ask hello world my name is awesome Aaron'" ); } }; |
/models/en-US.jsonは、Interaction Modelの設定です。Skill Builder(BETA)のCodeで表示したものと同じようです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | { "interactionModel" :{ "languageModel" :{ "invocationName" : "hello world" , "types" :[], "intents" :[ // ・・・略・・・ { "name" : "AMAZON.StopIntent" , "samples" : [] }, { "name" : "HelloWorldIntent" , "slots" :[ ], "samples" :[ "hello" , "say hello" , "say hello world" ] } // ・・・略・・・ ] } } } |
skill.jsonには、Publishing Informationの内容などが記載されています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | { "skillManifest": { "publishingInformation": { "locales": { "en-US": { "summary": "Sample Short Description", "examplePhrases": [ "Alexa open hello world", "Alexa tell hello world I am Jeff", "Alexa tell hello world my name is Peter" ], "name": "hello-world", "description": "Sample Full Description" } }, "isAvailableWorldwide": true, "testingInstructions": "Sample Testing Instructions.", "category": "EDUCATION_AND_REFERENCE", "distributionCountries": [] }, "apis": { "custom": { "endpoint": { "sourceDir": "lambda/custom" } } }, "manifestVersion": "1.0" } } |
5 デプロイ
deployで、全て一気にデプロイされます。
1 2 3 4 5 6 7 8 | $ cd hello-world/ $ ask deploy -p furuya02 -------------------- Create Skill Project -------------------- Profile for the deployment: [furuya02] Skill Id: amzn1.ask.skill.ecc95f78-f6e0-4c61-a9be-34a68e5cb0b1 Skill deployment finished. Model deployment finished. Lambda deployment finished. |
それでは、デプロイされた状況を順に見てみます。
(1) Lambda
AWS-CLIのプロファイルに従って、対象リージョンにdeployされています。
Triggerも設定されています。
(2) AMI
Lambda用のRoleも、AWSLambdaBasicExecutionRoleの権限で生成されてます。
(3) スキル
Amazon開発者コンソールを開くと、スキルもちゃんと作成されています。
Skill Informationでは、Lambdaのアプリ名に指定したHello-worldが、2語に分かれてInvocation Nameに設定さているのが興味深いです。
Interaction Modelは、先ほどの/models/en-US.jsonが設定されています。
Configrationでは、Endpointがしっかりと設定されていました。
(4) テスト
ここまで、全部できているので、テストタブで試してみると、ちゃんとLambdaが応答していることを確認できました。
6 Application ID
ここまでで、雛形としては完璧ですが、強いて言うと、生成されたコードには、Application Idがセットされていないので、とりあえず追加しておいた方がいいでしょう。
1 2 3 4 5 6 7 8 | const ALEXA_APPLICATION_ID = 'amzn1.ask.skill.ecc95f78-f6e0-4c61-a9be-34a68e5cb0b1' ; exports.handler = function (event, context) { var alexa = Alexa.handler(event, context); alexa.appId = ALEXA_APPLICATION_ID; alexa.registerHandlers(handlers); alexa.execute(); }; |
7 最後に
今回、新規作成からDeployまでやってみましたが、非常に素晴らしいです。
比較的煩雑な作業であったAmazon開発者コンソールでの作業と、Lambdaとの紐付けなどが簡単に終わってしまうので、初めてスキルを作成するという方でも、導入は非常にハードルの低いものになるのではないでしょうか。
個人的には、Interraction Model も、Publishing Informationも、手元で一元管理できる所が、気に入っちゃいました。
8 参考リンク
Announcing Alexa Skill Management API, Alexa Skills Kit Command-line Interface, and Events in the Alexa Skills Kit
ASK Command-Line Interface とスキル管理API
ASK Command-Line Interface Quick Start