Amazon API Gateway × AWS Lambdaでサーバーレスアーキテクチャ（１）

# はじめに
仕事でAmazon API GatewayとAWS Lambdaを使って
計算用REST APIを作ることになったので、その手順をまとめます。

# 作るもの
一番最初はAPI Gatewayだけを使って、
`POST`したらステータスを返すだけの単純なMock用APIを作成します。
ここから順に発展させていく予定です。

# 手順
ざっくりした手順は以下の通りです。

1. APIを作成する
2. リソースを作成する
3. メソッドを作成する
4. APIキーを作成して認証設定を行う

## 1. APIを作成する
最初にAPIを作成します。
これはサービスごとに作成すると良いと思います。

1. AWS Consoleにログインし、Amazon API Gatewayの画面を開きます。
2. APIの作成ボタンをクリックします。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/17731/fe308c4f-1cb0-70ff-0076-bcbd46a9fbd2.png)
3. API名を入力して、APIの作成をクリックします。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/17731/9d8008f1-ddce-450e-645e-eb6df7681e38.png)

## 2. リソースを作成する
次にリソースを作成します。

1. 先ほど作成したAPIを選択し、アクションタブからリソースの作成を選択します。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/17731/06a05efe-14f9-11f0-0c69-a08f6af8281a.png)
2. リソース名とリソースパスを入力し、リソースの作成をクリックします。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/17731/e975d5f0-bc8f-c878-37fc-9ee04d51fd81.png)

## 3. メソッドを作成する
次にリソース毎に`GET`や`POST`などのメソッドを作成します。

1. 先ほど作成したリソースを選択した状態で、アクションタブからメソッドの作成を選択します。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/17731/ac59e020-0de0-9050-dc06-b754d591b9cd.png)
2. するとリソース名の下にドロップダウンが表示されるので、適当にHTTPメソッドを選択します。以下のような画面になると思いますので、メソッド名を選択してください。

![6.png](https://qiita-image-store.s3.amazonaws.com/0/17731/3b8b7ca3-a2d7-7ad5-1cae-18d691b7766a.png)
3. とりあえずAPI Gatewayの確認をしたいので、結合タイプではMockを選択します。後でAWS Lambdaを用意したらここを変更します。

![7.png](https://qiita-image-store.s3.amazonaws.com/0/17731/92c1ce8f-e9a9-cd28-5679-250674d7d776.png)
4. ここまでできたら一度動作確認してみましょう。アクションタブからAPIのデプロイを選択してください。すると以下のような画面になるので、ここで新しくステージを作成し、適当なステージ名を入力してください（ステージはプロダクションやステージングなどの環境の切り分けに使います）。その後デプロイを実行してください。

![8.png](https://qiita-image-store.s3.amazonaws.com/0/17731/9577df29-c031-b269-8526-92aa528a1d14.png)
5. デプロイできたら左ペインでステージを選択し、作成したメソッドを選択しましょう。以下のようにURLが表示されると思います。

![9.png](https://qiita-image-store.s3.amazonaws.com/0/17731/370f6c15-939b-8ed6-3254-9c765848d111.png)
6. `curl`で以下のようなコマンドを叩いてみましょう。ステータス`200 OK`が返ってくればOKです。

```bash
$ curl -v https://abcdefghij.execute-api.ap-northeast-1.amazonaws.com/test/test \
% -d "" -H "Content-Type: application/json"

...

< HTTP/1.1 200 OK
< Content-Type: application/json
< Content-Length: 0
< Connection: keep-alive

...
```

## 4. APIキーを作成して認証設定を行う
このままだとセキュリティがザルなので、せめてAPIキーで認証を行いたいと思います。

1. 左ペインでAPIキーを選択し、アクションタブからAPIキーの作成を選択します。

![10.png](https://qiita-image-store.s3.amazonaws.com/0/17731/55030a04-8208-e8a4-f4e2-1167ed8b9404.png)
2. APIキーはステージ環境と紐付ける必要があります。先ほど作成したAPIとステージを選択して追加してください。

![11.png](https://qiita-image-store.s3.amazonaws.com/0/17731/4d9cb40f-4c55-21d0-b06c-1b6811bc4b62.png)
3. 最後にリソースに戻ってメソッドを選択し、APIキーの必要性をtrueにしましょう。これで設定は終わりです。

![12.png](https://qiita-image-store.s3.amazonaws.com/0/17731/f1cf242d-50af-95aa-1f8e-74cf4f2dc8de.png)
4. APIキーでバリデーションできているか確認しましょう。APIキーなしで叩いてみると、`403`が返ってきて、ありだと正しく`200`が返ってくるのが確認できます。

```bash
$ curl -v https://abcdefghij.execute-api.ap-northeast-1.amazonaws.com/test/test \
% -d "" -H "Content-Type: application/json"

...

< HTTP/1.1 403 Forbidden
< Content-Type: application/json
< Content-Length: 24
< Connection: keep-alive

...

{"message": "Forbidden"}%
$ curl -v https://abcdefghij.execute-api.ap-northeast-1.amazonaws.com/test/test \
% -d "" -H "Content-Type: application/json" \
% --header "x-api-key:abcdefghijklmnopqrstuvwxyzabcdefghijklmn"

...

< HTTP/1.1 200 OK
< Content-Type: application/json
< Content-Length: 0
< Connection: keep-alive

...
```

# おわりに
今回は、API GatewayでMock APIを作成しました。
次は簡単なLambda Functionを用意して、API Gatewayと繋いでみます。

# おまけ
Qiitaとは別で個人の技術ブログも書いてるので、良かったら見てください！
[Yosuke Saito's Blog](http://saitoxu.io/blog)