LINE BotのWebHookのためのAPI Gateway作成方法

## 概要
- AWS LambdaとDynamoDBを使ってLINE Botを作ったので、その備忘録の1つです。
- この記事では、LINE BotのWebHookのためのAPI Gatewayの作成・設定方法を説明します。

## 環境
- コンソールでの作業のため、環境構築なし。

## API Gatewayの作成方法
- AWSへログインし、API Gateway -> `APIを作成`をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/b16d3762-25cc-bdef-eda3-67ee339e7b63.png)

- APIタイプを選択 -> REST API -> `構築`をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/f67dd709-4426-4eb7-d9a9-b8e0970eb6f2.png)

- `You are not authorized to call DescribeVpcEndpoints`とエラーメッセージが出ますが無視でOK。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/85938e25-6cf1-7d1d-a63d-e308c893d3f3.png)

- 以下の選択・入力をして、`APIの作成`をクリック。
    - `REST`を選択
    - `新しいAPI`を選択
    - `API名`を入力。今回は`apigateway-linebot-sample`とします。
    - エンドポイントタイプを`リージョン`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/f8963cd2-234a-cf0f-459f-0c7663801c10.png)

- アクション -> `メソッドの作成`をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/4f081ca5-b4c3-b17f-962d-97baae636188.png)

- リストから`POST`を選択し、チェックマークをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/a794c7d1-b9d7-1598-b1d9-781c1f900324.png)

- 以下の内容を選択・入力し、`保存`をクリック。
    - 統合タイプ : `Lambda関数`を選択
    - Lambda プロキシ統合の使用 : `チェック`を入れる
    - Lambda リージョン : 任意のリージョン(今回は`ap-northeast-1`)
    - Lambda 関数 : 今回のLINE Bot用に作成した関数(今回は`linebot_auto_reply_sample`)
    - デフォルトタイムアウトの使用 : `チェック`を入れる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/f49d716c-dc37-0bad-e1e2-3dd12b08cb49.png)

- 『API Gatewayに、Lambda関数を呼び出す権限を与えようとしています』と表示されますので、`OK`をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/1ae2459b-81af-3a2b-2bac-5e82f0e410f7.png)

- 次に、CORSを有効化します。
- アクション -> `CORSの有効化`をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/cc2c0ad5-3262-7b53-670a-c21393b113fc.png)

- 選択肢はデフォルト設定のままで、`CORSを有効にして既存のCORSヘッダーを置換`をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/cc766df7-a0d4-3ec0-cde0-699d5ff2c0ac.png)

- メソッド変更の確認メッセージが表示されるので、`はい、既存の値を置き換えます`をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/9e43cf66-f4b0-386e-95a3-092a3cbcbb17.png)

- CORSが有効化されます。
- 次に、セキュリティ対策として、LINEからのリクエスト以外を受け付けないようにする設定をします。
- `POST`をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/e7376edc-d667-b4d1-9dea-50a40ba1bf71.png)

- `メソッドリクエスト`をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/77907985-5078-63c3-7b0f-d9f66bf81680.png)

- 以下の設定を入力し、`メソッドの実行`をクリック。
    - リクエストの検証 : `クエリ文字列パラメータおよびヘッダーの検証`
    - HTTP リクエストヘッダー : ヘッダーを追加する -> 名前は`x-line-signature`, 必須にチェック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/8cdceb06-b35c-b932-5eaa-2aea00a5a52b.png)

- メソッドリクエストのヘッダーに`x-line-signature`が追加されていることがわかります。
- これにより、`x-line-signature`がヘッダーに含まれていない場合(=LINE以外からのリクエストの場合)は、リクエストを拒絶し、Lambdaの不正な呼び出しを防ぐことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/dcfc9a62-c13b-7dc9-7eab-b1569fb2f02e.png)

- 次に作成したAPI Gatewayをデプロイします。
    - 何か設定を変更した際も、デプロイしないと反映されないので、ご注意ください。
- POST -> アクション -> `APIのデプロイ`をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/4ac63f72-cf51-38f1-7b0f-a5c9dc7a5e40.png)

- 以下の設定を行い、`デプロイ`をクリック
    - デプロイされるステージ : 新しいステージ
        - 以前作成したステージがある場合はそちらを使用してもOK。状況に応じて選択してください。
    - ステージ名 : 何でもOK(今回は`develop`)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/30ccdf0a-6914-3a2f-5d5b-82246f483aa0.png)

- デプロイすると、`ユーザーは、ウェブアプリケーションファイアウォール (WAFV2) の ListWebACL および AssociateWebACL 権限を持っていません。WAF 以外のステージ設定は引き続き変更できます。`とエラーメッセージが表示されますが、無視でOK。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/188912e0-3c57-c80b-8054-b57a7bddfda6.png)

- デプロイが成功し、エンドポイントURLが作成されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1834744/b18629b0-4429-556a-27ad-1620ba18f968.png)

- このURLを、LINE BotのWebhookに設定すればOKです。
    - LINE開発コンソールへログイン -> 作成したLINE Bot -> Messaging API設定 -> Webhook設定に入力
- 以上で、LINE BotのWebHookのためのAPI Gateway作成方法は完了です。