Node.jsとAWSを使って画像検索 BOTを作ってみた～後編～

# はじめに
[Node.jsとAWSを使って画像検索 BOTを作ってみた～前編～](https://qiita.com/dasu1982/items/9f354ad0a325893168ba) の続きの記事です。
今回はインフラ寄りの話題となります。

# AWS lambda へ資材アップロード
AWS アカウントは既に持っている前提で話を進めます。

まず、資材を zip で固めます。
今、このような構成になっていると思います。

```
line_bot_test
  ├─ index.js
  └─ node_modules/
```

line_bot_test 内で以下のように zip コマンドを実行してください。

```
zip -r line_bot_test.zip .
```

**【注意】**
zipで中身だけ固めるようにしないと、アップロード時にエラーとなります。
https://qiita.com/TLamp/items/29658cc8fdc1d73e3f49


## lambda 関数作成

AWS Lambda に行き、「関数の作成」を選択します。
<img width="1013" alt="lambda1.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/78126/4fd128ad-ca5e-fc68-abd3-3537c0580a42.png">

「一から作成」を選択し、関数名、ランタイムを入力します。
今回は関数名は `line_bot_test` としました。
<img width="833" alt="lambda2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/78126/81b626b1-5b12-f3b4-9189-76c37a83bbd1.png">

ロールは「カスタムロールの作成」を選択すると、このような IAM ロール作成画面に飛ばされると思います。
<img width="589" alt="lambda3.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/78126/35c72c3f-20c3-6e1e-97d0-6fcc61f1ca50.png">


今回はロール名も特にいじらず `lambda_basic_execution` のまま「許可」をクリックします。
そうすると元の lambda 画面に戻るので、「関数の作成」をクリックします。

**【ロールに関する補足】**

- 既にロールを作成している場合はそれを流用してもOKです。
- 今回作成したロールは、 CloudWatch に関数の実行ログを残すための必要最低限の権限となっています。

画面遷移後、各種設定していきます。
### Designer
トリガーの追加で、API Gateway をクリックします。
<img width="960" alt="lambda4.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/78126/dbffbf8c-e8ba-4882-21b2-2dca9205d5b3.png">

### トリガーの設定
こんな感じで設定して「追加」をクリック。
<img width="946" alt="lambda5.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/78126/837b6c8c-ce11-2f0a-5462-a099abbc5476.png">

処理が終わると API エンドポイントが表示されます。この後使うので控えておきます。
![Inkedlambda8_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/78126/da2ebf46-d490-d311-0600-add5f82f4d30.jpeg)

終わったら Designer の「line_bot_test」アイコンをクリックし、関数の設定を行います。

### 関数コード
- コードエントリタイプ
.zipファイルをアップロード を選択し、先程固めた zip ファイルを選択

- ランタイム
今回は Node.js 6.10

- ハンドラ
`メインスクリプトファイル名.main処理の関数` のように指定します。
今回は index.js 内で exports.handler としているので `index.handler` となります。

<img width="948" alt="lambda6.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/78126/465bc22d-8421-3de7-1fe3-a39c6ced6136.png">

### 環境変数
ここで設定した環境変数は、lambda 関数内で `process.env['環境変数名']` でアクセスできます。
今回は ch_access_token、ch_secret、reply_url の3つを設定します。

- ch_access_token と ch_secret
LINE チャンネルの「アクセストークン」、「Channel Secret」をそれぞれ設定します。
こちらからログインして確認オナシャス。
https://developers.line.me/console

- reply_url
`https://api.line.me/v2/bot/message/reply` と設定してください。

<img width="948" alt="lambda7.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/78126/c11e910a-2cfa-1379-5d1d-f0a44a8ae35f.png">

### 基本設定
適当にメモリ 256 MB、タイムアウト1分に設定しました。
<img width="466" alt="lambda10.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/78126/d1e91b36-0103-8fdc-de8b-935d65050b0c.png">



ここまでやったら右上の「保存」をクリックします。

# LINE チャンネル設定
Line developers の LINE チャンネル設定の「Webhook URL」に API エンドポイントを設定します。

接続確認をすると、なんかエラーっぽいのが出ますがちゃんと動作しますので大丈夫です。
<img width="819" alt="lambda9.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/78126/ba44d720-365d-6cc0-755d-23382279f289.png">

以上で完成です！
LINE で友達追加して、いろいろ検索してみてください！
前編の最初の gif のような動作が確認できると思われます。

# 最後に
軽い気持ちで始めたんですが、なかなか満足の行くものが出来たかなと思ってます。

注意事項を挙げるとするとこの辺かなぁ。

- 画像検索はセーフサーチオフになっているので、変な言葉を検索しないほうが良いと思います。
- CloudWatch に検索ログが残るので、他の人がログを見るかも知れない環境では気をつけてください。

紳士な方々には全く問題ないと思いますが、念のため。