スマートホームスキルの作成 - Cognito User Poolsを使って

# スマートホームスキルとは
スマートホームスキルは、カスタムスキルと異なり、ユーザーが発話した内容を、プログラム用意なパラメーターにまで分解して呼び出してくれます。例えば、照明をつける場合、「Alexa、端末名をオンにして」といういうと、以下のようなDirectivesという形でスマートホームスキルが呼び出されます。

```json
{
  "directive": {
    "header": {
      "namespace": "Alexa.PowerController",
      "name": "TurnOn",
      "payloadVersion": "3",
      "messageId": "1bd5d003-31b9-476f-ad03-71d471922820",
      "correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg=="
    },
    "endpoint": {
      ...
}
```
一般的なWebAPIの呼び出しと変わらない形で呼んでくれますので、会話の組み立てなどを考える必要がなく開発する側は非常に楽です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/85182/83d5624c-a9c2-a993-aa1a-20f68b853c17.png)

カスタムスキルの場合は、会話が分解されて文字列としてスキル側に渡されます。そののため各言語ごとの処理が必要になります。しかしスマートホームスキルの場合は、その辺りの処理はAlexaが行ってくれるので、他言語化対応ができます。

以下の照明のON/OFFの場合、英語（米国）、英語（英国）、英語（インド）、ドイツ語、日本語の5ヶ国語に対応が可能です。
https://developer.amazon.com/ja/docs/device-apis/alexa-powercontroller.html

# やりたいこと
自前デバイスを制御するためのスマートホームスキルの作成方法を理解する。デバイスは自前クラウド経由で制御が可能。自前クラウドはCognito User Poolsでアカウント管理を行っており、AlexaのAmazonアカウントと連携して制御可能とする。(アカウントリンク)

#開発者コンソールでスキルの登録
Amazon開発者コンソールでスキルを登録します。
https://developer.amazon.com/home.html

<img width="1058" alt="スクリーンショット 2017-12-17 12.30.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/cd5135be-836a-4486-4422-01297f072b83.png">

以下のように設定してスキルを作成します。後からLambdaなどの設定をするので、まずははアプリケーションIDだけ取れれば良いです。
<img width="699" alt="スクリーンショット 2017-12-17 12.30.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/94aea946-867e-91b8-3a38-8b3ad13ecb26.png">

#AWS Lambdaでスマートホームスキルの作成
AWSコンソールでスマートホームスキルをLambdaで作成します。Lambdaには、スマートホームスキルの雛形が用意されていますので、まずはそれを利用します。"設計図"、"alexa-smart-home-skill-adapter"を選択します。<font color="HotPink">Amazonに確認したわけではないですが、tokyoリージョンにLambdaを作成した時は後にエラーになりました。us-east-1を選択して下さい。</font>
<img width="896" alt="スクリーンショット 2017-12-17 16.42.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/7872f30c-f6b5-8ee1-85d8-436c520de318.png">

以下のようにLambdaの設定をします。アプリケーションIDは先ほど作成したスマートホームスキルのIDを設定します。
<img width="454" alt="スクリーンショット 2017-12-17 16.57.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/e201715d-1374-962b-6f4b-5557ca37c39c.png"><img width="284" alt="スクリーンショット 2017-12-17 16.57.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/7304ec9e-60a2-0496-2db4-3db9c5faf15f.png">

Lambdaが作成されました。後ほどARNをスキルの設定で利用します。
<img width="914" alt="スクリーンショット 2017-12-17 17.03.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/99d5eb87-5907-6996-7ada-cdbae0eb1652.png">

# Cognito User Poolsの設定
次にアカウント管理のためのCognito User Poolsの設定をしていきます。AWSコンソールよりユーザープールを作成します。ステップに従って設定するを選択します。
<img width="973" alt="スクリーンショット 2017-12-17 17.07.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/54f959d6-bcc8-6db3-8b31-1d7bc1ff8bd9.png">

<img width="659" alt="スクリーンショット 2017-12-17 17.08.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/895e453f-b10e-17a0-8e61-9c92061523e0.png">


基本的な仕組みを確認するためなので、属性などはここでは必要ありません。以下のように設定をしていきます。

* 属性
    * 標準属性 - なし
    * カスタム属性 - なし
* ポリシー
    * パスワード強度：デフォルト 8文字
    * ユーザーの自己サインアップ：デフォルト　許可する
    * 有効期限：デフォルト 7日間
* MFA
    * MFA:OFF
    * 検証：e-mailのみ
* メッセージのカスタマイズ
    * E メール検証メッセージをカスタマイズ:デフォルト
    * ユーザー招待メッセージをカスタマイズ：デフォルト
    * E メールアドレスをカスタマイズ：デフォルト
* タグ/デバイスはスキップして次へを選択
* 「アプリクライアント」で「アプリクライアントの追加」

<img width="757" alt="スクリーンショット 2017-12-17 17.34.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/deee35d5-9ea5-433d-6cb7-fa38c3014a54.png">

あとは次へを選択してプールを作成。次にスマートホームスキルに設定するための以下の二つの情報を取得。

* アプリクライアントID
* 「アプリの統合」「ドメイン名」をクリックして、適当なドメインを設定
<img width="559" alt="スクリーンショット 2017-12-17 17.45.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/1acefb6d-2add-f7ce-f9e6-8e1a47ca2464.png">

<img width="753" alt="スクリーンショット 2017-12-17 21.45.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/11cee04c-985b-2c2b-d95e-5d2a29ac4d09.png">

# スキルの設定
Alexaのコンソールの設定に戻って、以下の設定をします。

* LambdaのARNの設定
* アカウントリンクの設定

<img width="700" alt="スクリーンショット 2017-12-17 21.47.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/b525aea4-dce8-c56a-7a9e-09db6a7453a4.png">

<img width="657" alt="スクリーンショット 2017-12-17 21.48.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/7c77b8a3-2d7d-3aab-6bb2-0b6c573ab9c4.png">

コールバックURIは次の設定で利用します。

<img width="657" alt="スクリーンショット 2017-12-17 21.49.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/96cacd98-dd51-3039-bd3e-ef88f516626d.png">

# Cognito User PoolsにコールバックURIの設定
先ほど取得したOAuthのコールバックURIを以下のように設定します。

<img width="830" alt="スクリーンショット 2017-12-17 22.00.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/c0da780a-8fbc-0a97-7aa7-aa232bab09d8.png">

# 動作確認
後ほどアップデートします