SwaggerHub から Amazon API Gateway と AWS Lambda を作成する


参考
------------

こちらの動画を参考にやってみる。

https://youtu.be/qsTKxD7pkPk

<iframe width="420" height="315" src="https://www.youtube.com/embed/qsTKxD7pkPk" frameborder="0" allowfullscreen></iframe>


SwaggerHub を使うことで以下のことができるようになるのがよさそう

- Amazon API Gateway が作成できる
- AWS Lambda も作成できる
- 最終的にはドキュメントが作成されている
	- ドキュメントから API を実行できるので動作も確認できちゃう





学習の目的・モチベーション
------------


* 普段はインフラエンジニアなので、個人的になにかプログラミングしてもしばらく触らないと何を書いてたのかよくわからなくなる。なのでドキュメントも一緒に作れたら最高なんじゃないか
* Swagger + Amazon API Gateway & Lambda の良さを確認
* Serverless Framework とどっちが使い勝手良さそうか
* 何も作ってみるか
	* cloudsearch 上に登録してあるアイテムを検索する
	* だいたいこんな感じで
		* 全件
			* GET https:/(url)/v1/items/
		* カテゴリに一致するアイテム
			* GET https:/(url)/v1/items/{category}/
		* １アイテム
			* GET https:/(url)/v1/items/{category}/{itemid}
	* 今回は v1/items/ だけとりあえず作ってみる



id	|name	|category
--- |---|---
1	|item1	|[shoes, sports, running]
2	|item2	|[fasion, shoes]
3	|item3	|[food, meat]
4	|item4	|[food, fish]

前提
-------


* AWSアカウント
	* IAM作成する権限持っている
	* Lambda作成する権限
	* Cloudsearch作成する権限
* SwaggerHub
	* アカウント作成済み
* さっとSwaggerHubの動画は見た



(復習)HTTPメソッド
----------------------

RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content
https://tools.ietf.org/html/rfc7231#section-4.3


Method     |説明
----       |----------
GET        |リソースの取得
HEAD       |メタ情報の取得
POST       |リソースの作成
PUT        |リソースの更新
DELETE     |リソースの削除
CONNECT    |クライアントとサーバ間にトンネルを確立
OPTIONS    |サーバがサポートしているメソッドを応答
TRACE      |動作をトレース




Swaggerはどう書けばいいか
------------------

http://swagger.io/specification/#pathsObject
http://swagger.io/specification/#pathItemObject

マニュアルにしっかりかいてある。
新しい言語を覚えるよりはコストはかからないけど、たくさんかける分それなりのコストはあるような気はする。


SwaggerHub上でAPIを新規作成
----------------


