[日本語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にテーブル名を設定します。
1 | alexa.dynamoDBTableName = 'MySkillSampleTable' ; |
Alexa SDKでは、dynamoDBTableNameにテーブル名が設定されると、セッション情報をすべてDynamoDBに保存するようになります。
(2) パーミッションの追加
上記のようにテーブル名を指定しただけでは、DynamoDBの操作権限が無いため、Lambdaは、下記のようにエラーとなってしまいます。
1 | "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というキーに数値を保存して、実行される度にインクリメントしています。
1 2 3 4 5 6 7 8 9 10 11 | 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のみではありません。
1 2 3 | this .attributes[ "message" ] = 'メッセージ' ; this .attributes[ "flg" ] = true ; this .attributes[ "list" ] = [ 'りんご' , 'みかん' , 'バナナ' ]; |
マップ型も保存が可能であるため、JSONオブジェクトもそのまま保存できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 Skills Kit for Node.js はじめの一歩