Alexaスキルのユーザー情報を、スキル無効化時に削除する
スキルでDB使っていますか?使っている?それはよかった。 では、スキルを停止したユーザーの情報を消してますか? Alexaスキルでは、一度無効化するとIDが変わるためにまったく別のユーザーとして扱われます。 スキルの利用 […]
目次
スキルでDB使っていますか?使っている?それはよかった。
では、スキルを停止したユーザーの情報を消してますか?
Alexaスキルでは、一度無効化するとIDが変わるためにまったく別のユーザーとして扱われます。
スキルの利用は、AlexaアプリからEnable/Disableが可能ですが、利用していたスキルを一旦Disableにして、再びEnableに戻した場合、userId及び、deviceIdが変化します。
ということで、無効化したユーザーの情報は消しておきましょう。
スキルイベントを利用する
会話の外で起きたイベントでスキルを起動することができる機能がAlexaにはあります。この中の、スキル無効化時に発火するイベントを利用します。
skill.jsonに追加する
以下のような形でスキルにイベントを設定しましょう。イベント名とLambdaのARNがわかればOKです。
{
"manifest": {
"events": {
"subscriptions": [
{
"eventName": "SKILL_DISABLED"
}
],
"endpoint": {
"uri": "arn:aws:lambda:us-east-1:99999999:function:ask-custom-skill-event-default"
}
},
...
独自のLambdaを設定しても問題ありませんが、管理が面倒なのでスキルに利用するものと同じのを指定してみます。
イベントハンドラーを設定する
あとはスキルイベントが発火した時のリクエストを処理するハンドラーを追加します。
const SkillDisabledHandler = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === 'AlexaSkillEvent.SkillDisabled'
},
async handle(handlerInput) {
if (!handlerInput.attributesManager.deletePersistentAttributes) return
await handlerInput.attributesManager.deletePersistentAttributes()
}
}
簡単ですね。通常のリクエストハンドラーと同様.addRequestHandlers
に追加してやりましょう。
ちなみにhandlerInput.attributesManager.deletePersistentAttributes
は後で追加されたメソッドなので、SDKのアプデをしていないとメソッドがない可能性もあり要注意です。
これで何が起きるか
スキル無効化時にhandlerInput.attributesManager.deletePersistentAttributes
が実行されます。これはDynamoDB.DocumentClient.Deleteを実行してくれるラッパーなので、無効化したユーザーのItemを消してくれます。
使われないユーザー情報を持ち続ける必要もありませんので、DB情報を扱うスキルで、無効化された後その情報を必要としない場合はとりあえず入れておくとよいでしょう。