Alexa Skill向けのLambdaを自分のAlexa Skill以外で使わせない様にする方法

この記事は一人Alexa Skills Kit for Node.js Advent Calendar 2017の9日目の記事です。 Amazon Alexa + AWS Lambdaの組み合わせの場合、Alexa SK […]

広告ここから
広告ここまで

目次

    この記事は一人Alexa Skills Kit for Node.js Advent Calendar 2017の9日目の記事です。

    Amazon Alexa + AWS Lambdaの組み合わせの場合、Alexa SKillの開発画面でAWS LambdaのARNを指定するだけで連携ができます。

    ただしこの場合、該当するLambdaファンクションにアクセスできるアカウントであれば他のスキルからもLambdaを実行することが可能です。

    複数人でスキル開発している場合に、誤って別のチームのLambdaのARNを指定してしまった場合などでしょうか。

    個人情報を取り扱う様なスキルも作れることを考えると、特定のSkillからのみ起動できるようにしたくなります。

    alexa-sdkなら1行で解決

    で、この実装はalexa-sdkの場合1行コードを足すだけでOKです。

    'use strict'
    const Alexa = require('alexa-sdk')
    const handlers = {
      'LaunchRequest': () => this.emit(':tell', 'Hello World')
    }
    
    module.exports.hello = (event, context, callback) => {
      alexa = Alexa.handler(event, context, callback)
      // 下の1行を追加する
      alexa.appId = 'amzn1.ask.skill.[unique-value-here]'
      alexa.registerHandlers(handlers)
      alexa.execute()
    }
    

    appIdはAlexa Skillの管理画面から確認することができます。

    「スキルIDの表示」を押すとでます

    これで指定したappIdと、Alexaから送られてくるevent.application.applicationIdの値が一致する場合のみスクリプトを実行できるようになります。

    問題点

    テストなどを実行してみるとわかるのですが、特にエラーハンドリングしてくれません。
    バックエンド処理が失敗した場合のデフォルト応答がAlexaからは発話されます。

    $ ./node_modules/mocha/bin/_mocha test/unit/*
    
    LaunchRequest
    The applicationIds don't match: amzn1.ask.skill.[unique-value-here] and hoge
    Unexpected exception 'AssertionError: false == true':
    AssertionError: false == true
      at Decorator._callFunc (/Users/alexa-examplealexa-hello-world/node_modules/empower-core/lib/decorator.js:110:20)
      at Decorator.concreteAssert (/Users/alexa-examplealexa-hello-world/node_modules/empower-core/lib/decorator.js:103:17)
      at Function.decoratedAssert [as ok] (/Users/alexa-examplealexa-hello-world/node_modules/empower-core/lib/decorate.js:51:30)
      at Object.fail (/Users/alexa-examplealexa-hello-wor
    

    ちょっとソース追いかけていけそうならPR出してみようかなとは思っていますが、「このスキルでは利用できません」の様な応答をさせたいなと思った場合は自力で比較する実装を作られたほうが良さそうかなと思います。
    「デフォルトのエラーメッセージでよくね?」で終わりそうな気もしますが・・・

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark