Node.js版Alexaスキルの最小構成のテンプレートと、zipファイルでスキルをAWS Lambdaに配置する方法

#はじめに
Alexaスキルが実行される仕組みというのは、ざっくり以下のとおりになります。
<img src="https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/jp/blog/trainingv2/1/alexa-skill-flow._CB482600850_.png"/>

- ユーザーがEchoなどのAlexa端末に発話
- Alexa端末が音声情報を取得
- Alexa端末が音声情報をAlexaサービスに送る
- Alexaサービスが音声を解析してリクエストをJSON形式でAWS Lambda（エンドポイント）に送る
- Lambdaで処理

- あとは戻っていく。略。

対話モデルを作成するところは問題ありません。ブラウザ上ですいすい作ることができます。とても良くできています。

しかし、実際の処理を行う部分であるAWS Lambda（スキルにとってのエンドポイント）に配置するところがつまずきポイントです。

順に説明していきます。

#１．AlexaスキルのLambda関数テンプレートが実質ない
ブラウザ上でAWS Lambdaのページに行き、Alexaスキルのための関数を作成するとしましょう。
Alexaスキルのテンプレートも用意されていたりするのですが、最新の`Alexa Skills Kit SDK for Node.js Version 2`と`Node.js 8.10+`に対応したテンプレートがありません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/0407ad31-b3d5-8c13-3747-e2eb3c58545a.png)

ですので、「一から作成」を選ぶことになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/c3547d2c-b466-597f-767c-ae619716adfd.png)


#２．本当に一から作成なのでどうしたらいいかわからない

この「一から作成」が本当に一から作成なので、ここからスキルを構築するのは初心者には至難の業です。
ブラウザ上のエディタでの作業はなかなかに厳しいものがありますし、そもそも`SDK for Node.js`をどうやって使えるようにしたらいいのでしょうか。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/c7818899-71b0-5ace-f21c-ee8408724036.png)

そこで、一般的にはローカルPC上で開発環境の恩恵を受けたりライブラリを追加したりしてスキルを作成し、出来上がったものをライブラリごとzipでパッケージしてまるごとアップロードするのが効率的です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/4c8b58d2-4260-0a6e-4ccb-fc97e57b6bb5.png)


ask cliというコマンドラインツールを使えば、コマンドラインからアップロードできますので、やり方をしっかり学んで身につけるのもいいですね。

#細かいことはいいからすぐに使えるテンプレートをくれ
しかし、最初はコマンドラインツールは敷居が高くてとっつきにくいので、もう細かいことはいいから、最小構成のパッケージをよこしてください、とまだ詳しくない私のような人間は思うのです。

コマンドラインからask cliを使って

```
> ask new --skill-name MySkill --lambda-name MySkillLambda
```

とやれば、所望のものが手に入るのですが、そのためにはask cliのインストールや設定をする必要があります。

ですので、自分のためも兼ねてこの`ask new`したときに生成されるスキルのlambda部分をGitHubにあげておくことにしました。
[こちら](https://github.com/shuheydev/MinimumAlexaSkill_lambda_nodejs/blob/master/MinimumAlexaSkill_lambda_nodejs.zip)。

これはask cliを使ってコマンドライン上で「ask new」コマンドを使って生成されるlambda関数側のコードとライブラリのパッケージです。
これをそのままAWS Lambda上で「zipファイルをアップロード」すれば、Alexaスキルのエンドポイントとして動作します。
変更を加えたい場合は、ローカルPC上で解凍してindex.jsを編集したりnpmを使ってライブラリを追加したりした後、再びzipファイルにパッケージしてアップロードすればOKです。

ちょっとスキルを作って試したい、遊びたいと言うときにこの最小構成のLambdaを使うと少し便利かと思います。

zipファイルの名前は変更しても動作的に問題はありません。

#使い方
リンク先のGitHubのページから「Download」ボタンを押してzipファイルをダウンロードしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/dc1de353-0d17-45c6-7f72-ce77c57f903a.png)

AWS Lambda上で関数を「一から作成」した後、関数コードのコードエントリタイプに「zipファイルをアップロード」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/0a7b711d-4cf6-dd4b-56f9-5a376a874dd2.png)

次に「アップロード」ボタンを押して、先程ダウンロードしたzipファイルを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/7f95f7e3-fe3c-1ef6-0913-0c7d3aafb845.png)

すると、右上の「保存」ボタンがオレンジ色になるので、それを押して保存してください。
これで、Lambda関数の配置の完了です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/b74d439c-0d5b-714b-ddee-810df131a185.png)

あとは対話モデルと結びつける一連の処理を行ってください。
お互いにARNを登録し合ういつものやつです。

#コードの変更はどうするの？

zipファイルを解凍して、index.jsに変更を加えたり、npmでライブラリを追加したり、自分のスキルを作成すると思います。
では、この変更が加えられたファイルをAWS Lambdaにアップロードするにはzipファイルにする必要があります。
その際に、zipファイルに含めるフォルダとファイルは以下のような感じになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/ea40fced-51cc-0cf2-55f2-394d226ea82b.png)

フォルダとファイルを複数選択してそれをzipファイルにする必要があります。

これらの親フォルダを選択してzipファイルにしないようにしましょう。


#おわりに
AWS Lambdaのほうで最新のAlexaスキルテンプレートを用意してくれると嬉しいですね。
待ってます。