Alexa-hostedスキルを利用してAWSアカウントなしでAlexa開発を始める

初投稿です。お手柔らかにお願いいたします。

# この記事の読者として想定している人
- これからAlexa開発をしてみたいと思っている人
- でもAWSアカウント作ったりするようなことは面倒だと思っている人
- そもそもどういうプログラムを書けばよいかよくわかっていない人
- とりあえず動くAlexaスキルを作ってみて、雰囲気をつかみたい人

Alexaスキルが動く仕組み(ユーザー・Alexa・lambdaの関係とか)がなんとなく分かっていると、よりスムーズに読み進められると思います。
でも、わからないけどとりあえずやってみる、というノリでもなんとかなると思います。

# Alexa-hostedスキルについて
1/24のAlexa Blogにて、Alexaスキル作成時のリソースホスティング方法としてAlexa-hostedスキルを利用することが可能になったという発表がありました。

これまで、Alexaスキル開発はAlexa開発者コンソールとAWS(主にlambda)の2箇所で作業をしていかなければいけませんでした。
しかし、Alexa-hostedスキルを利用することで最低限必要なAWSのサービスがAlexa開発者コンソール内で利用できるようになりました。そのため、わざわざ2箇所で作業をしなくてもスキル開発を進めることができるようになりました。
しかも、サンプルソースがついてくるので、スキル開発初心者の方もなんとなく雰囲気をつかみながらとりあえず動くスキルを簡単に作ることができるようになりました。

参考：[すべての開発者がAlexa-hostedスキル（ベータ版）を利用できるようになりました : Alexa Blog](https://developer.amazon.com/ja/blogs/alexa/post/005f8b0c-1ef2-4be6-8211-90e3e8ef9679/alexa-hosted-skills-beta-is-now-available-to-all-developers-jp)

#Alexa-hostedスキルでできること、できないこと
Alexa-hostedスキルでのAWS部分の注意点は以下の記事にまとめられています。
参考：[Alexa-hostedスキルを使用してスキルをエンドツーエンドで作成する | Custom Skills](https://developer.amazon.com/ja/docs/hosted-skills/build-a-skill-end-to-end-using-an-alexa-hosted-skill.html)

記事に記載されていますが、lambdaが月あたりリクエスト100万件まで、S3が月あたり5GBストレージと20,000件のGETリクエストということでなのでよほど大規模なスキルを作成しない限りは問題なさそうに思います。

#Alexa-hostedスキルを利用したスキル作成の流れ
Alexa-hostedスキルを使用してスキルを作る流れを簡単に追ってみたいと思います。
これからAlexaスキル開発をやってみたい、という方の参考になれば幸いです。

###１．Amazon Developerアカウントの作成
そこからかよ、という感じかもしれませんが、開発者としてのアカウントを作成する必要があります。
買い物用に使っているAmazonアカウントを使う、という方法でよいと思います。
Amazonアカウント・開発者アカウントを合わせて作る、という場合、JPアカウント・USアカウントの関係でハマるポイントがあるようなので、お気を付けください。

参考：[Alexa 開発者アカウント作成時のハマりどころ : Alexa Blogs](https://developer.amazon.com/ja/blogs/alexa/post/9f852a38-3a44-48bd-b78f-22050269d7c7/hamaridokoro)

###２．スキルを作成
スキル名は公開する際の名称で、スキルを呼び出す際の呼称(=呼び出し名)とは異なります(両方とも後から変えられます)。
モデルはカスタム(=lambda使うタイプのスキル)を選択。そして、ホスティング方法で"Alexaがホスト"を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/354808/886e4d79-28f2-943d-b213-1647ded820fe.png)

ここまでできたら画面右上の"スキルを作成"をクリックしてスキルを作成します。
1分程度でスキルが作成され、スキルのビルド/テスト/管理画面に遷移します。

###３．スキルを作ったらやること
スキルのビルド画面では、右側にスキルビルダーのチェックリストがあります。
通常、セルフホストでスキルを作成する場合、このチェックリストにある構成要素を自分で作成して埋めていく必要があるのですが、Alexa-hostedスキルを利用する場合、デフォルトで最低限動くものがすでにセットされています。
ビルド画面に遷移したとたんにビルド完了のお知らせが出てきていました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/354808/f51abdf2-6086-bad6-a482-263e0c0e2118.png)

チェックリストのチェック項目は、以下になります。

1.呼び出し名：
　　スキル呼び出し名が定義されていること。デフォルトではスキル名がセットされている。
2.インテント、サンプル、スロット：
　　最低1個のインテントとサンプル発話を登録していること。
　　デフォルトでHelloWorldIntentとサンプル発話"hello","how are you"等が登録されている。
3.モデルをビルド：
　　上記1. 2.の内容を含んだスキルモデルを保存→ビルド完了していること。
　　デフォルトですでに完了している。
4.エンドポイント：
　　Alexaがユーザから受け取った情報を受け渡す先(lambda)が設定されていること。
　　Alexa-hostedスキルでは、勝手にコードエディタに配置されたlambda関数と紐づけされている。

###４．コードエディタでソースと資材を確認
"コードエディタ"タブをクリックするとコードエディタ画面に遷移します。
ユーザーの発話内容をAlexaが解釈し、リクエストJSONにしてlambdaに渡します。このコードエディタでは、lambda側の処理(Alexaから受け取ったデータを処理し、再びAlexaに返却する)を記載します。言語はJavaScript(Node.js)です。
前述のとおり、サンプルのソースがすでにセットされているのでソースをいじる必要はないのですが、一応見ておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/354808/3cc70e02-1983-1fc5-5152-bc51b898c8a2.png)

