API GatewayとLambda(Python)でLINE BOT(Messaging API)開発 [前編]

# API GatewayとLambda(Python)でLINE BOT(Messaging API)開発 [前編]

## はじめに
先日、以前より興味のあったLINE BOT(Messaging API)を初めて作ってみました。
思っていたより簡単だったので、今後も気軽に作ってけたらなと思ってます。
せっかく作れるようになったので、このフレッシュな気持ちがなくなる前に記事を書いておきます。

前編と後編と、2つに分けて書こうと思います。
前編では主に環境構築。何か話しかけると「こんにちは！」とだけ返すBOTを作成します。
[後編](https://qiita.com/w2or3w/items/fbe588d7147bb8e65628)ではline-bot-sdkというライブラリを利用して、メッセージ以外のやり取りをする実装についても書こうと思ってます。

## LINE Developpersでプロバイダーとチャンネルの作成
まずはLINE Developpersで作業します。
[LINE Developpers](https://developers.line.biz/ja/)にアカウントが必要ですが、登録手順については割愛。
[LINE Developpers の コンソール](https://developers.line.biz/console/)にアクセスし、プロバイダーを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/828a76ed-50cf-e2b9-94b8-7b115d4a6f60.png)
プロバイダー名を入力して作成します。
ここではプロバイダー名を「サンプルプロバイダー」としました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/9bdfbee2-8f6d-0ae8-70c0-0c288b0840d6.png)

チャンネル設定で「Messaging API」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/87cd9bdb-6456-b994-93b0-81f3db01c8b6.png)

チャンネルアイコン、チャンネル名、チャネル説明、大業種、小業種、メールアドレス、プライバシーポリシーURL(任意)、サービス利用規約URL(任意)、などを設定・入力し、作成します。
ここではチャンネル名を「サンプルチャンネル」としました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/5405a94a-6d63-8047-561c-5e5f5d0a49df.png)

作成されたチャンネルの以下の情報は後ほど利用します。
・「チャンネル基本設定」にある **チャネルシークレット** 
・「Messaging API設定」にある **チャネルアクセストークン（長期）**  (※発行してください)

「Messaging API設定」にある **Webhook設定 > Webhook URL** へは、これから作成するWebAPIのURLを設定します。
LINE Developpersでの作業はひとまずここまで。

## AWSでAPI GatewayとLambda(Python)の作成
続いてAWSで作業します。
[AWS](https://aws.amazon.com/jp/)にアカウントが必要ですが、登録手順については割愛。

### Lambda(Python)の作成
AWSマネジメントコンソールの[Lambda](https://ap-northeast-1.console.aws.amazon.com/lambda/home?region=ap-northeast-1#)のページへアクセスし、関数を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/541519fd-4f00-9c73-ea1a-bab88c64f9f7.png)
関数名は「sample_function_from_line」、ランタイムは「Python 3.6」を選択しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/e16436d5-c47b-578c-c7b3-e2fbb9f06900.png)

関数コードの`lambda_function.py`はひとまず以下のコードとしておいてください。
「こんにちは！」と応答するだけのプログラムです。

```lambda_function.py
import json
import os
import urllib.request
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)

LINE_CHANNEL_ACCESS_TOKEN   = os.environ['LINE_CHANNEL_ACCESS_TOKEN']

REQUEST_URL = 'https://api.line.me/v2/bot/message/reply'
REQUEST_METHOD = 'POST'
REQUEST_HEADERS = {
    'Authorization': 'Bearer ' + LINE_CHANNEL_ACCESS_TOKEN,
    'Content-Type': 'application/json'
}
REQUEST_MESSAGE = [
    {
        'type': 'text',
        'text': 'こんにちは！'
    }
]

def lambda_handler(event, context):
    logger.info(event)
    params = {
        'replyToken': json.loads(event['body'])['events'][0]['replyToken'],
        'messages': REQUEST_MESSAGE
    }
    request = urllib.request.Request(
        REQUEST_URL, 
        json.dumps(params).encode('utf-8'), 
        method=REQUEST_METHOD, 
        headers=REQUEST_HEADERS
        )
    response = urllib.request.urlopen(request, timeout=10)
    return 0
```

環境変数に、LINE Developpersで作成したチャンネルの「Messaging API設定」で発行した **チャネルアクセストークン（長期）** を`LINE_CHANNEL_ACCESS_TOKEN`というキーの値として登録しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/3ec10050-8a27-6148-007a-a29767632b2d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/dfe9a575-b25b-c552-e37d-460e46563aef.png)

