Alexaのカスタムスキル開発のためにNode.js用として「Alexa SDK for Node.js Ver2」が公開されました。このAlexa SDK for Node.js Ver2をAWS Lambdaで使用するために、Raspberry piでローカルに開発環境を作成して、AWS Lambdaに開発環境をデプロイします。

前提条件を次に示します。

  • Amazon開発者コンソールのアカウントの作成します。Alexaスキルの設定や対話モデルの作成を行います。今回のサンプルスキルでは特別なものは必要ありませんが、AWS Lambdaで作成した関数のARNを、mazon開発者コンソール設定する必要があります。
  • アマゾンウェブサービス(AWS)のアカウントの作成します。

カスタムスキルを開発するローカルな開発環境として、Raspberry piを使用し、「Raspberry Pi 3にNode.jsのインストール」に従ってNode.js v8.10.0(現状のAWS Lambdaでのバージョンと合わせました)をインストールします。

$ nvm install v8.10.0
Downloading and installing node v8.10.0...
Downloading https://nodejs.org/dist/v8.10.0/node-v8.10.0-linux-armv7l.tar.xz...
######################################################################## 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v8.10.0 (npm v5.6.0)
Creating default alias: default -> v8.10.0
$ node -v
v8.10.0

「Alexa SDK for Node.js Ver2」は次の二つのパッケージのみ(alexa-skills-kit-sdk-for-nodejsはインストールしない)インストールし、最後にインストールされたファイルを表示させます。

$ npm install --save ask-sdk-model
npm WARN saveError ENOENT: no such file or directory, open '/home/pi/alexa/package.json'
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN enoent ENOENT: no such file or directory, open '/home/pi/alexa/package.json'
npm WARN alexa No description
npm WARN alexa No repository field.
npm WARN alexa No README data
npm WARN alexa No license field.

+ ask-sdk-model@1.3.1
added 1 package in 2.491s
$ npm install --save ask-sdk-core
npm WARN saveError ENOENT: no such file or directory, open '/home/pi/alexa/package.json'
npm WARN enoent ENOENT: no such file or directory, open '/home/pi/alexa/package.json'
npm WARN alexa No description
npm WARN alexa No repository field.
npm WARN alexa No README data
npm WARN alexa No license field.

+ ask-sdk-core@2.0.7
added 1 package in 2.787s
$ du -k ./node_modules/
160     ./node_modules/ask-sdk-model
60      ./node_modules/ask-sdk-core/dist/skill/factory
104     ./node_modules/ask-sdk-core/dist/skill
16      ./node_modules/ask-sdk-core/dist/util
20      ./node_modules/ask-sdk-core/dist/service
44      ./node_modules/ask-sdk-core/dist/dispatcher/error
92      ./node_modules/ask-sdk-core/dist/dispatcher/request/handler
32      ./node_modules/ask-sdk-core/dist/dispatcher/request/mapper
28      ./node_modules/ask-sdk-core/dist/dispatcher/request/interceptor
156     ./node_modules/ask-sdk-core/dist/dispatcher/request
236     ./node_modules/ask-sdk-core/dist/dispatcher
16      ./node_modules/ask-sdk-core/dist/attributes/persistence
48      ./node_modules/ask-sdk-core/dist/attributes
92      ./node_modules/ask-sdk-core/dist/response
532     ./node_modules/ask-sdk-core/dist
560     ./node_modules/ask-sdk-core
724     ./node_modules/

インストールしたフォルダ「node_modules」と「package-lock.json」をWindowsにSFTPによりファイル転送します。次に、何を話しかけても “こんにちは” と返ってくる(だけの)スキルファイル「index.js」を作成します。

  • 3行目は、「ask-sdk-core」を指定します。

index.js

'use strict';

const Alexa = require('ask-sdk-core');
 
let skill;
exports.handler = async function (event, context) {
    if (!skill) {
      skill = Alexa.SkillBuilders.custom()
        .addRequestHandlers(MyHandler)
        .create();
    }
    return skill.invoke(event);
}
 
const MyHandler = {
    canHandle(handlerInput) {
        return true;
    },
    handle(handlerInput) {
        return handlerInput.responseBuilder
            .speak('こんにちは')
            .getResponse();
    }
};

これらのファイル/フォルダをzipファイルとして圧縮します。

AWS Lambda関数を作成します。AWSサービスの「lambda」を選択し、表示されたAWS Lambdaの初期画面から、「関数の作成」ボタンをクリックします。 関数の作成では「一から作成」をクリックし、名前等を設定して「関数の作成」ボタンをクリックします。

AWS Lambda関数の作成

次の手順で、AWS Lambdaにデプロイします。

「関数コード」のコードエントリタイプで「zipファイルをアップロード」を選択すると次の内容が表示されます。

zipファイルをアップロード

関数パッケージのアップロードをクリックすると、ファイル選択画面が表示されるので作成したzipファイルを選択し、上部の「保存」ボタンを押します。作成したファイルがアップロードされ、次の内容が表示されます。

AWS Lambdaにデプロイ

AWS Lambda関数を作成し、トリガーとして「Alexa Skills Kit」を設定し、セキュリティの観点で、本来はスキルIDを入力すべきですが、ここでは簡略化のため「無効」を選択し、「追加」ボタンをクリックします。 ハンドラーはデフォルトのindex.handlerのままにします。

作成した関数を試験するには、画面右上の「テスト」ボタンをクリックします。 「テストイベント設定」ダイアログが表示されるので、「イベントテンプレート」「Alexa Start Session」を選択し、イベント名を「AlexaTest]と入力し、画面下の「作成」ボタンをクリックします。 テストの選択が「AlexaTest」になっていることを選択し「テスト」ボタンをクリックしてテストを実行すると、実効結果画面が表示され、「詳細」をクリックすると実行状態が表示されます。

最後に、AWS Lambda関数のARNをコピーします。このARNはAmazon開発者コンソールでスキルを設定する際に必要となります。

Amazon開発者コンソールに紐づいたAmazon Echoからどのような音声を入力しても、「こんにちは」とAmazon Echoが答えます。