[日本語Alexa] Alexa Skills Kit for Node.js 次の一歩(データ保存)

2018.01.07

0 リプレイスについて

Alexaは、昨年(2017年)11月に日本語対応となりました。ここDevelopers.IOでは、英語でしか利用できない頃から色々Blogに書いてきたのですが、更新された情報も含めて日本語で利用するAlexaについて纏め直してみたいと思います。

この記事は、下記の記事のリプレイス版です。
Alexa Skills Kit for Node.js 次の一歩(DynamoDB)

1 はじめに

Alexa Skills Kit for Node.js (以下、Alexa SDK) は、Amazon のAlexaチームによって作成されたスキル作成用のSDKです。

前回、このSDKの入門として、下記の記事を書きました。

[日本語Alexa] Alexa Skills Kit for Node.js はじめの一歩

今回は、この続きとして、Alexa SDKによるデータの保存について見ていきたいと思います。 このSDKに触れるのが初めての方は、是非、上記も併せてご覧下さい。

2 DynamoDB

Alexa SDKでは、データ保存のために、DynamoDBが簡単に利用できるようになっています。 DynamoDBを利用するために必要な作業は、以下の2つだけです。

  • テーブル名の指定
  • パーミッションの追加

(1) テーブル名の指定

DynamoDBを使用する場合は、dynamoDBTableNameにテーブル名を設定します。

alexa.dynamoDBTableName = 'MySkillSampleTable';

Alexa SDKでは、dynamoDBTableNameにテーブル名が設定されると、セッション情報をすべてDynamoDBに保存するようになります。

(2) パーミッションの追加

上記のようにテーブル名を指定しただけでは、DynamoDBの操作権限が無いため、Lambdaは、下記のようにエラーとなってしまいます。

"errorMessage": "Error fetching user state: AccessDeniedException: User: arn:aws:sts::xxxxxxxxxxxx:assumed-role/sample_role/sample is not authorized to perform: dynamodb:GetItem on resource: arn:aws:dynamodb:us-east-1:xxxxxxxxxxxx:table/MySkillSampleTable",

DynamoDBにアクセスできるように必要なパーミッションを追加して下さい。

再びLambdaを実行すると、userIdがキーとなった、テーブルが生成されていることを確認できます。

(3) データの保存

続いて、DBを使用してデータを保存するコードを書いてみます。 counterというキーに数値を保存して、実行される度にインクリメントしています。

var handlers = {
    'Unhandled': function () {
       const kCounter = "counter";
       let counter = this.attributes[kCounter];
       if (counter === undefined) {
          counter = 0;
       }
       this.attributes[kCounter] = counter + 1;
       this.emit(':tell', 'カウンターは、' + counter + 'です。');
    }
};

開発者ポータルから実行してみると、呼び出す度にカウンターが増えることを確認できます。 レスポンスをみると分かりますが、sessionAttributes にも、同時に書き込まれています。(正確には、sessionAttributesの内容が、そのまま全部DynamoDBに保存されています。)

DynamoDBの方を確認してみても、値が保存されていることが分かります。なお、ここでキーとなっている userId は、スキルを使用しているユーザ(Amazonアカウント)から生成された識別子になっているため、同じアカウントで使用した場合に、前回のデータが利用可能となります。

(4) 様々な型のデータ保存

利用できるデータ型はNUMBERのみではありません。

this.attributes["message"] = 'メッセージ';
this.attributes["flg"] = true;
this.attributes["list"] =  ['りんご', 'みかん', 'バナナ'];

マップ型も保存が可能であるため、JSONオブジェクトもそのまま保存できます。

let obj = {
     Day: "Monday",
     UnreadEmails: 42,
     ItemsOnMyDesk: [
          "Coffee Cup",
          "Telephone",
          {
                Pens: { Quantity : 3},
                Pencils: { Quantity : 2},
                Erasers: { Quantity : 1}
           }
     ]
};
this.attributes["obj"] = obj;

3 最後に

今回は、Alexa SDKによる、DynamoDBを利用したデータの保存について紹介させて頂きました。

アカウント毎のデータ保存用として最適化されているため、スキル開発者は、ユーザ固有の情報を保存するという意味であれば、何も意識することなく非常に簡単に使用できると思います。

4 参考リンク


Announcing the Alexa Skills Kit for Node.js
GitHub https://github.com/alexa/alexa-skills-kit-sdk-for-nodejs
[日本語Alexa] 日本語スキルを公開しました。審査提出から公開まで 〜あなたの味方〜
[日本語Alexa] Alexa Skills Kit for Node.js はじめの一歩
[日本語Alexa] スキルで利用可能な各種IDの一意性調査