今年5月Alexa Skills Kit (ASK) SDK for Node.jsのバージョン2(以下:V2)がリリースされました。そこでV1からV2へ移行を考える方が多いと思います。先週行われたAlexa Dev Days Tokyoで沢山のAlexaスキルデベロッパーとお会いする中で、これに関連した質問をいただきましたので、ご紹介します。
V1を使って、DynamoDBテーブルを自動生成した場合、作られたテーブルのパーティーションキーはuserIdでアトリビュートの名はmapAttrですが、V2ではそれぞれidとattributesになります。そのため、V1で作ったDyanmoDBテーブルはそのままではV2では使えないという問題がありました。そこで、DynamoDBのテーブルを再作成せずに、V2でそのまま使うことはできますか?という質問をいただきました。答えは「はい!できますよ!」です。
V2のDynamoDBのキーとアトリビュート名のデフォルト値は変わりましたが、DynamoDBPersistenceAdapterを使って、カスタムでそれぞれのDynamoDBの値を自分で定義することができます。
以下のテーブルでV1とV2の相違点が分かります。
パーティーションキー | アトリビュート名 | |
V1 | userId | mapAttr |
V2 | Id | Attributes |
以下のステップでV1で作ったDynamoDBテーブルがV2で使えます。
まずは、ask-sdk-dynamodb-persistence-adapterというパッケージが必要です。以下のようにインポートしたら、DynamoDBPersistenceAdapterが使えるようになります。
const { DynamoDbPersistenceAdapter } = require('ask-sdk-dynamodb-persistence-adapter');
次に、インポートしたパッケージを使って、DynamoDBPersistenceAdapterを定義します。コンストラクタでいくつかのカスタム値を渡して設定します。
const dynamoDbPersistenceAdapter = new DynamoDbPersistenceAdapter({
tableName : 'persistence-demo',
partitionKeyName: 'userId',
attributesName: 'mapAttr'
})
tableNameに接続したいDynamoDBテーブルを指定します。上の例ではpersistence-demoというテーブルを指定しています。partitionKeyNameでパーティーションキーを定義します。V1で作られたDynamoDBテーブルにアクセスするので、パーティションキーはuserIdにします。最後にattributesNameをmapAttrを指定します。
dynamoDbPersistenceAdapterを定義してから、最後のステップに進んでも良いでしょう。
最後に、ここまでで定義したDynamoDbPersistenceAdapterをSkillBuilderにwithPersistenceAdapterで追加します。
const skillBuilder = Alexa.SkillBuilders.custom();
exports.handler = skillBuilder
.addRequestHandlers(
LaunchRequestHandler,
HelpIntentHandler,
CancelAndStopIntentHandler,
SessionEndedRequestHandler
)
.withPersistenceAdapter(dynamoDbPersistenceAdapter)
.addErrorHandlers(ErrorHandler)
.lambda();
StandardとCustomという2種類のSkillBuildersがありますが、StandardではV2のデフォルト設定が固定されています。一方、CustomのSkillBuilderで自分でDynamoDBの設定をカスタマイズすることができます。
したがってwithPersistenceAdapterという関数を使う場合はCustom**を選択する必要があります。以上で定義したdynamoDbPersistenceAdapterをwithPersistenceAdapterに渡したら、PersistenceAdapter**をいつも通りに使えば、自動的にV2がV1で作られたDynamoDBテーブルにアクセスできるようになります。
以上の手順に従ってDynamoDbPersistenceAdapterを使えば、いつも通りにAttributesManagerが使えます。つまり、AttributesManagerでPersitentAttributesにアクセスするコードを全く変更せずに、カスタムDynamoDBの設置を使うことができます。とても便利ですね。
// attributesManagerを定義し、そしてpersistentAttributesを読み込む。
const attributesManager = handlerInput.attributesManager;
const persistentAttributes = attributesManager.getPersistentAttributes();
// DynamoDBに保存する値を設定する。
persistentAttributes.foo = 'bar';
// アトリビュートを設定する。
attributesManager.setPersistentAttributes(persistentAttributes);
// DynamoDBに保存する。
attributesManager.savePersistentAttributes();
V2はかなりフレキシブルです。デフォルトで設定されている値が沢山ありますが、いくつかの方法で設定をカスタマイズすることができます。V1で作られたDynamoDBテーブルをそのままでV2でも使うことができますが、それだけではなく、異なるプロジェクトから既存のDynamoDBテーブルにも簡単にアクセスすることができます。これを機会に是非V1からV2への移行を行なって下さい。V1で作成されたDynamoDBテーブルをそのまま引き継いで使用し続けることができます。
10月16日にAlexaスキル開発トレーニングシリーズもV2にアップデートしました。是非ご覧ください。これからのスキル開発はV2で進めましょう!