
今年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で進めましょう!