AWS　LambdaでのLine Bot作成手順

# 概要
AWS　LambdaでのLineBot作成手順をまとめました。line-bot-sdk-pythonを使わずに1から書いてみました。
ほぼほぼ「参考」の記事を使っています。
## webhokとは
- [Webhookとは？](https://qiita.com/soarflat/items/ed970f6dc59b2ab76169)
- [Webhookって何？を子どもでもわかるように描いてみた](https://kintone-blog.cybozu.co.jp/developer/000283.html#:~:text=Webhook%E3%81%A8%E3%81%AF%EF%BC%88%E7%95%A5%EF%BC%89%E3%80%81,%E3%81%A7%E9%80%9A%E7%9F%A5%E3%81%99%E3%82%8B%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%A7%E3%81%99%E3%80%82)

# 開発の手順紹介
## 技術

- Python
- AWS Lambda

## 流れ
1. Lmabda関数の作成
2. LineDeveloperの登録
3. おうむ返しBot作成
4. Botを少しいじってみよう

## 全体
```
import json  
import logging  
import os  
import urllib.request  

# ログ出力の準備  
logger = logging.getLogger()  
logger.setLevel(logging.INFO)  

def lambda_handler(event, context):  
    # リクエスト内容をログ出力  
    logger.info(event)  

    body = json.loads(event['body'])  

    for event in body['events']:  
        # 応答用のメッセージオブジェクトのリストを定義  
        messages = []  
        # 2. Webhookイベントタイプがmessageであり、  
        if event['type'] == 'message':  
            # 3. メッセージタイプがtextの場合に、  
            if event['message']['type'] == 'text':  
                # 4. 受信したテキストの内容をメッセージオブジェクトとする  
                if event['message']['text'] == 'ほんと':
                    messages.append({  
                            'type': 'image',  
                            'originalContentUrl': 'https://www.bizcourt.space/bizmarket/assets_c/2019/06/a_ocean_eyes_logo_bg_white_02-thumb-autox227-1304.png',
                            'previewImageUrl': 'https://www.bizcourt.space/bizmarket/assets_c/2019/06/a_ocean_eyes_logo_bg_white_02-thumb-autox227-1304.png'
                            })
                else:
                    messages.append({  
                          'type': 'text',  
                          'text': event['message']['text']+ 'です' 
                        })  

                # 応答メッセージのリクエスト情報を定義  
                url = 'https://api.line.me/v2/bot/message/reply'  
                headers = {  
                    'Content-Type': 'application/json',  
                    # 環境変数からLINEチャネルアクセストークンを取得  
                    'Authorization': 'Bearer ' + os.environ['LINE_CHANNEL_ACCESS_TOKEN']  
                    }  
                data = {  
                    # 応答用トークンとメッセージオブジェクトを設定  
                    'replyToken': event['replyToken'],  
                    'messages': messages  
                }  
                request = urllib.request.Request(url, data = json.dumps(data).encode('utf-8'), method = 'POST', headers = headers)  
                with urllib.request.urlopen(request) as response:  
                    # レスポンス内容をログ出力  
                    logger.info(response.read().decode("utf-8"))  
    return {  
        'statusCode': 200,  
        'body': json.dumps('Hello from Lambda!')  
    } 
```

## 詳細
### 1. Lmabda関数の作成
[Python の AWS Lambda 関数ハンドラー](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-handler.html)

### 2. LineDeveloperの登録

[公式ドキュメント](https://developers.line.biz/ja/docs/messaging-api/getting-started/)
### 3. おうむ返しBot作成

Postリクエストを投げる

urllib.requestのライブラリを使う。
[公式ドキュメント](https://docs.python.org/ja/3/library/urllib.request.html)
使い方のサンプル・・・[Python の HTTP クライアントは urllib.request で十分](https://qiita.com/hoto17296/items/8fcf55cc6cd823a18217)


環境変数の登録
[AWS Lambda 環境変数の使用](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-envvars.html)より

```
import os
region = os.environ['AWS_REGION']
```
で環境変数を使える。

### 4. Botを少しいじってみよう

・画像を返してみる
[公式ドキュメントの画像オブジェクト](https://developers.line.biz/ja/reference/messaging-api/#image-message)
このドキュメントを参考に

```
messages.append({  
                            'type': 'image',  
                            'originalContentUrl': '画像のURL',
                            'previewImageUrl': '画像のURL'
                            })
```
とすれば画像を返せます。

参考：[【LINE botから画像送信する方法】問いかけると柴犬の画像を返してくれるLINE botを作ってみた](https://qiita.com/kmaepu/items/fe718d6fd57929dd6e36)

# 参考
[LINE Messaging API × AWS Lambdaによる簡易応答システム #1: LINE〜Lambdaをつなげる
](https://hanar.qrunch.io/entries/NnA07AcqYa4YNbQ4)
←こちらサービスが切れてリンク切れのようです。
# 感想・今後・・・
- Lambda便利ですね。
- コードの読解力もっとあげたい！
- LineBotはもっといろいろ応用できそうなので、これから頑張りたい。