API Gatewayを環境構築しながら学ぶ

「APIを実装する」ということが良く分からなかったため
一度環境構築してみることで理解を深めた際のメモです。
AWSの無料利用枠で試してます。
- **最終目標**

AWS API Gateway と AWS Lambda で `Hello Nodejs!` を出力する

## 1. Lambda関数の作成
API Gatewayを作成する場合、API Gatewayのバックエンドを指定しないといけません。
そのバックエンドをLambda関数としたいので、その関数※を作成します。
※API Gatewayからのデータを受け取り、そのまま返すLambda関数

-  関数の作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/6ecae22d-8e8b-30a2-1400-0a27e6efaaa6.png)

> - apiGateWayTestという関数名で作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/730552c0-d92b-f476-b12f-5a6a694db05f.png)

> サンプルで自動作成された `index.js` の 'Hello from Lambda!' の部分を event に置き換えます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/5ecab666-bf20-c4c9-7dbf-3d90f2d0de85.png)

- 関数のテスト
>イベント名を入力し、右上のテストボタンを押す![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/d4b5186c-c3e0-00d3-56b6-578dc5da5167.png)テストに書いた json がそのまま出力されていたら成功
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/8062fbe4-7540-305c-bf4a-2ad8670b2fd7.png)

## 2. API Gateway で API を作成
- Amazon API Gateway のコンソールを開き、REST API の「構築」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/b0dd1f98-62f4-f50b-56f9-a73b075a3270.png)

- API の基本情報を以下のように設定して「API の作成」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/e9d55253-3de1-18e9-0379-d904e17932d3.png)

- リソース(APIのパス：今回は/test)を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/45eac8f4-5194-18ab-75a7-70e0a640008a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/e47df121-fc0f-78cf-e5fd-dfaecaafe351.png)

- リソースにメソッドを定義します。リソースの下にリストボックスが現れるので、今回は`POST`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/85147ced-c81c-2e7c-cbd5-8307fbca6f44.png)
- リソースとバックグラウンドの処理を関連付けるための、メソッドのセットアップをします。「統合タイプ」は`Lambda 関数`、「Lambda 関数」のテキストボックスは、`先ほど作成した関数の名前`とします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/25b06918-cda5-d884-16c7-4931dfa61a29.png)
- メソッドのテストをします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/46cb59a6-8bcf-8dd9-423f-18a7d3866243.png)
メソッドテストの画面に遷移したら「リクエスト本文」の欄に以下追記し、テストボタンを押します。
レスポンス本文に送信した json が表示されていたら成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/79a38503-1178-9a17-4663-0c1f699b0fbb.png)

## 3. APIキーの作成
- デプロイ前にAPIキーを作成し、APIリクエスト時に認証を行うようにします。
　メニューから「APIキー」へ移動し「アクション -> APIキーの作成」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/79b4231e-8784-cf4a-5e56-e35d1a573563.png)
API キーの情報を入力して「保存」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/35192c02-f15a-f42c-f455-b260d808a289.png)
APIキーが生成されます。ここで作成されたAPIキー情報は`6. API動作確認`にて使用します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/94dc6f05-068f-ee69-2414-1b5aead1c0b0.png)

- 作成したAPIキーをメソッドに割り当てます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/cf28cbe3-84b9-2fdf-be31-6db3f62c3f19.png)
デフォルトのfalseからtrueに変更してチェックボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/ca187de9-92fa-9e05-fb89-eadfcd82562f.png)

## 4. APIのデプロイ
- 外部からアクセスできるようにデプロイを行います。
API をデプロイすることで、エンドポイントの URL が作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/9fb7dc50-8c21-c8dc-5214-e0bfcfc04465.png)
デプロイされるステージに「新しいステージ」を選択してステージ名を入力します。ステージの説明とデプロイメントの説明の入力は任意です。入力後、「デプロイボタンを押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/a873d2df-8c24-3589-bad9-9ab67903f6ca.png)

エンドポイントURLが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/65c3aab9-4707-7339-014e-6e9ec659270b.png)

## 5. ステージとAPIキーの紐づけ
ステージで利用できるAPIキーを紐付ける必要があるので、使用量プランのページへ移動し「作成」を押します。名前を適当に入力して、「スロットリング」「クォータ」についてチェックを外して「次へ」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/bc38b766-daaa-c5a0-58f4-99cdfaa3e854.png)
「APIステージの追加」からAPIとステージを選択してチェックボタンを押し、「次へ」を押します。
使用量プランとAPIステージが紐づきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/d7f0d7d6-07cf-287e-6d23-7ed5aa45ba10.png)
「APIキーを使用量プランに追加」からAPIキーを選択してチェックボタンを押します。
使用量プランとAPIキーが紐づきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/f09f260b-3973-d80e-4324-436f661d1459.png)
ここでAPIステージとAPIキーが紐づきますので、利用可能状態となりました。

## 6. API動作確認
最後に、設定がうまくいっているかどうかを外部からのアクセスで確認します。
curlコマンドで-dオプションでPOSTのデータを指定、-Hでヘッダーを追加します。
```
$ curl -d '{ "test" : "Hello Nodejs!" }' -H 'x-api-key:<YOUR API KEY>' <YOUR API URL>
```
POSTデータに{ "test" : "Hello Nodejs!" }
\<YOUR API KEY>に作成されたAPIキー文字列
\<YOUR API URL>にAPIステージの`URLの呼び出し`
を入力します。

```
{"statusCode":200,"body":"{\"test\":\"Hello Nodejs!\"}"}
```
上記レスポンスが返ればOKです！


# 補足
6.API動作確認ですが、Windows10のコマンドプロンプトにて確認しようとしてハマりました。。
```
{"message":"Forbidden"}
```
何故か上記となり失敗。。。原因わからず。

ブラウザからPOSTメソッドを送信できるChrome拡張 [Advanced REST client](https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo/related)にて
Body部とHeader部を入力して確認しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/0a079571-fb44-fc45-d954-7ac94112bd96.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/9934215b-4f09-e741-4ff7-b361eab84779.png)

# 参考情報
- [API Gateway と Lambda で Hello World!](https://s10i.me/whitenote/post/15)
- [ブラウザからPOSTメソッドを送信できるChrome拡張「Advanced REST client」](https://www.koikikukan.com/archives/2015/12/15-000300.php)