最後に、コードが保存されていることを確認のうえ、デプロイします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/b2e602ec-0e22-797f-e76d-b8ab2b907b20.png)

### API Gatewayの作成
AWSマネジメントコンソールの[API Gateway](https://ap-northeast-1.console.aws.amazon.com/apigateway/main/apis?region=ap-northeast-1)のページへアクセスし、APIを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/d577c0c0-c099-851e-7dcf-c23115a88c1c.png)
REST APIを構築します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/09d99b2e-a1e3-d21b-13ed-ef7d69d3a3e6.png)
API名を入力、エンドポイントタイプはリージョンを選択し、作成します。
ここではAPI名は「sample_api_from_line」としました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/5fe90c9d-019b-fe8b-4cae-3883438c1957.png)

アクションから「リソースの作成」を選択し、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/d9a62e2c-03d0-f4f2-02fe-d195e42d0722.png)
新しい子リソースの作成をします。
ここではリソース名を「sample-resource」としました。「API Gateway CORSを有効にする」のチェックはONとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/15a215bd-5ad8-397f-b06c-db1a22a40eb2.png)

作成したリソースにPSOTメソッドを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/4e462829-134b-4a40-71c2-fda03e45bcc4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/5ff09540-521e-9b4a-dce2-d2093483a501.png)

POSTメソッドのセットアップでは、先ほど作成したLambda関数(sample_function_from_line)を選択します。
「Lambdaプロキシ統合の使用」もONにしておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/d16c614b-7e0a-513e-ff83-6283c4ab1436.png)
「Lambda関数に情報を追加する
　API Gatewayに、Lambda関数を呼び出す権限を与えようとしています:」
という確認メッセージが表示されますので、OKボタン押下で許可を与えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/4a8ee00d-f8bd-dd91-dd6e-d0f124210d9d.png)

アクションから「APIのデプロイ」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/ea4c5080-9812-794f-a71c-aa64564a34fa.png)

APIのデプロイ画面で新しいステージを作成し、デプロイします。
ステージ名は、ここでは「work」としておきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/f80a1f46-9548-b147-39da-f79d518570d1.png)

デプロイされたworkステージのPOSTメソッドを選択し、「URLの呼び出し」に表示されているURLを、
「Messaging API設定」にある **Webhook設定 > Webhook URL** へ設定します。

### LINEチャンネルのMessaging API設定
LINE Developpersのコンソールに戻りまして、作成しておいたサンプルチャンネルの「Messaging API設定」にある **Webhook設定 > Webhook URL** へ、デプロイしたPOSTメソッドのURLを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/c2e14615-5746-9fe6-52d8-0e0d45a9c713.png)
Webhookの利用ラジオボタンもONにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/351726fd-70fe-00c3-116f-74232deaf469.png)

### 動作確認
これで一通りの設定は完了です。動作確認してみましょう。
「Messaging API設定」にあるQRコードから、作成したLINE BOTを友達追加することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/6da26913-397e-baba-b34f-953329e07157.png)

友達として追加して、何か話しかけてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/10a4ef19-cd40-90c1-cd6d-ec11df9f0547.png)
「メッセージありがとうございます！申し訳ありませんが、このアカウントでは個別のお問い合わせを受け付けておりません。次の配信までお待ちください。」という自動応答の後に続き、実装した「こんにちは！」を返してきてくれていますね。

#### 自動応答の設定
自動応答を無くすための設定は、チャンネル基本設定の基本設定にある「LINE Official Account Manager」へのリンクから飛んだ先で行う事ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/a47be405-a805-f84c-79c9-142c0c45cf6f.png)
応答設定の応答メッセージを「オフ」にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/3f0ab252-0e35-42ca-3f0b-8c7ec1686d57.png)
なおここでは友達追加して最初に表示される「あいさつメッセージ」も非表示にしたり、内容を更新したりすることができます。

それでは改めて動作確認してみましょう。
何か話しかけると「こんにちは！」とだけ返してくれるBOTが完成しました🎉
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394775/a918b097-16f6-5490-f57e-366ebbe192cb.png)

## あとがき
[後編](https://qiita.com/w2or3w/items/fbe588d7147bb8e65628)へつづく！