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
packageとfunctions.hello.eventsを追加しています。
packageはalexa-sdkのファイルを同梱するために追加しています。
他のライブラリを入れたくない場合は、npm prune --productionでdevDependenciesのファイルを消すか、babelで頑張る必要があります。
あとはLambdaにイベントトリガーを設定する必要があるので、eventsにalexaSkillをつけておきましょう。
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.jsのhandlerを実行してくれます。
デプロイ
あとはsls deployでデプロイすればOKです。
その他
テストするときは、sls logs -f hello -tでログ監視しておくとログ追跡できて便利です。