Alexa Skills Kit SDK for Node.jsを使ってスキルの永続アトリビュートをAmazon S3に保存する

Node.js版ASK SDKを使って実装した簡単なスキルを例として、ASK SDKに含まれているAmazon S3を永続化サービスとして使えるPersistenceAdapter(S3PersistenceAdapter)の使い方を紹介します。
2018.10.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

English version of this post can be found here.

はじめに

Alexaスキルでデータ(アトリビュート)の永続化を行いたい場合、Alexa Skills Kit(ASK) SDKが提供するAttributesManagerというAPIを使うと、永続アトリビュートの保存と取得を簡単に行うことができます。 永続化レイヤーにはデフォルトでAmazon DynamoDBが使用されるようになっていますが、PersistenceAdapterというAPIを使用するとDynamoDB以外の任意のデータ永続化サービスを接続することもできます。

この記事では、Node.js版ASK SDKを使って実装した簡単なスキルを例として、ASK SDKに含まれているAmazon S3を永続化サービスとして使えるPersistenceAdapter(S3PersistenceAdapter)の使い方を紹介します。

動作確認用スキルの概要

S3PersistenceAdapterの動作確認用のサンプルとして、カフェの注文を受け付けを模擬したダミーのスキルを作成しました。永続アトリビュートの機能を活用して、前回注文したメニューについては「いつもの」と言うだけで注文できるようになっています。

一度目のスキル起動では、普通にオーダーを受け付けます。

ユーザー:「アレクサ、サンプルカフェをひらいて」
アレクサ:「いらっしゃいませ。ご注文はどうしますか?コーヒー、紅茶、緑茶、コーラがありますよ」
ユーザー:「コーヒー」
アレクサ:「コーヒーですね。すぐお作りします!」

二度目のスキル起動からは、「いつもの」と言うだけで前回受け付けたメニューを注文できます。

ユーザー:「アレクサ、サンプルカフェをひらいて」
アレクサ:「いらっしゃいませ。ご注文はどうしますか?コーヒー、紅茶、緑茶、コーラがありますよ」
ユーザー:「いつもの」
アレクサ」「わかりました。いつものコーヒーをお作りしますね!」

一度も注文したことがない状態で「いつもの」と、言われたら、注文を促すように話しかけます。

ユーザー:「アレクサ、サンプルカフェをひらいて」
アレクサ:「いらっしゃいませ。ご注文はどうしますか?コーヒー、紅茶、緑茶、コーラがありますよ」
ユーザー:「いつもの」
アレクサ:「ご来店ははじめてのようですね!ご注文はどうしますか?コーヒー、紅茶、緑茶、コーラがありますよ」

S3PersistenceAdapterを使うスキルを開発するまえに必要な準備

  • ask-sdk-s3-persistence-adapterのインストール
  • 永続アトリビュートを保存するためのS3バケットの作成
    • DynamoDBを使う場合は、スキルの実行時にテーブルを作成するwithAutoCreateTableヘルパー関数を利用できますが、S3を使う場合には事前にバケットを作成しておかないとエラーになります。
  • LambdaからS3バケットへアクセスするためのIAMロールの設定
    • Lambdaに設定したIAMロールにS3へのアクセス権限を追加していない場合もエラーになります。

S3PersistenceAdapterの使い方

GitHubで公開したサンプルスキルのプロジェクトから、Amazon S3を永続化レイヤーに指定して永続アトリビュートの読み書きを行う部分を抜粋します。

S3PersistenceAdapterモジュールの読み込み

import * as Adapter from 'ask-sdk-s3-persistence-adapter';

S3PersistenceAdapterオブジェクトの生成とSkillBuilderオブジェクトの設定

// S3PersistenceAdapterオブジェクトの生成
const S3BUCKET_NAME = process.env['S3BUCKET_NAME'] as string;
const config = {
  bucketName: S3BUCKET_NAME
};
const S3Adapter = new Adapter.S3PersistenceAdapter(config);

// Lambda関数のメイン処理
exports.handler = Alexa.SkillBuilders.custom()
  .addRequestHandlers(
    LaunchRequestHandler,
    OrderIntentHandler,
    RegularOrderIntentHandler
  )
  .addErrorHandlers(ErrorHandler)
  .withPersistenceAdapter(S3Adapter) // SkillBuilderにS3PersistenceAdapterを設定する
  .lambda();

永続アトリビュートの取得と保存

const {attributesManager} = handlerInput;

// 永続アトリビュートオブジェクトの取得
const attributes = await attributesManager.getPersistentAttributes();

// 永続アトリビュートオブジェクトへの値のセット
attributes.drink = drink;
attributesManager.setPersistentAttributes(attributes);

// 永続アトリビュートオブジェクトの保存
await attributesManager.savePersistentAttributes();

S3に保存された永続アトリビュートの実体の確認

S3に保存された永続アトリビュートの実体を確認するために、実際にスキルを動作させてみます。初回の起動で「いつもの」と言っても、永続アトリビュートがまだ保存されていないため通常の注文を受けるフローが実行されます。

regular-order-1st-try

一度注文を行ったあとにLambdaで指定したS3バケットを開くと、以下のようにユーザーID単位でファイル(オブジェクト)が作成されます。

s3-persistent-attributes-key

このファイルの中身はJSON形式のテキストファイルで、以下のように注文内容が保存されています。

content-of-persistence-attribute

もう一度、スキルを起動して「いつもの」というと、永続アトリビュートが参照されるようになります。

regular-order-2nd-try

補足

おわりに

ASK SDKに用意されているAttributesManager APIを使うとAlexaスキルの永続アトリビュートの保存と取得を簡単に行うことができます。PersistenceAdapter APIを使えば永続化サービスをデフォルトのDynamoDBからAmazon S3など別の永続化サービスにも簡単に切り替えることができました。

最後まで読んでいただきありがとうございました。参考になるところがありましたら、SNSでシェアしていただけると嬉しいです。コメントもお待ちしています!

参照