「桜井さん」をAPI Gateway + LambdaでLINE BOT化してみた

# はじめに
これは前回作成した記事「[「アイネクライネナハトムジーク」に出てくる斉藤さんをミスチルの桜井さんとして再現してみた](https://qiita.com/hiro_nishi/items/a9db96e0d77a6b6fc5ef)」の続きになります。
気になった方は上記の記事をまず読むことをおすすめします。

# 作ったもの
まずはどんなものを作ったか紹介します。

こちらで友達登録したら試すことができます！

~~https://lin.ee/WEqJMO7~~ すみません。公開停止しています。

使い方はシンプルです。
桜井さんに何か話しかけます。
そうするとその心境に合うようなミスチルの曲の一部を桜井さんが歌ってくれます。（正確にはテキストで返信してくれます）
裏でCOTOHAの感情分析APIを活用していて、
送信した文章と感情スコアの近い歌詞の一部を返すようになっています。
なのであまり内容が一致してないことも多々あることはご了承ください。（お遊び感覚でお使いください。。）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226827/303f8e2c-b43f-3a62-5166-df3a31b079fe.png" width=50%>


コロナによる自粛疲れを希望がちらつかすといった表現で励ましているような気がします。

# システム概要

歌詞フレーズと感情スコアを格納するDBへの登録部分は[前回の記事](https://qiita.com/hiro_nishi/items/a9db96e0d77a6b6fc5ef)を参照してください。
今回はLINEから送って返信が返ってくるまでの構成を紹介します。
構成はシンプルでLINEのMessaging API、AWSのAPI Gateway、Lambda、RDS、COTOHAのAPIを利用しています。

![sakuraisan-image2 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226827/f79192e6-df5c-b428-74c8-3b81e37ed916.png)

① - ②：LINE Messaging APIを使ってLINEからWeb HookによりAPI Gatewayを呼び出すようにする
③：API Gatewayの設定により作成したLambda関数を呼び出す
④：COTOHA APIを呼び出して送ったメッセージの感情スコアを取得
⑤：感情スコアの近い歌詞のフレーズをRDS上に作成したDBから取得
⑥ - ⑦：取得したフレーズをLINEの返信としてMessaging APIにより返す

# 各サービスの詳細説明

設定に手こずりそうなAPI Gateway、Lambda、LINE Messaging APIの説明をします。
RDSとCOTOHAについては特に難しい設定はないため、省略させていただきます。

## API Gatewayの設定

(1) API Gatewayから新規にAPIを作成
![api-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226827/f2f13aa9-20e9-30dd-ac20-f8046919f2f4.png)

(2) RESTの新しいAPIとして作成

![api-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226827/10e45c40-8e2c-fa8d-789c-047837b42e1a.png)

(3) 新しいメソッドの作成

POSTで作成します。

![api-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226827/d9929ded-28e3-eb75-1726-ba4de9a26d7b.png)

(4) Lambdaの登録

Lambdaが実行できるように統合タイプを「Lambda関数」、Lambda関数にLambda名を入力

![スクリーンショット 2020-08-17 22.33.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226827/0fdbe02e-464b-d516-e496-5f12bd3c88d9.png)

(5) 統合リクエストをクリック

![api-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226827/035aa2b6-eb8b-140e-5ae0-bd350e0b97d9.png)


(6) HTTPヘッダーの設定

名前をAuthentication、マッピング元を'Bearer \<LINEのアクセストークン\>' として登録します。
LINEのアクセストークンの取得については後述します。
登録したらこちらに入力しましょう。

![api-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226827/aaf9bc56-977a-fc74-5175-4ec3a1adc115.png)

(7) APIのデプロイ

「アクション」→APIのデプロイをクリックし、
ステージ名を入力してデプロイします。（ここではprodとする）

![api-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226827/7e6bfa30-0a00-b9d1-d242-cf490e6543b9.png)


(8) APIのURIの発行

デプロイされると左メニューのステージ→prod→POSTにURLが発行されているはずです。
後のLINE Messaging APIのWebhookとして登録するのでどこかにURLをコピーしておきましょう。

![api-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226827/d8dc12f7-42ab-4054-7ee1-6883e0eb8c4c.png)


## Lambdaの設定

ソースコードは[GitHub](https://github.com/hiromasa0127/sakurai-san-bot)のlambda/lambda.pyを参照してください。
注意点としては、DBの接続情報、COTOHA APIの接続情報、LINE APIのトークン情報はLambdaの環境変数に登録していることです。

![lambda-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226827/9b0b4bcf-e696-e7dd-e19e-59ed83e7f7d4.png)

また、デフォルトでmysql-connector-pythonが入っていないためLambda上に入れる必要があります。
今回はLambdaのレイヤーを利用しました。
使い方は[ここ](https://qiita.com/t_okkan/items/394a15577bd1aad46ec3)を参照すると良いでしょう。

## LINE Messaging APIの設定

初めて使う方は、チャネル作成については[こちら](https://qiita.com/fkooo/items/d07a7b717e120e661093)を参照してください。

最低限必要な設定は以下です。

(1) Webhookの設定

事前にAPI Gatewayで作成したURLを登録します。

![line-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226827/dc018094-a1f0-df86-b0ef-a68cca465d81.png)

(2) アクセストークンの発行

![line-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226827/94285e3f-26df-c76d-f0b8-9606ccb1224a.png)

(3) 自動応答の設定をオフにする

これを設定しないと関係ない返信をしてしまいます。

![line-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226827/90cf1582-dddb-086a-c5f5-6e8099e7fad4.png)

(4) Messaging APIの設定確認

LINE Official Account Managerに飛び、
左メニューのMessaging APIをクリックし、Webhook URLが登録されているか確認してください。
登録されていなければ(1)同様にAPIのURLを入力します。

![line-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226827/6509090f-05a6-20b7-5062-406af16119be.png)

![line-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226827/00795bbd-4b64-a5fc-111d-a526476cf131.png)


# 参考

以下記事を参考にさせていただきました。

[API Gateway + LambdaでLINE Bot開発](https://xp-cloud.jp/blog/2019/06/24/5560/)