いろんなことに引っかかりながらAPI Gateway⇔Lambdaを試す

# はじめに
[前回](https://qiita.com/kiii142/items/b25e83d505ca049f3df5)Lambdaを使ってみたので
つぎはAPI Gateway との連携できたらいいよね！と思ってチュートリアルやってみようとしたら
初心者すぎていろんなことに引っかかったという記事です。
丁寧な公式チュートリアルはこちら
+ [API Gateway の開始方法](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/getting-started.html)

Lambda関数はどうしてもpythonで書きたかったので
公式チュートリアルからはちょっと外れてそこの処理だけpythonで書くこととします。
最初に手順を一通りなぞった後に、私が引っかかったポイントについてまとめていこうと思います。

# 公式のステップに則った手順
## ステップ 1: Lambda 関数を作成する
+  Lambdaのページに行き、「関数の作成」ボタンを押す
+ 「一から作成」を選択。「関数名」に適当な名前を入力。ランタイムに「python3.9」を選択。
その他はそのままで「関数の作成」をする
![qiita_api1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/cdae0627-ea5c-46f9-60ef-f8b809e22aa6.png)


+ 以下ページを参考*にLambda関数を書く
[HTTP API の AWS Lambda プロキシ統合の使用](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html)
*ここに引っかかりポイントあったので注意です
このようにしました。

```python
import json

def lambda_handler(event, context):
    # TODO implement
    return {
        "isBase64Encoded": False,
        "statusCode": 200,
        "body": "{ \"message\": \"Hello from Lambda!\" }",
        "headers": {"content-type": "application/json"}    
    }
```

+ 書けたらデプロイをしておく
![qiita_api2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/4b93fd27-ef06-f29f-de51-e4a6ffa57a89.png)

## ステップ 2: HTTP API を作成する
+ API Gateway コンソールにサインインして「APIを構築」を押す
+ 「API タイプを選択」で「HTTP API」の「構築」を押す
+ 「統合を作成して設定」で「統合を追加」を押す
+ プルダウンから「lambda」を選択、
リージョンが目的のリージョンになっているか確認して、テキストボックスでlambda関数を検索
+ 目的の関数が選択できたら「API名」に適当な名前を入力し「次へ」を押す
+ 「ルートを設定」を確認して（何もせずに）「次へ」を押す
+ 「ステージを設定 」を確認して（何もせずに）「次へ」を押す
+ 「確認して作成」の一番下「作成」ボタンを押す

## ステップ 3: API をテストする
+ API Gateway コンソールにサインインする
+ 作成したAPI を選択
+ API の呼び出し URL をコピー
+ ブラウザのアドレスバーにペースト
+ 後ろに「/作ったlambdaの関数名」をつけて検索
(今回は「test_lambda_python」という名前にしたのでアドレスバーには「https://~~~amazon.com/test_lambda_python」と入力）
+ ページに「{ "message": "Hello from Lambda!" }」と表示されればOK！
![qiita_api4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/3cdc7b0d-82e0-66c0-8450-d1dbfa69bf72.png)


# 引っかかりポイント
## その①：Lambdaの中身、pythonで書きたい！
チュートリアル、Lambdaの中身がNode.jsで書かれてたんですね。
しかしながら使いたいのはpython！ということで関数の中身をどう書いていけばいいのか調べました。
参考になったのは以下ページです。
+ [HTTP API の AWS Lambda プロキシ統合の使用](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html#http-api-develop-integrations-lambda.response)
+ [【API Gateway】AWS Lambda統合のPythonでHello, world](https://qiita.com/baikichiz/items/2de7c4c0dcf9b051037a)

ここで注意すべきだったのが最初のAWS公式ページの「Lambda 関数レスポンス形式 2.0」を
そのままコピペするとエラー出るってところです。
以下が参考に書かれているjsonファイルそのままコピペしたものです。
```json
{
  "isBase64Encoded": false,
  "statusCode": 200,
  "body": "{ \"message\": \"Hello from Lambda!\" }",
  "headers": {
    "content-type": "application/json"
  }
}
```
よく見ると、falseのfが小文字なんですね！！！
pythonはfalseではなくFalseと書かないといけないので、これそのままだとエラーが出ます。
おかげさまでデバッグの仕方も学べました（後述）

## その②：APIの種類がいくつもあるやんけ！
ステップ2でAPI Gatewayのページにアクセスしてみて
API、3つも種類あるじゃん。。今後どれ使えばええの。。。となる方は私だけじゃないはず。
気になって前に進めなかったのでとりあえずAWS公式のものを読んでみる
+ [API Gateway のユースケース](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-overview-developer-experience.html)

わからない部分も多かったので以下なども参照
+ [Amazon API Gatewayは「HTTP API」と「REST API」のどちらを選択すれば良いのか？ #reinvent](https://dev.classmethod.jp/articles/amazon-api-gateway-http-or-rest/)
+ [AWS API Gatewayを使うメリット4つ｜主な機能も紹介](https://www.fenet.jp/aws/column/aws-beginner/317/)

Websocketと、REST・HTTPは働きが違いそうということ
HTTPはRESTの簡単版でかつ新しいものetcだということをざっくり理解しました。

## その③：そうなってくるとREST APIも使ってみたくない？？
と、なったので、REST APIも使ってみました。
チュートリアルがあったので、これのAPIの構築部分を参考に進めてみます。
[チュートリアル: Lambda プロキシ統合を使用した Hello World REST API の構築
](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html)

+ API Gateway コンソールにサインイン
+ 「APIを作成」→REST APIの「構築」を押す
+ 「プロトコルの選択」「新しいAPIの作成」はデフォルトのままで
「API名」に適当な名前を入力し
「エンドポイントタイプ」が「リージョン」になっていることを確認して「APIの作成」を押す
![qiita_api5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/7d7775e5-15fc-8863-5dd8-7aaf33641447.png)

+ 開いたページの「リソース」で「/」を選択（青くなっていれば選択できている）
![qiita_api6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/7b7d2240-1fbb-0374-d2ae-9e6d1675376f.png)

+ 「アクション」 プルダウンから 「リソースの作成」を選択
![qiita_api7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/0e4a8812-617e-6ade-228a-44f8faf2ae29.png)

+ 「プロキシリソースとして設定」 チェックボックスはオフのまま、
「リソース名」に適当な名前を入力（今回は「test」）
「リソースパス」はいじらずそのまま （今回は/test）
「API Gateway CORS を有効にする」チェックボックスはオフのまま
「リソースの作成」を押す
![qiita_api8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/a73b3ed9-4a32-b51a-b411-8484089a2960.png)

+ 作ったリソース（今回は「/test」）が選択されていることを確認
![qiita_api9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/0c8514ca-edf9-b20c-e543-b942cd3dc8b1.png)

+ 「アクション」プルダウンから「メソッドの作成」を選択
![qiita_api10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/0b00ae66-9252-d0a5-5c6d-dca26257f8d6.png)

+ 出てきたプルダウンから「ANY」を選択、選択すると横にチェックマーク出てくるのでそれを押す
![qiita_api11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/69110788-b1a4-a2cb-a5ac-54015ee492b7.png)

+ 「統合タイプ」を「Lambda関数」
「Lambdaプロキシ統合の使用」にチェック
リージョンを目的のリージョンに合わせて
作ってたLambda関数をテキストボックスで検索（今回は「test_lambda_python」）
「デフォルトタイムアウトの使用」チェックボックスをオンのままにして「保存」を押す
![qiita_api12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/708b1823-f359-29ff-0995-d2007e151947.png)

+ 「Lambda 関数に権限を追加する」のポップアップが出てくるので「OK」を押す
+ 「アクション」プルダウンから「APIのデプロイ」を選択
![qiita_api13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/5e0a4cdf-a45e-b14b-b24f-856c00b7cca9.png)
+ 「APIのデプロイ」ポップアップが出てくるので
「デプロイされるステージ」に「新しいステージ」を選択
「ステージ名」に適当な名前を入力（今回は「test」とした）して「デプロイ」を押す
![qiita_api14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/5d20e6c5-b9c5-9fa1-f663-912d8e7bcde9.png)
+ 変わった次の画面で出てくるURLをコピーしておく
![qiita_api15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/393f574d-3f11-4ab6-fae8-e1ec0eaf9c17.png)

+ アドレスバーにコピーしたURLを張り付け、最後に「/リソース名（今回は「test」、ステージ名と一緒にしたらわかりづらくなった）」を追加し検索。（https://~~~amazonaws.com/test/testとなる）
+ 以下のように表示されたらOK！
![qiita_api4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/ba5acb71-da60-3ef2-b9d7-10cd6085d6d5.png)

これでREST APIの設定はOKです。

## その④：デバッグの仕方
Falseをfalseのまま実行すると、「{"message":"Internal Server Error"}」というメッセージが表示されます。
調べてみると公式に問題そのもののデバッグの仕方が書いてありました。
[HTTP API Lambda 統合に関する問題のトラブルシューティング](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/http-api-troubleshooting-lambda.html)

これはもうこのまんまの手順に則って、CloudWatchの設定してログを見てみたら一発解決しました。
"false"が定義されていないよ、的なエラーメッセージが出てました。
ありがとうわかりやすい解説！

# おわりに
苦戦しつつもAPI Gateway⇔Lambdaを試すことができました。
引っかかった分だけ勉強になってると信じて、引き続き手を動かしていけたらと思います。