Lambdaでお手軽サーバーレス入門（API Gateway設定編）

初めての記事 [Lambdaでお手軽サーバーレス入門（とりあえず作ってみる編）](https://qiita.com/kakken1988/items/29ec13228f1398f40fec)で作った関数を、API Gateway経由で呼び出してみます。
これで、Webアプリなり、モバイルアプリなり、好きなところから呼び出しができます。

# 一番気をつけたい制約事項

制約事項があるのはお決まりですが、API Gatewayの一番大きな制約事項は個人的にはこれだと思ってます。

**29秒勝負！**

前回触れなかったですが、Lambdaには実行時間の設定ができます。
範囲は1秒〜300秒（5分）の間で好きなように選べます。
これによって、少し時間がかかる処理もなんとかなるのですが…

**API Gatewayはせっかち！**

例えば、最大300秒の設定をしているある関数の実行に60秒かかったとします。
Lanbdaとしては、時間制限目いっぱいまでは頑張ってくれます。
なので、この関数も実行は完了します。

ただし、API Gatewayはせっかちなので（2回目）、API呼び出し後29秒が過ぎると、関数がまだ動いていても、強制的にAPI Gatewayの応答を返してしまいます。
なので、クライアント側としては「あれ？なんでタイムアウト？」ってなるかもしれません。
なので、時間がかかりそうな処理のときは、工夫しなければいけません。
（いろいろやり方はありそうですが、私のアイデアは別記事で書きます）

これだけ抑えてもらって、ではAPI Gatewayの設定をしてみましょう。

# API Gateway management console

[こちら](https://ap-northeast-1.console.aws.amazon.com/apigateway/home?region=ap-northeast-1)よりAPI Gatewayを表示します。
![apigw01.png](https://qiita-image-store.s3.amazonaws.com/0/143240/12647688-dc93-5437-eb41-3a1bada6cbba.png)

このリージョンでは初めてのためWelcomeに飛ばされました。
Get Startedで始めましょう。

![apigw02.png](https://qiita-image-store.s3.amazonaws.com/0/143240/c3bbfc53-5128-d06a-995c-d8ddd30550c2.png)

いつのまにこんな画面が？
（注：普段手動で設定しないから驚いているだけ）

New APIを選んでみます。

* Endpoint Type
  * Regional  
    今ログインしているリージョン（例ではTokyo）で作ってくれます。  
    今（2018年9月末現在）のデフォルトです。
  * Edge Optimized  
    なんとCloudFrontで展開してくれます。  
    昔（2017年11月頃まで？）のデフォルトです。
  * Private  
    VPC内からのみ呼び出せます。アプリ内部でしか使わない、などの理由で選べそうです。

RegionalとEdge Optimized、どちらを選ぶべきなんでしょうか…？詳しい方、コメントをいただけたら嬉しいです。
今回はデフォルトのRegionalにしてみます。

![apigw03.png](https://qiita-image-store.s3.amazonaws.com/0/143240/588f94ef-0163-1fcf-4715-58c155cc3067.png)

右下のCreate APIを押すと作成できます。
![apigw04.png](https://qiita-image-store.s3.amazonaws.com/0/143240/ce40c7e5-67ef-fe8a-1958-68e0fa55984e.png)

できました。
ただ、まだ定義がないので空っぽです。
ここに、API定義を追加していきます。

## APIの追加

上のActionsから、Create MethodやCreate Resourceが選べます。
これらの違いは…

* Create Method  
リソースの下に、メソッド（GETやPOSTや）を作ります。
* Create Resource  
さらに細かいリソースをつくれます。その下には、さらにリソースも作れますし、メソッドも作れます。

今回は一つリソースを作ってみて、そのしたにメソッドを作ってみます。

### Create Resource

Actions -> Create Resourceをクリックします。

![apigw05.png](https://qiita-image-store.s3.amazonaws.com/0/143240/4dd5d6f5-ced1-9683-ab82-6a70f20c827c.png)

* Resource Name  
  ここは好きな名前で。
* Resource Path  
  URLになる部分です。
* Enable API Gateway CORS  
  これにチェックを入れておくと、自動でCORS（Cross-Origin Resource Sharing）用のOPTIONSメソッドも作ってくれます。  
  Webアプリから呼び出す際に便利です。

ではCreate Resourceをクリックします。

![apigw06.png](https://qiita-image-store.s3.amazonaws.com/0/143240/109787a1-4065-ef3a-8ff3-4c60900df473.png)

できました。
先程、Enable API Gateway CORSのチェックを入れていたので、自動でOPTIONSメソッドを作ってくれています。
（あれ、Resource Nameはどこへ…？）

では、今回はGETとPOSTの2つのメソッドを定義してみます。

### Create Method

同じくActionsメニューから、Create Methodをクリック。

![apigw07.png](https://qiita-image-store.s3.amazonaws.com/0/143240/1741b7ae-186b-c5a8-64d6-7f30b7340110.png)

真ん中ペインのツリーに、コンボボックスが現れました。
ここでメソッド選んで、✔をクリックします。

![apigw08.png](https://qiita-image-store.s3.amazonaws.com/0/143240/4f638df9-4ee7-7ef7-a33c-a6d1863808ac.png)

なにやらオプションがいっぱい…
ここでは、Lambdaから呼び出したので、Integration typeはLambdaにします。

Use Lambda Proxy Integrationというオプションがありますが、オンにすることをおすすめします。
たくさんのイベントを取得できます。
（そのかわり、戻り値にもルールがあります）

Lambda Functionには、例で作った `hello-world-py3` を入力します。
名前は補完してくれます。

Use Default Timeoutはオンにしておくと、最大の29秒（29000 milliseconds) で処理してくれます。
オフにすると、自分で選べます。短くすることはできますが、29秒より長くすることはできません。

![apigw09.png](https://qiita-image-store.s3.amazonaws.com/0/143240/68700907-7f4a-c262-cf59-a4fbca21702a.png)

Saveで保存します。
![apigw10.png](https://qiita-image-store.s3.amazonaws.com/0/143240/dba3342a-7b09-42db-1e7b-2d74d7a9629f.png)

何やらダイアログが出ますが、これは「指定したLambdaを呼び出すために、API Gatewayに権限を与えますよ。」ということなので、素直にOKします。

![apigw11.png](https://qiita-image-store.s3.amazonaws.com/0/143240/01f20eba-bf67-7b03-a962-3be25618145b.png)

GETメソッドができました。

### POSTメソッドも作る

同じノリでPOSTも作れます。
![apigw12.png](https://qiita-image-store.s3.amazonaws.com/0/143240/cbdcfe0a-d8c4-19cf-8fa2-8e5fdce4fa91.png)


# 次回予告

長くなりそうなので続きは別記事に書きます。
次回：[Lambdaでお手軽サーバーレス入門（Lambdaのイベント from API Gateway編）](https://qiita.com/kakken1988/items/e4d92395f17c95a31e24)