[日本語Alexa] Alexa Skills Kit for Node.js 次の一歩(データ保存)
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の一意性調査