Serverless FrameworkだけでAlexa Skill開発
Serverless FrameworkだけでAlexaスキルが管理できるということを知っている人は意外と少ないのかなと思ってまとめました。照井さん遅くなってすみません。 セットアップ sls createコマンドから始 […]
目次
Serverless FrameworkだけでAlexaスキルが管理できるということを知っている人は意外と少ないのかなと思ってまとめました。照井さん遅くなってすみません。
セットアップ
sls createコマンドから始めることができます。templateにaws-alexa-typescriptを指定しましょう。
$ sls create -t aws-alexa-typescript -p ask-serverless
Serverless: Generating boilerplate...
Serverless: Generating boilerplate in "/Users/develop/sandbox/ask-erverless"
 _______                             __
|   _   .-----.----.--.--.-----.----|  .-----.-----.-----.
|   |___|  -__|   _|  |  |  -__|   _|  |  -__|__ --|__ --|
|____   |_____|__|  \___/|_____|__| |__|_____|_____|_____|
|   |   |             The Serverless Application Framework
|       |                           serverless.com, v1.34.1
 -------'
Serverless: Successfully generated boilerplate for template: "aws-alexa-typescript"
$ cd ask-serverless
$ npm iディレクトリ構成は以下の通りです。
$ tree -I node_modules
.
├── handler.ts
├── package.json
├── serverless.yml
├── source-map-install.js
├── tsconfig.json
└── webpack.config.js
0 directories, 6 filesAmazonアカウントとの連携
ここからはAlexaのデプロイに備えてAmazon開発者アカウントとの連携などを進めます。
$ sls alexa auth実行すると、Amazon開発者アカウントでのログインを求められます。OAuthの認証が終われば、以下のように完了したメッセージが表示されてコマンドが完了します。

これで終わりです。簡単ですね。ちなみにここで取得した認証情報はどうやら ~/.serverless/.alexa-skills-token.jsonからみれる様子です。
CDに組み込みたい場合は、このJSONをCDサービス上で復元できるようにしれやれば良いでしょう。(SSMのSecureStringで値を保存 -> ビルドコマンド内でJSON作成とか)
serverless.ymlの更新
続いてserverless.ymlに一部手を加えます。というのも元のコードはen-GB向けになっているため、日本語でスキルをデプロイするようにする必要があります。
service:
  name: ask-serverless
plugins:
  - serverless-webpack
  - serverless-alexa-skills
provider:
  name: aws
  runtime: nodejs8.10
custom:
  alexa:
    skills:
      - id: amzn1.ask.skill.xxxx-xxxx-xxxx-xxxx-xxxx
        manifest:
          publishingInformation:
            locales:
              ja-JP:
                name: はじめてのサーバーレス
          apis:
            custom:
              endpoint:
          manifestVersion: '1.0'
        models:
          ja-JP:
            interactionModel:
              languageModel:
                invocationName: はじめてのサーバーレス
                intents:
                  - name: HelloIntent
                    samples:
                      - 'こんにちは'
functions:
  alexa:
    handler: handler.alexa
    events:
      - alexaSkill: ${self:custom.alexa.skills.0.id}スキルIDの取得
ここまで準備ができれば、次はAlexaコンソールにスキルをデプロイしましょう。
$ sls alexa create --name "Serverless Alexa Typescript" --locale ja-JP --type custom
Serverless: [Skill ID] amzn1.ask.skill.xxxx-xxxxx-xxxxxxx-xxxx表示されたSkill IDを、serverless.ymlのcustom.alexa.skills[].idにいれてやればOKです。
AWS スタックのデプロイ
続いてAWSスタックをデプロイします。これはいつも通りです。
$ sls deploy
$ aws lambda list-functions | grep ask-serverless-dev-alexa
            "FunctionName": "ask-twilio-pay-dev-alexa", 
            "FunctionArn": "arn:aws:lambda:us-east-1:9999999:function:ask-serverless-dev-alexa", この後Lambda ARNを使うので、AWS CLIで検索しておきます。
スキルとLambdaを連携する
あとは連携してビルドするだけです。
$ sls alexa update
$ sls alexa build終わりに
AWSリソース連携系をサクッと作りたい場合はServerless Alexa、とりあえずスキル作って試したい時はHosted Skill、それ以外はASK CLIという使い分けになるかもですね。