【Ruby + AWS】Amazon EC2インスタンスでLINE Bot Server構築してみた

## はじめに

こんにちは。ここ最近ですが、仕事でLINE Botを作ることになりましたので、必要な設定を共有できればと思います。
なお、この記事ではあくまで概念とLINE Bot Serverを構築するまでの準備のレベルを書こうと思うので、あえてBot Server部分のコードは省略します(というか、書き始めたばかりなので新規に埋め込んだコードがほとんどない)。

## 追記

よくよく考えたら、概念図のポンチ絵、左部分おかしいですね、、、
LINEのネイティブ・WebアプリケーションがあってそこにユーザとBotがいるので、本来は入れ子にするべきでしたね。後日、修正します。

## LINE Botの概念図

手書きのポンチ絵なのて、字が下手な部分はご愛嬌...
なお、このポンチ絵は以下の3つの資料を参考に書きました。

[https://developers.line.biz/ja/docs/messaging-api/overview/](https://developers.line.biz/ja/docs/messaging-api/overview/)
[https://developers.line.biz/ja/docs/messaging-api/getting-started/](https://developers.line.biz/ja/docs/messaging-api/getting-started/)
[https://developers.line.biz/ja/docs/messaging-api/building-bot/](https://developers.line.biz/ja/docs/messaging-api/building-bot/)

![57748388-ba4a6600-7714-11e9-8fde-2082f833de7b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144991/79b075ca-1886-67a1-7c95-895bcbd86304.jpeg)

当初、弊社のWebアプリケーション用のサーバとは別にLINE PFがアクセスするエンドポイント用のサーバを用意する必要があったので、スクリプト言語で書く必要もないかなと考えGoでやろうかと言っていましたが、それほど大規模なアクセスを想定していないこと、既存のアプリケーションと一旦統合するような設計を採る事にしたため、RubyでBot Serverを作る事にしました。

## 環境の確認

* OS: Amazon Linux AMI release 2018.03
* Nginx: 1.14.1
* Ruby: 2.4.6

## Route 53でコールバック用に使うレコード名を登録 || セキュリティグループの設定

上記のLINE PF(プラットフォーム)がコールバック用のエンドポイントとなるURLにアクセスできるようにレコード名を登録してあげます。また、グローバルにアクセスできるようにSecurity Groupの設定も行って下さい。

## EC2インスタンス上でLINE Bot Serverを設定

Bot Server検証用の環境を構築しようとした矢先に気づいたのですが、LINE Botではコールバック用のURLは`HTTP over SSL`しか対応していない事が発覚し、検証環境でもSSL証明書を導入する必要が出てきました。そのため、EC2インスタンス単体で証明書をインポートする機構が必要だったため、今回はLet's Encryptで導入する形を採りました。

### SSL証明書の導入(Let's Encrypt)

基本的には、下記の部分のコマンドの引用です。

[https://certbot.eff.org/lets-encrypt/centosrhel6-nginx](https://certbot.eff.org/lets-encrypt/centosrhel6-nginx)

* certbot-autoの導入

```bash
% wget https://dl.eff.org/certbot-auto
% sudo mv certbot-auto /usr/local/bin/certbot-auto
% sudo chown root /usr/local/bin/certbot-auto
% sudo chmod 0755 /usr/local/bin/certbot-auto
```

* 証明書の発行

```bash
% sudo /usr/local/bin/certbot-auto --nginx certonly --debug
```

* NGINXをリバースプロキシとして設定し、SSL証明書をインポート

```nginx
server {
    listen       80;
    server_name  ***.***.***;

    location / {
        root   /var/www/html;
        index  index.html index.htm;
    }
}

server {
    listen 443;
    ssl on;
    server_name ***.***.***;
    ssl_certificate /etc/letsencrypt/live/***.***.***/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/***.***.***/privkey.pem;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://127.0.0.1:3000;
    }
}
```

```bash
% sudo service nginx restart
```

## RubyによるBot Serverの構築

LINEリポジトリから公式に提供されている[https://github.com/line/line-bot-sdk-ruby](https://github.com/line/line-bot-sdk-ruby)というRuby用のBot Kitをインストールします。
なお、Bot Kitは、他にも多くの言語をサポートしている模様ですので、基本的なLINE Botの作り方は採用する言語に合わせてBot Kitを用意すればOKです。

## echo botによる動作確認

各Bot Kitリポジトリのexamplesディレクトリ配下にサンプルコードが用意されています。今回は、echobotでユーザメッセージをそのまま鸚鵡返しするBot Serverを採用し、動作確認を行います。

[https://github.com/line/line-bot-sdk-ruby/tree/master/examples/echobot](https://github.com/line/line-bot-sdk-ruby/tree/master/examples/echobot)

<img width="375" alt="IMG_1413.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144991/66320939-77db-a304-cbd6-c328c3063845.jpeg">

echo Botによる動作確認が取れました。

## まとめ

これまた、設定部分の所しかかけていませんが、これからどんどんコードを書いていこうと思います。

因みに、line-bot-sdkの事を、Bot Kitって言っているのは、プラモデルを作るのと同じように、「部品が用意されていて、それを組み合わせて静的なモデルを完成させる」感覚になっているので、ライブラリというよりツールキット(Bot用だからBot Kit)という言い方しています。

まぁ、そんな与太話はどうでもいいと思うので、中身を詳細に書き次第、改めて記事を書いていきます。
それではまた。

## 参考文献

* [https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/SSL-on-an-instance.html](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/SSL-on-an-instance.html)
* [https://certbot.eff.org/lets-encrypt/centosrhel6-nginx](https://certbot.eff.org/lets-encrypt/centosrhel6-nginx)
* [https://github.com/line/line-bot-sdk-ruby](https://github.com/line/line-bot-sdk-ruby)