Alexaスキルの配信コンテンツをSlackから更新できるようにしてみた（後編）

#おさらい
![全体図](https://qiita-image-store.s3.amazonaws.com/0/261015/9eea5e6e-ca05-c8f2-1889-c05d7793d0b0.png)

※本稿は「[Alexaスキルの配信コンテンツをSlackから更新できるようにしてみた（前編）](https://qiita.com/ops/items/afde7c3d4730adc9661e)」の後編です

Alexaスキル「[1分間セキュリティ](https://www.amazon.co.jp/gp/product/B07D9FQ19D)」の運用機能として実装したSlack連携を紹介しています。
前編ではSlackに投稿された内容をAmazon S3に保存するコンテンツ投稿機能を説明しました。

後編である本稿では、Amazon S3内のコンテンツをAmazon Echoに配信するコンテンツ配信機能について説明します。

##前提条件（再掲）
- Amazon開発者アカウント
- AWSアカウント
- Slackアカウント

#4. コンテンツ配信機能
Amazon S3内のコンテンツをAmazon Echoへ音声配信する機能です。
Alexaスキルの呼び出しによってAWS Lambdaを起動し、Amazon S3に保存されたコンテンツを取得してAmazon Echoへ返却します。

![コンテンツ配信機能](https://qiita-image-store.s3.amazonaws.com/0/261015/1d0f6343-bad0-2f1f-1b57-bad6328990e0.png)

##4.1. Alexaスキル
[Alexa Skills Kit開発者コンソール](https://developer.amazon.com/alexa/console/ask)にアクセスして、Amazon開発者アカウントでサインインしてください。

![Alexaスキル](https://qiita-image-store.s3.amazonaws.com/0/261015/c139fe99-e443-8f6b-ea7b-2c31a2e6687e.png)

###スキル作成
- 「スキルの作成」をクリック
- 「スキル名」に任意の名前を入力
- 「デフォルトの言語」で日本語を選択
- 「スキルに追加するモデルを選択」でカスタムが選択済みであることを確認
- 「スキルを作成」をクリック

![スキル作成](https://qiita-image-store.s3.amazonaws.com/0/261015/dd4a7abe-1259-6a3e-a6ce-fbf6d24c3714.png)

###モデルのビルド
- 左ペインで「呼び出し名」を選択
- 「呼び出し名」に任意の文字列を入力
- 左ペインで「インテント(3)」を選択
- 「AMAZON.StopIntent」をクリック
- 「サンプル発話(0)」にダミー文字列を入力して「＋」をクリック（最低1つ入力しないとビルド不可）
- 「モデルの保存」をクリック
- 「モデルのビルド」をクリック

![モデルのビルド](https://qiita-image-store.s3.amazonaws.com/0/261015/126e93c5-cb70-9cde-e05b-f8bfbcc89be0.png)

###スキルIDの取得
- 左ペインで「エンドポイント」を選択
- 「AWS LambdaのARN」を選択
- 「エンドポイントの保存」をクリック
- 「スキルID」をコピー（AWS Lambdaの設定時に使用する）

![スキルIDの取得](https://qiita-image-store.s3.amazonaws.com/0/261015/f003730c-cd17-b644-1d19-e5a6c01afa0d.png)

##4.2. AWS Lambda
[AWS Lambdaマネジメントコンソール](https://console.aws.amazon.com/lambda/home)にアクセスして、AWSアカウントでサインインしてください。

![AWS Lambda](https://qiita-image-store.s3.amazonaws.com/0/261015/355079e9-cf56-0b4c-1eab-f73d69c209d2.png)

###関数の作成
- 「関数の作成」をクリック
- 「設計図」を選択
- 「alexa-skill-kit-sdk-factskill」を検索して表示された結果をクリック
- 「名前」に任意の関数名を入力
- 「ロール」に「AmazonS3ReadOnlyAccess」ポリシーをアタッチしたロールを設定
- 「関数の作成」をクリック

![関数の作成](https://qiita-image-store.s3.amazonaws.com/0/261015/f5711421-671d-5772-8af2-85e9df1656f3.png)

###関数の設定
- 「トリガーの追加」から「Alexa Skills Kit」を選択
- 「スキルID」を入力して「追加」をクリック
- 「保存」をクリック

![関数の設定](https://qiita-image-store.s3.amazonaws.com/0/261015/64119d78-98fd-2b39-ad13-3e6cdc3528a5.png)

###関数の実装
- index.jsを以下のコードに変更して「保存」をクリック

```javascript:index.js
'use strict';
const Alexa = require('alexa-sdk');
const Aws = require('aws-sdk');
const s3 = new Aws.S3();

var handlers = {
  'LaunchRequest': function() {
    var obj = this;
    s3.getObject(
      {
        Bucket: '# bucket name #',
        Key: '# key name #'
      },
      function(err, data) {
        if (err) {
          console.error(err);
          obj.emit(':tell', '# error message #');
        }
        else {
          obj.emit(':tell', data.Body.toString());
        }
      }
    );
  },
  'Unhandled': function() {
    this.emit(':responseReady');
  },
  'SessionEndedRequest': function() {
    // noop
  }
};

exports.handler = function(event, context, callback) {
  var alexa = Alexa.handler(event, context);
  alexa.appId = '# app id #';
  alexa.registerHandlers(handlers);
  alexa.execute();
};
```
※「# ～ #」で囲んだ部分は以下の値に書き換えてください。

|項目|値|
|:--|:--|
|bucket name|コンテンツ投稿機能と同じバケット名|
|key name|コンテンツ投稿機能と同じキー名|
|error message|任意のエラーメッセージ|
|app id|AlexaスキルのアプリケーションID（スキルID）|

###ARNの取得
- 作成した関数のARNをコピー（画面右上の"arn:aws:lambda:[リージョン名]:[数字列]:function:[関数名]"）

![ARNの取得](https://qiita-image-store.s3.amazonaws.com/0/261015/8b95699b-de07-068e-9f3b-4b97afb003f9.png)

##4.3. Alexaスキル（続き）
[Alexa Skills Kit開発者コンソール](https://developer.amazon.com/alexa/console/ask)に戻ってください。

###エンドポイントの設定
- 左ペインの「エンドポイント」を選択
- 「デフォルトの地域」に作成したAWS LambdaでコピーしたARNを貼り付け
- 「エンドポイントを保存」をクリック

![エンドポイントの設定](https://qiita-image-store.s3.amazonaws.com/0/261015/f003730c-cd17-b644-1d19-e5a6c01afa0d.png)

##4.4. テスト
※事前にコンテンツ投稿機能でAmazon S3にコンテンツを保存しておいてください

[Alexa Skills Kit開発者コンソール](https://developer.amazon.com/alexa/console/ask)の「テスト」タブで以下を入力すると、コンテンツが返答として表示されます。

```
[呼び出し名]をひらいて
```

![テスト](https://qiita-image-store.s3.amazonaws.com/0/261015/047c93fd-13c5-4774-955a-44a839af5cc7.png)

また、Amazon Echoがあれば「公開」タブからベータテストを設定して実機テストすることもできます。

#おわりに
本稿では、SlackとAlexaスキルの連携としてコンテンツ配信機能について紹介しました。
Amazon Echoをお持ちであれば、Alexaスキル「[1分間セキュリティ](https://www.amazon.co.jp/gp/product/B07D9FQ19D)」もよろしくお願いします。