Alexa Skills Kit for Node.js 次の一歩(DynamoDB)

2017.06.25

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

この記事は、2018/01/06 日本語対応も含め、最新版にリメイクされました。是非、こちらをご参照下さい。

1 はじめに

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

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

Alexa Skills Kit for Node.js はじめの一歩

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

2 DynamoDB

Alexa SDKでは、データの永続化のために、DynamoDBが軽易に利用可能になっています。 DynamoDBを利用するために必要な作業は、以下の2つだけです。

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

(1) テーブル名の指定

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

alexa.dynamoDBTableName = 'MySkillSampleTable';

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

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

arn:aws:sts::xxxxx/MySkillSample_hello is not authorized to perform: dynamodb:GetItem on resource: arn:aws:dynamodb:xxxxxxx:table/MySkillSampleTable"

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

001

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

002

(3) データの保存

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

var handlers = {
    'Unhandled': function () {
       var kCounter = "counter";
       var counter = this.attributes[kCounter];
       if (counter === undefined) {
          counter = 0
       }
       this.attributes[kCounter] = counter + 1;
       this.emit(':tell', 'The counter is ${counter}');
    }
};

開発者ポータルから実行してみると、呼び出す度にカウンターが増えることを確認できます。 レスポンスをみると分かりますが、sessionAttributes にも、同時に書き込まれているようです。

003

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

005

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

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

this.attributes["message"] = 'value';
this.attributes["flg"] = true;
this.attributes["list"] =  ['foo', 'bar', 'baz'];

004

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

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

007

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 Skills Kit for Node.js はじめの一歩