Edited at

AWS環境でClovaスキルを開発してみる

ヴァル研究所 Advent Calendar 2018 15日目の記事です。

スマートスピーカーと言えばGoogle HomeやAmazon Alexa、LINE Clovaなど様々なプラットフォームがありますが、「スキルを作りたい」と思ってもなかなか難しいですよね。

今回はLINE Clovaに焦点を当てて紹介していきます。


まず何やって良いかわからない

そんな方はこちら

Clovaスキル×駅すぱあとWebサービス開発体験!初心者向けハンズオン

https://www.slideshare.net/RyusukeTakeda/clovaweb-108731707

スライドに沿って実装していくと簡単にスキルが出来上がります。

ソースコードもこちらにすべてアップしてありますので、後は駅すぱあとWebサービスのアクセスキーさえ用意してしまえば十分です。

https://github.com/val00250/ClovaSkills_Hands-on

駅すぱあとWebサービスのアクセスキーは、こちらから申請いただくと無料で入手できます。

https://ekiworld.net/service/sier/webservice/free_provision.html


Heroku?AWS使いたいんだけど・・・

はい。

業務などでAWSをガッツリ使っていたり、Alexa向けスキルをAWS環境で作っていて流用できないかとか、よく聞きます。


ClovaスキルをAWS上で実装する方法

基本はAPI Gateway + Lambdaで問題ありません。

あとはDynamoDBなどと連携すればいろいろ出来ます。


まずは何したら良い?

スライドの11ページ以降がHerokuからAWSに変わります。


Lambda関数の作成


  1. Lambda関数を作成する

    ランタイムは node.js 8.10 を指定しておきます。

    ロールは CloudWatch への書き込み権限など、最低限のものでかまいません。


  2. ソースコードを書き換える

    このindex.jsをそのままコピペしちゃえばOKです。

    https://github.com/val00250/ClovaSkills_Hands-on/blob/master/AWS/index.js


この後、ソースコードの編集を行うので、今はこのまま保存してしまって大丈夫です。


API Gatewayを設定する


  1. APIの作成


  2. POSTでメソッドを追加

    ※リソースの階層は問いません


  3. 呼び出すLambda関数に作成したスキルを指定


  4. メソッドリクエストのHTTPリクエストヘッダーにSignatureCEKを追加



  5. 統合リクエストのマッピングテンプレートに下記を追加


    • リクエスト本文のパススルー

      テンプレートが定義されていない場合 (推奨)

    • Content-Type

      application/json

    • テンプレート



{

"body":$input.body,
"headers":{
"SignatureCEK":"$input.params('SignatureCEK')"
}
}


CEK側でAPI Gatewayのエンドポイントを指定

APIのデプロイを行うと通常は下記のエンドポイントが割り当てられるので、CEKに設定します。

https://xxxxx.execute-api.ap-northeast-1.amazonaws.com/{$ステージ名}/{$リソース名}

設定の仕方はスライドの15ページ以降を見ながらやってみてください。

で、23ページまで進んだら下記を行います。


Lambdaのソースコードを修正


  1. Webサービスのアクセスキーを書き換え

    下記のkeycodeにWebサービスのアクセスキーを設定します

    var key = "keycode";


  2. extensionIdを書き換え

    スキル登録時のExtension IDを設定します

    var extensionId = "extensionId";


これが終わったら26ページ以降を実施すればAWSでClovaスキルが出来上がります。


補足

API Gatewayにテンプレートを設定している理由はいくつかあります。


  • CEKからPOSTされる内容はbodyに全て入っている

  • bodyとSignatureCEKを利用して検証しなければならない

  • bodyはJSONなので、body以下に入れてしまって問題ない

  • SignatureCEK以外のヘッダは不用なので、テンプレートにもSignatureCEKだけで良い

あと、$util.escapeJavaScriptとか.replaceAll("\'","'")は入れないとエラーにならない?と思いでしょうが、CEKからは登録した対話モデルしか飛ばないことと、元々JSONの構文として正しいものしか来ないので、大丈夫です。


まとめ

うまくやればAlexaとClovaで同じスキルが開発できますし、データも共有できますので、マルチプラットフォーム、クロスプラットフォームのスキルが出来上がります。

また、Clovaスキルを作る際にAlexaへの展開も考えている場合はAWSで構築するのもオススメですよ。