4. Amazon AlexaからHerokuのRailsにつなぐ

# 連載記事
前後関係があるため順番に読んでもらえると分かりやすくなっています。

[1. Amazon AlexaとFire TVでHello Worldを試してみる \- Qiita](https://qiita.com/tochi/items/4da38b02b424926d1095)
[2. Amazon Alexaで音声から引数を受け取る \- Qiita](https://qiita.com/tochi/items/f96ca5979ec2ea6387d8)
[3. Amazon AlexaのCustom Slot Typesを設定する \- Qiita](https://qiita.com/tochi/items/a0342f0882b2c642d40c)
[4. Amazon AlexaからHerokuのRailsにつなぐ \- Qiita](https://qiita.com/tochi/items/183658fabd1416028065)
[5. Amazon Alexaで会話を続ける（セッションを引き継ぐ） \- Qiita](https://qiita.com/tochi/items/ec613355e4f5913a8755)
[6. Amazon Alexa のスキルを日本語化する \- Qiita](https://qiita.com/tochi/items/682adf708bb7fd0f1ca9)
[7. 自作した日本語のAlexa SkillをEcho dotで動かす \- Qiita](https://qiita.com/tochi/items/db9542e191bbdb7f77c2)

はじめに
---

今までの記事では「FireTV <=> Alexa <=> Lambda」のサーバーレスという構成で作ってきました。
普段はRuby on Railsで開発しているため、今回はLambdaの所をHeroku + Ruby on Railsに切り替える方法を試してみます。
構成は下記のような「FireTV <=> Alexa <=> Heroku（Ruby on Rails）」です。
![Slice 1.png](https://qiita-image-store.s3.amazonaws.com/0/4529/6a769f34-43ed-760e-88f1-fdd1f11bf6be.png "Slice 1.png")

この構成で前回までに作ったHello worldの簡単なサンプルを実装します。

[Amazon AlexaのCustom Slot Typesを設定する \- Qiita](https://qiita.com/tochi/items/a0342f0882b2c642d40c)

Rails側のルーティング
----

FireTVで受け取った音声はAlexaを経由して`POST`で送られます。
そこでルーティングは下記の様にしました。

``` #routing
POST	/talks	talks#create
```

``` #config/routes.rb
Rails.application.routes.draw do
  resources :talks, only: %i(create)
end

```

``` #app/controllers/tasks_controller.rb
class TalksController < ApplicationController
  protect_from_forgery with: :null_session
  
  # POST /talks
  def create
    Rails.logger.info params
  end
end

```

これでAlexaから送られるデータを受け取れるようになります。
このプログラムをHerokuに上げておきましょう。

Alexa側のEndpointを変更
---

次にAlexaのEndpointをLambdaからHerokuに変更します。

Configurationの項目のEndpointをHTTPSに変更します。
Defaultの所にHerokuで受け取り可能なURLを設定します。
今回の例だと `https://xxx.herokuapp.com/talks`とします。

![スクリーンショット_2017-10-02_20_45_48.png](https://qiita-image-store.s3.amazonaws.com/0/4529/f2efd3cc-793c-193f-b960-74d4a5328221.png "スクリーンショット_2017-10-02_20_45_48.png")

SSL Certificateの項目のCertificate for DEFAULT Endpointを「My development endpoint is a sub-domain〜」に変更します。
Alexa側の設定は以上です。

![スクリーンショット_2017-10-02_20_46_05.png](https://qiita-image-store.s3.amazonaws.com/0/4529/272913d7-9223-1f3c-c197-5f6067ea615a.png "スクリーンショット_2017-10-02_20_46_05.png")

HerokuでAlexaからのPOSTを確認
---

Alexaから`POST`されるパラメーターをHerokuで確認してみましょう。
Alexaからのアクセスが確認できない場合にはSSL CertificateやEndpointの設定が正しくない可能性があります。

``` #access.log
# ログは一部加工しています。
Oct 2 21:04:42 app[web] INFO I, [2017-10-02T12:04:42.871451 #6]  INFO -- : Started POST "/talks" for xxx.xxx.xxx.xxx at 2017-10-02 12:04:42 +0000
Oct 2 21:04:42 app[web] INFO I, [2017-10-02T12:04:42.872727 #6]  INFO -- : Processing by TalksController#create as JSON
Oct 2 21:04:42 app[web] INFO I, [2017-10-02T12:04:42.872906 #6]  INFO -- : Parameters: {"version"=>"1.0"...
```

Railsでレスポンスを返す
---

Railsは`alexa-rubykit`というgemを入れて処理します。

[damianFC/alexa\-rubykit: Amazon Echo Alexa's App Kit Ruby Implementation](https://github.com/damianFC/alexa-rubykit)

``` #Gemfile
gem 'alexa_rubykit'
```

後はコントローラーで受け取ったリクエストから名前を取り出してレスポンスで返してあげれば完成です。
FireTVに向けて話しかけると正しい音声が返ってくるはずです。

自分「tell Hello world hello my name is Tarou.」
FireTV「Hello world! Tarou.」

``` #app/controllers/talks_controller.rb
class TalksController < ApplicationController
  protect_from_forgery with: :null_session

  # POST /talks
  def create
    request = AlexaRubykit::build_request(params)
    response = AlexaRubykit::Response.new
    response.add_speech("Hello world! #{request.slots[:firstName][:value]}")
    render json: response.build_response
  end
end
```

まとめ
---

これで既存のサービスが稼働している場合でもAlexaと連携することができるようになったのでより柔軟な開発ができる。

Let's enjoy Alexa.