AWS Lambda+Node.jsでLINEBotをサクッと作る(2017/03時点)

##はじめに

2016/10にBOT APIに替わりMessaging API(新API)がリリースされれている。
AWS LambdaとMessaging API(新API)で定番の?オウム返しLINEBotをサクッと作るメモ。

API Reference: https://devdocs.line.me/ja/#reply-message

##LINE側の設定
以下の手順で　LINE Messaging APIの利用登録を行います。

* 「LINE BUSINESS CENTER」にアクセスして、デベロッパー登録を行う
https://business.line.me/ja/

* 画面右上の「ログイン」をクリックし、通常のLINEアカウントでログイン
* 提供サービス一覧の「Messaging API」から「Messaging APIを始める」を選択
![スクリーンショット 2017-03-07 23.24.40.png](https://qiita-image-store.s3.amazonaws.com/0/79414/115b0526-063d-d80a-7e3e-928c89766663.png)

* 利用する企業アカウントの選択を求められるので、まだ無い場合は新規で作成
* アカウント名の入力と業種と選択をしてアカウント申し込み
![スクリーンショット 2017-03-07 23.35.39.png](https://qiita-image-store.s3.amazonaws.com/0/79414/fa95364a-8175-5021-1049-5795c81a788e.png)

* 登録完了後、「アカウントリスト」から作成したアカウントの「LINE＠ MANAGER」を選択
![スクリーンショット 2017-03-07 23.46.03.png](https://qiita-image-store.s3.amazonaws.com/0/79414/fae5b123-3f74-7943-b1a1-ef1ff0275252.png)
※Messaging APIの登録を行うとLINE@のアカウントも有効になるようです。

* 「アカウント設定」>「Bot設定」で以下の項目の設定を変更
 * Webhook送信: 利用する
 * 自動応答メッセージ: 利用しない(必要に応じて)
 * 友だち追加時あいさつ: 利用しない(必要に応じて)
![スクリーンショット 2017-03-08 0.23.59.png](https://qiita-image-store.s3.amazonaws.com/0/79414/dbf5164a-4537-f2aa-90f5-896025c86361.png)

* Bot設定の「LINE Developersで設定する」を選択し「Developers」ページへ移動
* Channel Access Tokenの「ISSUE」をクリックし、Access Tokenを発行
※Access Tokenは後にLambda側の設定の際に使用します。


##AWS Lambda側の設定

Lambdaファンクションの作成を行います。

* AWSコンソールでLambdaを選択
* 「Lambda関数の作成」>「設計図の選択」から「ブランク関数」を選択
* トリガーの設定はせずに未選択のまま「次へ」を選択
* 「関数の設定」では「名前」と「説明」を適宜設定します。
※今回はNode.jsを使用するので「ランタイム」にはNode.js 4.3を選択しました。
* Lambda関数のコードにソースコードを記述
* 環境変数に　Messaging APIのChannel Access Tokenを設定
* 「Lambda 関数ハンドラおよびロール」>「ロール名」に適宜ロール名を設定し、「ポリシーテンプレート」にはシンプルなマイクロハーネスのアクセス権限を設定
* 確認ページで内容を確認し「作成」を選択

##AWS API Gateway側の設定

APIGatewayの作成を行います。

* AWSコンソールでAPI Gatewayを選択
* 「APIの作成」から「新しいAPI」を選択し適宜API名を設定し「APIの作成」を選択
![スクリーンショット 2017-03-08 2.13.29.png](https://qiita-image-store.s3.amazonaws.com/0/79414/dff1969c-e2f2-107c-eb12-341d57139e93.png)

* 「アクション」>「リソースのアクション」から「メソッドの作成」を選択しメソッドの種類にはPOSTを選択する
* 「セットアップ」>「統合タイプ」には「Lambda関数」を選択し、Lambdaファンクションを作成したリーションを選択した後Lambdaファンクションの名前を選択し保存
![スクリーンショット 2017-03-08 2.18.04.png](https://qiita-image-store.s3.amazonaws.com/0/79414/262aad1f-6016-ea36-5d38-47f78e3acd98.png)

* 「アクション」>「APIアクション」>「APIのデプロイ」を選択し、APIをデプロイ
※完了後に「ステージ」から確認できるAPIのURLはLINE MessageAPIの設定に使用する。

##LINE側の設定2

LINE Messaging APIにcallbackURLの設定を追加します。

* LINE側の設定で確認した「Developers」ページを開く
* 「Basic information」の「Edit」を選択し、「Webhook URL」にAPI Gatewayで作成したAPIのURLを設定


##ソースコード

```js:app.js
'use strict';

const https = require('https');

let send = (data, callback) => {
  let body = JSON.stringify(data);

  let req = https.request({
    hostname: "api.line.me",
    port: 443,
    path: "/v2/bot/message/reply",
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "Content-Length": Buffer.byteLength(body),
      "Authorization": "Bearer " + process.env.CHANNEL_ACCESS_TOKEN
    }
  });

  req.end(body, (err) => {
    err && console.log(err);
    callback(err);
  });
}

exports.handler = (event, context, callback) => {
  let result = event.events && event.events[0];
  if (result) {
    let content = event.events[0] || {};
    let message = {
        "replyToken":result.replyToken,
        "messages": [
          {
            "type": "text",
            "text": content.message.text
          }
        ]
      };
      send(message, () => {
      callback();
    });
  } else {
    callback();
  }
};
```

GitHub: https://github.com/daikiojm/lambda-line-bot-test/blob/master/bot.js