Nowで始める、ナウでヤングなLINEBot生活（Node.js編）

LINE BOOT AWARDSの締め切りも近いので、[Now](https://zeit.co/now)というPaaSを使ったLINE Botのデプロイ方法について書こうと思います。

# NOWとは？

超絶簡単に言うとHerokuの様にWEBアプリの公開を簡単にしてくれるサービスです。
シンプルかつ高速で、gitなどのソース管理システムを使うことなくとても簡単に使用することができます。
Node.jsのデプロイが基本ですが、Dockerも使うことができるので、いろんなことができます。

細かい話はこちらの記事を
https://qiita.com/nkzawa/items/8bf62549f79ebbcaafd8
https://qiita.com/aggre/items/f0cb9f8b8e8c54768e50

# 今回デプロイするもの

## アイデアボット

<img width="510" alt="スクリーンショット_2018_09_29_23_26.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/150295/262f267b-7d8b-ed5b-0284-33c65b310f07.jpeg">

こんな感じでメッセージの中にアイデアという言葉があれば、某最近最終回を迎えた朝ドラ主題歌の歌詞を返してくれるBotをビルドします。

## Botの準備
アイデアボットは[line-bot-sdk-nodejs](https://github.com/line/line-bot-sdk-nodejs)を使ってBotの開発をします。
npmで必要なライブラリをインストール

```
npm install @line/bot-sdk
npm install express
```

そんでもって、サンプルコードをもとにコードを書きます

```javascript:index.js
'use strict';

const line = require('@line/bot-sdk');
const express = require('express');

// create LINE SDK config from env variables
const config = {
  channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN,
  channelSecret: process.env.CHANNEL_SECRET,
};

// create LINE SDK client
const client = new line.Client(config);

// create Express app
// about Express itself: https://expressjs.com/
const app = express();

// register a webhook handler with middleware
// about the middleware, please refer to doc
app.post('/callback', line.middleware(config), (req, res) => {
  Promise
    .all(req.body.events.map(handleEvent))
    .then((result) => res.json(result))
    .catch((err) => {
      console.error(err);
      res.status(500).end();
    });
});

// event handler
function handleEvent(event) {
  if (event.type !== 'message' || event.message.type !== 'text') {
    // ignore non-text-message event
    return Promise.resolve(null);
  }
  //メッセージの内容にアイデアという文字があれば歌詞を返す
  if(event.message.text.match("アイデア")){
    const echo =  {type: 'text', text: "つづく日々の道の先を塞ぐ影にアイデアを~"};
    // use reply API
    return client.replyMessage(event.replyToken, echo);
  }
}

// listen on port
const port = process.env.PORT || 3000;
app.listen(port, () => {
  console.log(`listening on ${port}`);
});
```

とりあえず、これでアイデアボットは完成です。


# Nowの使いかた
ここからNowを使ってのデプロイです

## インストール

とりあえず、公式からデスクトップアプリをダウンロード
https://zeit.co/download

or

npmを使用してインストール

```sh
npm i -g now
```

## package.jsonにスタートスクリプトを記述

package.jsonにプログラムをスタートさせるコマンドを記載します

```json:package.json
"scripts": {
    "start": "node index.js"
  },
```


通常のアプリならあとは

```
now
```

コマンドだけでデプロイされるのですが、Botをデプロイするのであれば、もう少し追加の設定が必要です。


## aliasの設定

nowではデプロイするたびに、[https://アプリ名-ランダムな文字列.now.sh]というURLが与えられます。
LINEBotでは、WebhookURLを登録する必要があるので、デプロイされるたびにURLが変わると、面倒なのでaliasを設定します。
こちらもpackage.jsonに追加してください。

```json:package.json
"now": {
    "alias": "〇〇〇〇"
  },
```
〇〇〇〇には自分の好きな文字を入れてください
この状態だと、デプロイして

```
now alias
```

コマンドを実行すると、[https://〇〇〇〇.now.sh]というURLでアクセスすることができるようになります。


ということで、ダッシュボードにalias実行後のURLを先に載せちゃってください

<img width="950" alt="LINE_Developers.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/150295/eb878c31-14d0-a26d-4dd5-1f4dbec8c30a.jpeg">


## 環境変数を入れる

今回のアイデアボットは環境変数からアクセストークンや、チャンネルシークレットの情報を取ってきているため、デプロイする際もその情報を入れてあげなければいけないです。

```javascript
// create LINE SDK config from env variables
const config = {
  channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN,
  channelSecret: process.env.CHANNEL_SECRET,
};
```

ハードコーディングする手もありますが、Nowのフリープランではコードが見えてしまうので
トークンなど秘密の情報は環境変数ぶち込みます

そのためにはSecretsというものを使います。
https://zeit.co/docs/getting-started/secrets

ターミナル上で

```sh
now secret add line-token YOUR_CHANNEL_ACCESS_TOKEN
now secret add line-secret YOUR_CHANNEL_SECRET
```
YOUR_CHANNEL_ACCESS_TOKEN,　YOUR_CHANNEL_SECRETには自分のBotの情報を入れてください。

そして、Secretsの情報が、どの環境変数に紐づいているのかをpackage.jsonに記述します。
aliasを追加するときに作ったnowの所に追加してください。


```json:package.json
 "now": {
    "alias": "〇〇〇〇",
    "env": {
      "CHANNEL_ACCESS_TOKEN": "@line-token",
      "CHANNEL_SECRET": "@line-secret"
    }
```
これでデプロイの際に環境変数にトークンなどの情報が入ります。

## デプロイ
あとはnowをして

```
now
```
こんな感じで、Successが出たら完了！
<img width="1395" alt="1__ubuntu_s-mang-glk2_____bash_.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/150295/3b0ef0da-35eb-e4b4-bccb-274370c153c7.jpeg">

## aliasの反映
このままだと、https://〇〇〇〇.now.shではアクセスできないので、aliasの内容を反映させます。

```
now alias
```

このコマンドを実行したら

aliasに設定した内容のURLに紐づいてくれます。

<img width="854" alt="1__ubuntu_s-mang-glk2_____bash_.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/150295/2676c67d-93dc-2639-7cbd-03de0ee38d42.jpeg">

**これで完成です！**

Botに「アイデアを考えるんや」みたいな感じのことを言うと返事がくると思います！

## 注意点
~~１つ注意ですが、Herokuと同じ様にNowもインスタンスに一定時間アクセスがないとsleepしてしまうため、もしサービスとかで使い場合はcronとかで一定時間で起こしてあげてください。~~

2018/10/25追記)
NowでOSSプランでもインスタンスをスリープさせない方法があるので、それについての記事を書きました
→ [Nowの無料プランでもインスタンスをスリープさせない方法](https://qiita.com/tetrapod117/items/1dff15bf4ca45488019a)


# 最後に
Nowを使うと簡単にBotのデプロイができるようになります。

シンプルで早くて簡単なNowでナウでヤングなBot生活を楽しんでください！

時間があれば、Dockerfileを使ったデプロイとClovaスキルのデプロイ記事を書こうと思います。