左側の"lambda"フォルダ内にソースファイルやフォルダ類を配置していき、コードエディタでソースを修正します。ソースファイルのアップロード等はできないようです。
npmパッケージを使いたい場合はpackage.jsonに記載するだけで、npm installなしでrequireして利用することができます。
ソースを修正するたびにデプロイが必要になります。右上の"deploy"ボタンをクリックすればOKです。

左下の"Logs"をクリックすると別タブでCloudWatchが開き、Lambda関数実行時のログを参照できます。
"Media storage"クリックでS3コンソールが開きます。S3に配置した資材をLambda内で使用したい場合のコーディング方法は先ほどのリンク([Alexa-hostedスキルを使用してスキルをエンドツーエンドで作成する | Custom Skills](https://developer.amazon.com/ja/docs/hosted-skills/build-a-skill-end-to-end-using-an-alexa-hosted-skill.html))に記載されています。

###５．スキルのテスト
スキルがビルドされたら(最初からされてるけど)、シミュレータでスキルのテストを実施します。
"テスト"タブをクリックしてテストに移動します。
状態を"開発中"に切り替えて、Alexaへの発話を行います。
このシミュレータでは、Alexa - lambda間の通信内容や画面付きデバイスでの表示の確認ができます。
作ったスキル(自動作成だけど)の動作確認をしてみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/354808/2312c0e8-0a6a-83d7-e42d-ab6fa6127351.png)
**ユーザ「○○(呼び出し名)を実行」**(→スキル呼び出し)
**Alexa「Welcome, you can say Hello or Help. Which would you like to try?」**(→LaunchRequestHandlerのhandle関数が実行され、生成されたAlexa発話)
**ユーザ「hello」**(→HelloWorldIntentのサンプル発話)
**Alexa「Hello World!」**(→HelloWorldIntentHandlerのhandle関数が実行され、生成されたAlexa発話)

自動生成されるソースが英語版のものなのでやり取りに違和感がありますね。。。(2019年2月6日時点)
(英語版なら"Help"と発話すればHelpインテントの処理に流れるのですが、日本語版だと「使い方を教えて」とか日本語で言わないとHelpインテントには流れないです)

「じゃあまずはAlexaの発話部分を日本語にしてみるか！」
「あ、そしたらユーザー発話も日本語の文章を登録しないと…」
「ハローがあるならグッバイは作れないかな」
「話しかけたときの時間によって"おはよう"とか"おやすみ"とか出し分けできないかな」
みたいな感じでアイデアを出しつつ改修していけば、だんだんと理解が深まってくると思います。

#Alexa-hostedスキルを利用してスキルを作ってみよう
以上がAlexa-hostedスキルを利用してスキル開発を始める流れになります。
Alexa-hostedスキルを利用したスキル開発が可能になったことによって感じることは、なんといっても開発の敷居がより低くなったということ。

- 無料でAmazon Echoのスキル開発ができてしまう
- 簡単なサンプルが出来上がっている状態で開発をスタートできる
- ブラウザ上のエディタからコードの修正ができてしまう

Alexaに限らず、今、さまざまなサービスが手軽に利用できるようになってきています。金銭的に余裕のない学生や、趣味で開発をしたいけど環境を整える時間が取れない方などでも気軽に開発作業に取り組める環境が整ってきています。こういった状況から、今後、開発者人口が増えていったらいいなと思ったりします。

プログラミングや開発に興味があるけどなかなか取り組めないという方、ぜひこの機会にAlexaスキル開発で開発者デビューしてみてはいかがでしょうか？