Alexa Skills Kit(ASK) SDK for Node.js バージョン2を適用した

ASK SDK for Node.js バージョン2を
私が個人で運用しているAlexaカスタムスキル「五月雨の音」に適用しました。

https://www.amazon.co.jp/dp/B07DVVJ8KC/www.amazon.co.jp

実践した事柄を紹介します。

Alexa Skills Kit(ASK) SDK for Node.js バージョン2とは

まず、「ASK SDK for Node.js バージョン2」についてです。
Alexaカスタムスキルをコーディングする時に、
様々な言語を利用して直書きすることも可能ではあるのですが、
Alexaの機能にアクセスする命令をラップしたSDKも提供されています。
それが「ASK SDK for Node.js」になります。

github.com

ASK SDK for Node.jsは2018年5月にバージョン2がリリースされました。
私のカスタムスキルはバージョン1で動作していました。
今回、バージョン2を適用するようにマイグレーションしました。

実践したこと

1. テストコード記述によるハッピーパスの確認

ASK SDK for Node.js バージョン2にマイグレーションする時にまず実践したことが、
テストコードの記述です。

テストコードに関するセッションで有名なt.wadaさんに影響を受けて、
Alexaのテストコードによるハッピーパスの確認を行うようにしました。
Testing Frameworkは、Alexa Skill Test Frameworkを利用しました。

github.com

下記のようにテストを実行することで、動作確認が行えます。

f:id:yasay:20190126030725p:plain

2. CI環境の構築

テストコードを記述したことにより、CIをするための準備が整いました。
CI環境にはCircleCIを利用しました。

circleci.com

CircleCIはパブリックリポジトリであれば4コンテナまで無料で実行可能です。
Alexaカスタムスキル「五月雨の音」はパブリックリポジトリで運用しているため、
その恩恵を充分に受けることが出来ます。

ビルドおよびテストの結果はSlackのWebhookで通知されます。

f:id:yasay:20190126030903p:plain

CircleCIはローカルで動作確認するためのコマンドが用意されています。
ローカルなら、リポジトリへのpushをトリガーとする必要がないため、
円滑にCI環境の構築が行えます。

# ローカル実行のためのCLIをインストール
sudo curl https://raw.githubusercontent.com/CircleCI-Public/circleci-cli/master/install.sh \
--fail --show-error | bash

# アップデートの確認
circleci update check

# アップデートにインストール
circleci update install

# configファイル検証
circleci config validate

# localでの動作確認
circleci local execute

3. SAM CLIによるInvoke処理の確認

LambdaはAWS SAMによってデプロイしています。
SAM CLIはローカルでAWS Lambdaを実行するためのコンテナが起動します。
つまり、プロダクションにデプロイする前にLambdaのinvokeによる動作確認が出来ます。

# sam localによるLambdaのinvoke
sam local invoke "serverlessFunction" --event "./test/event/SoundsOfRainIntent.json"

4. ASK CLIによる動作確認

ASK CLIによるインテント呼び出し観点での動作確認をしました。
Alexaは自然言語処理を介してLambdaのIntentハンドラーが呼び出されるので、
Alexa側の呼び出しをシミュレートするコマンドが用意されています。
それが、「ASK CLI」になります。

# シミュレートの実行(LaunchRequest)
ask simulate --text "さみだれのおとを開いて" --locale ja-JP \
--skill-id ${ALEXA_SOUNDS_OF_RAIN_APP_ID} --profile xblood

5. オーディオファイルにCloudFrontを適用

このタイミングを機に、パブリックなS3バケットからのAudioファイルの取得から、
CloudFront経由に乗り換えました。許可したくないアクセス元が存在する場合、
WAFによるセキュリティ対策も可能になりました。
AWSリソースはTerraformを用いて構築しました。

6. エイリアス定義の見直し

LambdaのエイリアスにAutoPublishAlias属性を使用していたのですが、
Lambda単体でAutoPublishAlias属性を利用するメリットが今回のケースでは無いため、
アライアスはマネージメントコンソールから付与するように変更しました。

課題点

ASK SDK for Node.js バージョン2の適用は成功しましたが、課題も残りました。

コード補完が使えない。

Intentに対応する各種ハンドラーはconstで定義された関数として記述します。
この時、私のvscodeの開発環境ではコード補完が行われなかったため、
テストコードを実行するまでは記述内容が正しいのか不安になることがありました。

これについては私のNode.jsスキルが上昇すれば解決すると思いますが、
TypeScriptによるカスタムスキルの実装も実践していきたい。

// handlerInputにコード補完が利用できない
const LaunchRequestHandler = {
    canHandle(handlerInput) {
        return handlerInput.requestEnvelope.request.type === 'LaunchRequest';
    },
    handle(handlerInput) {
        console.log('Start LaunchRequest');
        return handlerInput.responseBuilder
            .speak(HELP_MESSAGE)
            .reprompt(HELP_MESSAGE)
            .getResponse();
    }
};

CD環境の構築

CI環境まで構築できれば、あと少しの手間でCD環境も構築できます。
今後はリリースブランチへのプッシュによるCD環境構築を実践していきたい。

おわりに

常に自分にとって新しい関心事をインプットとし、
アウトプットも今までにないことをする。
この姿勢を維持し、これからも取り組んでいきたいと思います。