[日本語Alexa] Alexa-hostedスキル(ベータ版)で永続化データを管理するクラスを作成してみました

1 はじめに

AIソリューション部の平内(SIN)です。

先日、Alexa-hostedスキル(ベータ版)が、一般利用可能になりました。
すべての開発者がAlexa-hostedスキル(ベータ版)を利用できるようになりました

Alexa-hostedでは、AWS Lambda、Amazon S3、AWS CodeCommitをAWSのアカウント無しで利用可能です。

しかし、提供されているサービスにDynamoDBが含まれていないため、Alexa-DSKで実装されているDynamoDBを使用したデータの永続化は利用できません。

そこで、今回は、Alexa-hostedで利用可能なS3を使用して、データの永続化を行うクラスを作成してみました。

ちょうど、S3で永続化データを利用できる、PersistenceAdapterのイメージです。


2019.01.28追記
既に、@zono_0さんによる ask-sdk-s3-persistence-adapter を利用したデータの永続化が紹介されていました。 Alexa-hostedによる、ユーザーごとの永続化データは、⇣が王道ですね。

Alexa-hostedスキルでセッション永続性(S3)とメディアファイル(S3ファイル)を利用する方法

2 動作確認

最初に利用している様子です。テストのために作成したスキルでは、永続化データを使用して、カウンターを実装してみました。

呼び出し名は、「セッションテスト」としました。

開発者コンソールのコードエディタを利用しています。

開発者コンソールのテストで、動作確認しているようすです。呼び出すたびに、カウンターがインクリメントされていることが確認できます。

3 永続化データ管理クラス

S3を使用して永続化データを管理するクラスは、下記のとおりです。

ユーザーごとのデータを管理できるように、コンストラクタで、userIdを取得して、Keyとして使用しています。なお、Alexa-hostedで使用できるバケットは、決められていて、環境変数のS3_PERSISTENCE_BUCKETから取得できます。

get()set()は、キーを指定してデータの読み書きを行っています。

const AWS = require('aws-sdk');
const s3 = new AWS.S3();

class AttributesManager {
    constructor(handlerInput) {
        this._params = {
            Bucket: process.env.S3_PERSISTENCE_BUCKET,
            Key: handlerInput.requestEnvelope.context.System.user.userId,
        }
    }

    async get(key) {
        try {
            const data = await s3.getObject(this._params).promise();
            const json = JSON.parse(data.Body);
            return json[key];
        } catch (err) {
            // まだデータが存在しない場合
            return undefined;
        }
    }

    async set(key, value) {
        let attr = {}
        attr[key] = value;
        this._params.Body = JSON.stringify(attr);
        return await s3.putObject(this._params).promise();
    }
}

4 使用例

先の永続化データ管理クラスを使用している例です。

永続化データ管理クラスでは、キーを指定してデータのRead Writeが可能ですが、ここでは、counterというキー名で、数値オブジェクトを読み書きしています。

S3への保存は、全て文字列に変換して行っているので、扱うデータの型は、問いません。

とりあえず、リクエストを全部受けるために、canHandleでtrueを返していますが、あくまでテストのためということでご了承下さい。

const LaunchRequestHandler = {
    canHandle(handlerInput) {
        return true; // テストのために、とりあえず全てのリクエストを処理する
    },
    async handle(handlerInput) {
        // 永続化情報管理クラス
        const attributesManager = new AttributesManager(handlerInput);

        // 永続化データの取得
        const key = "counter";
        let counter = await attributesManager.get(key);
        if (counter === undefined) { 
            // データが存在しない場合の初期化
            counter = 0;
        }
        counter++;
        // 永続化データの保存1
        await attributesManager.set(key, counter);

        const speechText = 'カウンターは' + counter + 'です。';
        return handlerInput.responseBuilder
            .speak(speechText)
            .reprompt(speechText)
            .getResponse();
    }
};

5 S3の状況

S3を見ると、userIdをキーとしたデータができているのが確認できます。

データの中身は、JSONが、文字列として保存されています。

6 最後に

そこで、今回は、Alexa-hosted(ベータ版)で利用可能なS3を使用して、データの永続化を行うサンプルを作成してみました。

個人的には、スキルで心地よい体験を提供するには、永続化データは、必須だと思います。Alexa-hostedで利用可能なのは、限られた資源となりますが、なんとかこれを駆使して快適なスキル作成に挑戦してみたいです。

弊社では、「Amazon Connect」の導入を検討している方を対象とした無料相談会を毎週開催中です。

また、音声を利用した各種ソリューションの導入支援を行っております。お気軽にお問い合わせください。
チャットボット開発支援
クラウド型コンタクトセンターサービス導入支援

7 参考リンク


すべての開発者がAlexa-hostedスキル(ベータ版)を利用できるようになりました
[日本語Alexa] Alexa-SDK Ver2 永続化情報の保存先をS3にしてみた 〜PersistenceAdapterの置き換え〜

コメントは受け付けていません。