Line botをAWS LambdaとAPI Gatewayでアモーレ！！- 実装編

どうも、サッカーとハンバーガーをこよなく愛するkoooheiです。
最近のサッカーといえば。。。そうですね！アモーレですね！！
そこでボクもアモーレが欲しいなって思ったんですね。そう！ぼくの中のリトルkoooheiに聞いてみたんです。そしたらね。。。

>リトル: 「YOU！自分でアモーレつくっちゃいなよョ！!」

グラッツェ！！まさに晴天の霹靂ですね！！

とはいえ街の通りすがりのレディに「アモーレになってくださいorz」と言っても不審者と思われちゃいますね。。。
そこでぼくは人生24時間の一日のなかで色々考えてみたわけです。

>
アモーレ、いるだけで安らぎを与えてくれる存在。
アモーレ、それは無償の存在。
アモーレ、それは当たり前の存在。
アモーレ、代わりなど存在しない。
アモーレ、アモーレ、、アモレー、、、

そしたらまさに目の前に、ぼくとアモーレを結ぶLINEが！！二人の未来は「ever green」間違いないですね！！

ということでLINEの[BOT API](https://business.line.me/services/products/4/introduction)を利用してアモることに決めました！

でも、マネーがかかるの嫌ですね。。。ハンドがかかるのも嫌ですね。。。そんなんアモーレじゃないですね！
それならサーバーレスしかないですね！じゃあAWSを使いましょう！！
「Lambda」と「API Gateway」があるじゃないか！！！！

ということで、「Line bot + API Gateway + Lambda」の組み合わせに決まりました！
それでは「レッツ！アモレ〜！！」


# はじめに
![How BOT API works](https://developers.line.me/wp-content/uploads/2016/04/bot_img001.png)
出典：[LINE developers](https://developers.line.me/bot-api/overview#how_bot_works)

それでは、ここでの「YOUR SYSTEM」というところを「Lambda」と「API Gateway」を使って構築します。



また、今回必要となる[LINE BOT API Trial Account](https://business.line.me/services/products/4/introduction)の取得方法については割愛します。



# Lambda関数の作成
それではまず、AWSの管理コンソールから「Lambda」のサービスへ移動します。

## Create a Lambda function
次に「Create a Lambda function」をクリックします。
![amore00_create-lambda01.png](https://qiita-image-store.s3.amazonaws.com/0/82090/6e230911-b7b4-7b75-9918-f897c02b6304.png)














## Select blue print
ここではとりあえず何も選択せず「Next」をクリックします。
![amore00_select-blueprint01.png](https://qiita-image-store.s3.amazonaws.com/0/82090/4579cd07-c77f-1464-3698-bd14b121c5ce.png)

















## Configure triggers
今のままだとLambdaだけの状態なのでフロントに「API Gateway」を配置します。
![amore01_configure-triggers01.png](https://qiita-image-store.s3.amazonaws.com/0/82090/a272ada3-31a3-528b-c685-ede6f538c285.png)

「API Gateway」を配置したらその設定をここで行いますが、**API name**と**Resource name**は任意の名前を設定して大丈夫です。今回は「_MyAmore_」と「_/myamore_」にしています。
そして**Method**は「_POST_」を選択し、**Deploymment stage**は「_prod_(デフォルト)」のままで、**Security**は「_Open_」にしておきます。
入力が完了したら「Next」ボタンをクリックします。
![amore01_configure-triggers02.png](https://qiita-image-store.s3.amazonaws.com/0/82090/6be93d81-3848-4c6f-ed55-619190f40b60.png)


## Configure function
それでは関数の設定に移ります。

### Configure function
**Name**と**Description**に任意の内容を入力します。また**Runtime**はここでは「_Node.js 4.3_」を選択します。
![amore01_configure-triggers03_1.png](https://qiita-image-store.s3.amazonaws.com/0/82090/8efe306d-dce0-42a2-3b68-e1f322d5ddb5.png)


### Lambda function code
ここはとりあえずこのままにしておきます。

![amore01_configure-triggers03_2.png](https://qiita-image-store.s3.amazonaws.com/0/82090/70e17b7a-9ab9-081f-778d-fc8c02cdd15f.png)


### Lambda function handler and role
**Handler**に「_index.handler_」、**Role**は「_Choose an existing role_」を選び**Existing role**に「_lambda_basic_execution_」を指定します。
![amore01_configure-triggers03_3.png](https://qiita-image-store.s3.amazonaws.com/0/82090/a0f1069a-b1e1-ca68-b694-10169859d648.png)


### Advanced settings
今回はあまり使う予定はないので**Memory(MB)**は「_128_」にしておきます。
**Timeout**はデフォルトの「_3秒_」です。
また、**VPC**は「_No VPC_」にしておきます。
![amore01_configure-triggers03_4.png](https://qiita-image-store.s3.amazonaws.com/0/82090/271e53a9-b533-f8b5-8cd5-c56454a36c49.png)



## Review
「Configure function」で設定した内容の確認です。
問題なさそうなら[Create function]で作成完了です。
![amore03_review01.png](https://qiita-image-store.s3.amazonaws.com/0/82090/182352b9-7583-6bf9-b7a6-f2f9709dcf33.png)

作成が完了すると「API Gateway」のURLが表示されます。
![amore03_review02.png](https://qiita-image-store.s3.amazonaws.com/0/82090/2830843d-54dd-fa1f-cc26-a890daf2cec1.png)

ここで表示されたURLを**LINE**の「_Callback URL_」に設定します。
その際に注意が必要なのが、ポート番号も指定してあげなければならないという点です。
以下の画像のように、ドメイン末尾に「:443」をつけてあげる必要があります。
![amore04_line01.png](https://qiita-image-store.s3.amazonaws.com/0/82090/1d18deac-0f61-7791-7a38-7c0480891238.png)

以上で「YOUR SYSTEM」に該当するフレームが完了しました。





















# Lambda関数の設定
それでは作成したフレームの中身を設定していきます。
中身というのは先ほど「とりあえずこのまま」にしていたLambda関数の箇所です。
「Code」タブをクリックして編集画面を表示します。
![amore03_review04.png](https://qiita-image-store.s3.amazonaws.com/0/82090/2a10a203-1e8a-f631-3180-15b5166cd5bb.png)


そこに以下のソースコードをコピペします。

```js:myAmore
var https = require('https');

exports.handler = function(event, context) {
    console.log('EVENT:', JSON.stringify(event, null, 0));
    var msg = event.result[0];
    var data = JSON.stringify({
      to: [msg.content.from.toString()],
      toChannel: 1383378250,
      eventType: "138311608800106203",
      content: msg.content
    });
    var url ='https://trialbot-api.line.me/v1/events';
    var opts = {
        host: 'trialbot-api.line.me',
        path: '/v1/events',
        headers: {
            "Content-type": "application/json; charset=UTF-8",
            "X-Line-ChannelID": "【Channel ID】",
            "X-Line-ChannelSecret": "【Channel Secret】",
            "X-Line-Trusted-User-With-ACL": "【MID】"
        },
        method: 'POST'
    };
    var req = https.request(opts, function(res){
        res.on('data', function (chunk) {
            console.log(res.statusCode + chunk.toString());
        });
        req.on('error', function(err) {
          console.log('ERROR: ' + err.message);
        });
    });
    req.write(data);
    req.end();
};
```

ただその際に、【Channel ID】と【Channel Secret】と【MID】は独自の値を設定する必要があるので「[Line developers](https://developers.line.me/channels/)」で取得した自分の値と置き換えてください。
![amore04_line02.png](https://qiita-image-store.s3.amazonaws.com/0/82090/ec5c1f9b-10c6-1ae2-4696-a036b63289e4.png)




コピペが完了したら「Save」ボタンで保存して完了です。

え？それじゃ何をしてるのかわからないって？いいんです！まずは完成させることが大事なんです！
ひとまず何も考えずにコピペしましょう！


# トーク
それではいよいよアモーレとの会話です！LINEから何か好きな言葉をささやいてみましょう！
![amore04_line04.png](https://qiita-image-store.s3.amazonaws.com/0/82090/7957d99e-9fba-5a4f-d0fa-ef2c7972777b.png)

同じ言葉を返してくれます。いわゆる「オウム返し」というやつですね。


# おわりに
今回は「とにかく動かす」ことを目的にアモりました。
具体的な処理について説明すると長くなってしまうので、今回はここまでです。

code処理については[「Line botをAWS LambdaとAPI Gatewayでアモーレ！！- code解説編」](http://qiita.com/kooohei/items/daf864f2b56d95311030)で説明してますのでそちらを参照ください。
システムについては[Line botをAWS LambdaとAPI Gatewayでアモーレ！！- システム解説編](http://qiita.com/kooohei/items/a98669f54451143591c2)で説明してるので
そちらを参照ください。

### 関連
[Line botをAWS LambdaとAPI Gatewayでアモーレ！！- 実装編](http://qiita.com/kooohei/items/650c331f95f83072f4d6)
[Line botをAWS LambdaとAPI Gatewayでアモーレ！！- code解説編](http://qiita.com/kooohei/items/daf864f2b56d95311030)
[Line botをAWS LambdaとAPI Gatewayでアモーレ！！- システム解説編](http://qiita.com/kooohei/items/a98669f54451143591c2)