Serverless FrameworkでAlexa Skill向けLambdaをデプロイする

この記事は一人Alexa Skills Kit for Node.js Advent Calendar 2017の4日目の記事です。 alexa-sdkをAWS Lambdaで動かせば簡単にAlexa Skillを作り始 […]

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

目次

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

    alexa-sdkをAWS Lambdaで動かせば簡単にAlexa Skillを作り始めることができます。

    そうなると今度は「じゃあそのソースコードのデプロイや管理はどうしましょう?」という問題に行き着きます。

    個人的にオススメしているのは、Serverless Frameworkを使うことです。

    Serverless Frameworkをつかうメリット

    • rollbackやステージ指定のデプロイ、ローカル実行などコマンドが豊富
    • CloudFormation記法でAWSリソースを追加できる
    • イベントトリガーもserverless.ymlで指定できる

    Serverless Frameworkをつかうデメリット

    Alexa Skill用のLambda1つ管理するだけなら少々オーバースペック感はあるかもしれません。
    ですが他のプロジェクトでServerless Frameworkを使われているかたであれば、そのノウハウをそのまま使えるのでよいかなと思います。

    Node.js & AWS Lambdaでのserverless.yml

    Node.jsの場合の最低限がだいたいこんな感じです。

    service:
      name: myService
    
    provider:
      name: aws
      runtime: nodejs6.10
    
    functions:
      hello: 
        handler: index.handler
    

    Node.js & AWS Lambda + alexa-sdkでのserverless.yml

    alexa-sdkを使ったCustom Skillの場合はこうなります。

    service:
      name: myService
    
    provider:
      name: aws
      runtime: nodejs6.10
    
    package:
      include:
        - node_modules/
    
    functions:
      hello:
        handler: index.handler
        events:
          - alexaSkill
    

    packagefunctions.hello.eventsを追加しています。

    packageはalexa-sdkのファイルを同梱するために追加しています。
    他のライブラリを入れたくない場合は、npm prune --productiondevDependenciesのファイルを消すか、babelで頑張る必要があります。

    あとはLambdaにイベントトリガーを設定する必要があるので、eventsalexaSkillをつけておきましょう。

    Lamnbdaのコードを書く

    index.jsに以下の様なコードを用意しておけば、OKです。

    'use strict'
    const Alexa = require('alexa-sdk')
    const handlers = {
      'LaunchRequest': function () {
        this.emit(':tell', 'サンプルスキルへようこそ。')
      },
      'AMAZON.StopIntent': function () {
        this.response.speak('さようなら')
        this.emit(':responseReady')
      }
    }
    
    module.exports.handler = (event, context, callback) => {
      alexa = Alexa.handler(event, context, callback)
      alexa.registerHandlers(handlers)
      alexa.execute()
    }
    

    serverless.ymlでの設定はindex.handlerなので、index.jshandlerを実行してくれます。

    デプロイ

    あとはsls deployでデプロイすればOKです。

    その他

    テストするときは、sls logs -f hello -tでログ監視しておくとログ追跡できて便利です。

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