![0001.png](https://qiita-image-store.s3.amazonaws.com/0/17518/aa71443d-a644-5f0a-bbfe-3906d78b83d1.png "0001.png")

`Create a New API` をクリック

![0002.png](https://qiita-image-store.s3.amazonaws.com/0/17518/79b06793-3fe5-1d83-4f19-68ace0724571.png "0002.png")

Name, Version, Title, Description, Visibility を設定して
`Create API` をクリック



小さく書いてこんな感じ

```yaml:swagger
swagger: '2.0'
info:
  version: 0.0.1
  title: test shop api
  description: test shop api
basePath: /v1
paths:
  /items:
    get:
      responses: 
        200:
          description: ok
        404:
          description: item not found
        405:
          description: invalid input

```






API Gateway を作成してみる
------------------


### IAM ユーザー

swaggerHub から AWS を操作するために
* ユーザー swaggerhub-user を作成する
	* Policy を付与しておく
		* `AmazonAPIGatewayAdministrator`
		* `AWSLambdaFullAccess`
* ロール swaggerhub-lambda を作成しておく
	* Policy を付与しておく
		* `AWSLambdaFullAccess`
	* ARN をメモしておく


### SwaggerHub 設定 (Manage Integrations)

![1003.png](https://qiita-image-store.s3.amazonaws.com/0/17518/16e213ba-6156-5f9a-4c15-4638ab73abc0.png "1003.png")

`Manage Integrations` をクリック

![1004.png](https://qiita-image-store.s3.amazonaws.com/0/17518/c93b5c49-34b1-581a-3526-402908503846.png "1004.png")

`+` をクリック

![1005.png](https://qiita-image-store.s3.amazonaws.com/0/17518/f6303abd-1920-25b4-75b0-40f0769bb960.png "1005.png")


`Amazon API Gateway Lamdba Sync` を選んで `Add` をクリック

![1006.png](https://qiita-image-store.s3.amazonaws.com/0/17518/4e763cdb-0bbc-d38d-db64-a7887d8e1178.png "1006.png")

![1007.png](https://qiita-image-store.s3.amazonaws.com/0/17518/8a65ae87-5b6e-c94c-9170-e7c5f2fee84f.png "1007.png")


よしなに設定する。
`Execution role for creating non-existing Lambda Functions` には ロール swagger-lambda の ARN を入力する。
  `Create`

![1008.png](https://qiita-image-store.s3.amazonaws.com/0/17518/6760115f-6d66-fb0f-d488-4cbf28311bd5.png "1008.png")

`Save`


設定を確認する（一部設定を保存する作業アリ）
------------

![1011.png](https://qiita-image-store.s3.amazonaws.com/0/17518/ad2de6d6-9148-131d-a257-62a17ff34820.png "1011.png")

API Gateway の設定を見ると、 `itemsGET` Lamdba function をキックするようになっている。

`Integration Request` をクリック

![1011-1.png](https://qiita-image-store.s3.amazonaws.com/0/17518/db494ce6-df27-79f8-cb86-1331c029e144.png "1011-1.png")


`Lambda Function` の鉛筆マークをクリック

![1011-2.png](https://qiita-image-store.s3.amazonaws.com/0/17518/7c525be0-6633-3221-06c0-fcdd98453857.png "1011-2.png")


チェックボタンをクリック
![1011-3.png](https://qiita-image-store.s3.amazonaws.com/0/17518/ee2bbb8f-3bf1-1ab8-4248-7cfb4f8ce28b.png "1011-3.png")

`OK` ボタンをクリック



![1012.png](https://qiita-image-store.s3.amazonaws.com/0/17518/c7d35016-d2cf-4b62-0c74-206117fdc089.png "1012.png")


Lambda function はこんなかんじ

API Gateway で動作確認をする

![1013.png](https://qiita-image-store.s3.amazonaws.com/0/17518/f6e96d6a-5bc6-52e0-07c8-7dd7915987f1.png "1013.png")

`TEST` をクリック

![1014.png](https://qiita-image-store.s3.amazonaws.com/0/17518/ac0a3f79-6393-87bc-938a-0fae9a5ee6c6.png "1014.png")

`TEST` ボタンをクリック

![1015.png](https://qiita-image-store.s3.amazonaws.com/0/17518/2c99aa8f-9167-2759-40b9-c06931ad9977.png "1015.png")


Lambda function からメッセージが返ってくる




感想
------------------

今のところ Serverless Framework がしっくりきているので
偏った意見かもしれません。

* ドキュメントが作れちゃって、なおかつそのドキュメントから実行できちゃう（らしい。hostを設定するっぽい）のはいい感じ
* サーバーレス、って考えると、他のリソース（S3とかDynamoDBとか）も cloudformation のファイルで一緒に作れるServerless Framework のほうがいい感じがする
* Private だと有料
* API Gateway の Stage, Lambda の Alias で dev,stg,pro を管理したいけどできるのか？
	* Serverless Framework はそこら辺も簡単だった
* 修正するときのデプロイの流れがイメージ出来ない
	* Serverless Framework はcapistrano の task に追加しやすそうなイメージ
* `sls dash summary` でとりあえず頑張るけど Serverless Framework から swagger に（なにかを）とりこんでドキュメントができればいいなぁ