LINEから送信したテキストをDynamoDBに保存

# 事前準備
- [AWSのアカウント登録](https://aws.amazon.com/jp/)
- [LINE Developersの登録](https://developers.line.biz/ja/)
- pip等でrequestsライブラリをインストールしておく※pipの場合`pip install requests`

##今回やること
LINEBOTにメッセージを送って、送られてきたメッセージをDynamoDBに保存したいです

###使用する技術
- Python3.6
- Lambda 
- DynamoDB
- LINEmessagingAPI

####LINE Developers
新規プロパイダ作成をする→新規チャンネル作成。
チャンネル基本設定にある`アクセストークンを発行しコピーしておく。`
<img width="1181" alt="スクリーンショット 2019-09-18 13.46.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/e27ff263-afb3-88b0-725f-d74b0b5bdd8a.png">

#####Lambda 
lambdaのコンソール画面を開き、関数の新規作成
<img width="1411" alt="スクリーンショット 2019-09-18 13.49.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/e8fa7c12-9197-9a55-598a-41935815726d.png">
`※ランタイムにPython3.6を選択してください`
実行ロールにIAMで`DynamoDBFullAccess`をふっておきましょう。

```Python:Lambda_Function.py
import requests
import json
import boto3
import datetime

HEADER = {
    'Content-type':'application/json',
    'Authorization':'Bearer '+'先ほどコピーしたアクセストークン'
}


def lambda_handler(event, context):

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

    for event in body['events']:

        userId = event['source']['userId']  #userID取得
        message = datetime.datetime.now()  #時刻
        dynamoDB = boto3.resource("dynamodb")
        table = dynamoDB.Table("自分で作ったテーブル名")  # DynamoDBのテーブル名

        payload = {'replyToken': event['replyToken'], 'messages': []}

        #text形式で来た時の処理
        if event['message']['type'] == 'text':
            
            # DynamoDBへのPut処理実行
            table.put_item(
                Item={
                    "userId": str(userId),  # Partition Keyのデータ
                    "time": str(message),   #Sort Key
                    "message": str(event['message']['text'])  #Text内容
                })
            #END
            
            #送信したメッセージを送り返す処理
            payload['messages'].append({
                'type': 'text',
                'text': event['message']['text']
            })

    #スタンプを返す(標準スタンプだけ)
        elif event['message']['type'] == 'sticker':
            payload['messages'].append({
                'type':'sticker',
                'stickerId': event['message']['stickerId'],
                'packageId':event['message']['packageId']
            })
            
        if len(payload['messages']) > 0:
            response = requests.post(
                'https://api.line.me/v2/bot/message/reply',
                headers=HEADER,
                data=json.dumps(payload))

```
Lambdaでライブラリを使いたい時は使いたいライブラリファイルとまとめてzip圧縮してデプロイします。なので、インストールしたrequestsのファイルと一緒にデプロイします。
<img width="1370" alt="スクリーンショット 2019-09-19 12.16.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/5ff7db04-f415-06e9-182c-501d6cdb7640.png">
`※圧縮する時は.pyファイルと同じ階層にファイルが置かれてないといけないらしいです`

pipでインストールした場合は`pip show` コマンドでどこにファイルが置かれているか分かります。

###API Gateway
次に左側にあるトリガーの追加を押してステージ等はdefaultのままで追加。
<img width="1108" alt="スクリーンショット 2019-09-19 10.40.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/cab64299-4b86-0cbf-f650-dc1640d26d13.png">

API Gatewayをクリックするとエンドポイントが表示されるのでこれをコピー
<img width="1321" alt="スクリーンショット 2019-09-19 10.41.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/18bd1ecf-cde8-ab5a-c992-02af98ee758b.png">



LINE Developersの管理画面に戻って
<img width="1199" alt="スクリーンショット 2019-09-19 12.28.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/55bfbc51-a074-7e24-8694-18c12f54ea60.png">

Webhook URLの部分に貼りつけて更新

####DynamoDB
<img width="992" alt="スクリーンショット 2019-09-19 12.31.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/8e0a4094-2b09-c664-b3f7-e13cf9326dfd.png">

こんな感じで作ってますが、もっといいやり方があるなら教えて欲しいです。

###実演
![IMG_0601.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/7c4cb319-8f73-e0b1-4ebe-41af7e0f97a8.png)
こんな感じでちゃんと返ってこれば大丈夫です！！
<img width="992" alt="スクリーンショット 2019-09-19 14.02.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/ee50f7a9-57b5-a567-ca61-7d936c8b94ae.png">

ちゃんと書きこまれてますね！！