alexa-sdkでDynamoDBをつかう
この記事は一人Alexa Skills Kit for Node.js Advent Calendar 2017の17日目の記事です。 attributesを使うことでデータを一時的に保持することはできます。ですがセッシ […]
目次
この記事は一人Alexa Skills Kit for Node.js Advent Calendar 2017の17日目の記事です。
attributes
を使うことでデータを一時的に保持することはできます。ですがセッションが終了すると消えてしまうものですので、永続化したいデータには向いていません。
DynamoDBをalexa-sdk
でよしなに扱う
alexa-sdk
を使う場合は心配になるくらい簡単にセットアップと利用ができます。
exports.handler = function (event, context, callback) {
var alexa = Alexa.handler(event, context, callback);
alexa.appId = 'appId';
alexa.dynamoDBTableName = 'YourTableName'; // これだけ
alexa.registerHandlers(handlers;
alexa.execute();
};
alexa.dynamoDBTableName
に使用するテーブルの名前を書きましょう。
初回の実行時にテーブルが存在しなければalexa-sdkがDynamoDBのテーブルの作成をやってくれます。(エラーになった場合はLambdaのIAMロールがDynamoDBへのアクセスを許可されてるか確認しましょう)
あとはいかのような関数を用意してthis.attributes
に保存したいデータをつっこみましょう。
function saveValue(options) {
let key = `_${options.fieldName}`;
// if append and the value exists push it into the array.
// if append but it doesn't exist add it as an array.
// else just save it as a singular value.
// NOTE: This will fail if you set options.append to true
// on a value that was previously saved with options.append
// set to false. You'll need to convert the field first.
// check if it's an array and if not convert it to an array
// and push.
if (options.append && this.attributes[key]) {
this.attributes[key].push(options.data);
} else if (options.append) {
this.attributes[key] = [options.data];
} else {
this.attributes[key] = options.data;
}
}
from: https://github.com/alexa/skill-sample-nodejs-petmatch/blob/master/lambda/custom/index.js#L277-L302
[key]
がKeyで代入されてる値がValueとして保存されます。
また、プライマリキーはUserId
を自動挿入してくるので特に意識する必要はありません。
べんり・・・?
- IAMロールにDynamoDB周りを追加
alexa.dynamoDBTableName
にテーブル名を追加this.attributes
にKVS方式でデータを保存
この3ステップで各種データをDynamoDBに保存することができます。
ただし、this.attributes
の値を全部突っ込んでくることや、テーブルの新規作成までやってくるところが引っかかる人もいるかもしれません。
もし「ちょっとなぁ・・・」という方は、aws-sdk
でputItem
などをする方法も検討してみてください。