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

# はじめに
前回以下の記事でAPI Gatewayを使ってMock APIを作成しました。
[Amazon API Gateway × AWS Lambdaでサーバーレスアーキテクチャ（１）](http://qiita.com/saitoxu/items/7305d946390aeefb9431)

次はLambda Functionを作成して、前回作成したAPI Gatewayと連携させてみます。

# 作るもの
API Gateway経由でLambdaを呼び出す簡単なREST APIを作成します。

# 手順
手順はざっと以下のようになります。

1. Lambda用のIAMロールを作成する
2. Lambda Functionを作成する
3. API GatewayとLambdaの連携

では順に見ていきましょう！

## 1. Lambda用のIAMロールを作成する
Lambda Functionを作成するにはAWSのIAMロールを何かしら指定する必要があるので先に作ります。

1.1. IAMのコンソールを開いて新しいロールの作成をクリックします。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/17731/aa587ae4-db24-530d-1ddc-c0ad55feb900.png)

1.2. ロール名を適当に入力して次に進みます。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/17731/2b3920bc-afc2-7b9d-fa75-86afbf970efc.png)

1.3. ロールタイプにAWS Lambdaを選択して次に進みます。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/17731/52cebbaa-b138-9be9-b96e-54293dd5c815.png)

1.4. ポリシーのアタッチでは今回特に他サービスとの連携などはないのでそのまま何も選択せず次に進みます。

1.5. 最後にロールの作成をクリックして終わりです。

## 2. Lambda Functionを作成する
次にLambda Functionを作成します。
今回はもともと用意されているテンプレを使ってサクッと作ります。

2.1. Lambdaのコンソールを開き、Create a Lambda functionをクリックします。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/17731/d6468e90-0684-3d0a-13b6-dac64bd50212.png)

2.2. RuntimeをNode.jsにして、hello-worldのテンプレを選択します。ここは他のRuntimeなりBlueprintなり適宜変更してください。
![6.png](https://qiita-image-store.s3.amazonaws.com/0/17731/02b3251c-d965-961f-e043-a039f43f7502.png)

2.3. トリガーにはAPI Gatewayを選択し、前回作成したAPIとステージを選択します。セキュリティは今回は簡単のため、アクセスキーがあればOKとします。
![7.png](https://qiita-image-store.s3.amazonaws.com/0/17731/6113d85f-d23a-4ed3-7113-82a6958d276d.png)

2.4. functionの設定では名前と説明を適当に入力し、ロールには先ほど作成したIAMロールを選択します。
※先にロールを作らなくてもここで新しく作成できました。
![8.png](https://qiita-image-store.s3.amazonaws.com/0/17731/89715940-19c7-9897-14c0-58c6f41a0507.png)

![9.png](https://qiita-image-store.s3.amazonaws.com/0/17731/9bc8e649-a8df-52d8-06fd-b7daa4226134.png)

2.5. 次に進んで、設定内容を確認してOKだったら作成してください。

2.6. ここまでできたら一回テストしてみます。作成したfunctionを選択し、Testを実行してみてください。入力はデフォルトのままで良いです。

```json
{
  "key3": "value3",
  "key2": "value2",
  "key1": "value1"
}
```

すると以下の結果が得られると思います。
![10.png](https://qiita-image-store.s3.amazonaws.com/0/17731/0333f21d-1e43-5253-3da4-37610eefcfdf.png)

## 3. API GatewayとLambdaの連携
では最後に前回作成したAPIからLambdaを呼ぶように設定します。

3.1. API Gatewayのコンソールから前回作成したAPI -> リソース -> メソッドを選択します。そこで前回Mockにしておいた統合リクエストを選択します。
![11.png](https://qiita-image-store.s3.amazonaws.com/0/17731/70184712-6bad-9e18-02ca-914acf07b4e2.png)

3.2. 統合タイプをLambdaにして、先ほど作成したLambda関数を選択し保存します。
![12.png](https://qiita-image-store.s3.amazonaws.com/0/17731/6de5dfba-b909-43c9-079e-4a92fb6f6c64.png)

3.3. ではメソッドのテストをしてみましょう。Lambdaのときと同じ入力をAPI Gateway経由で送ってみます。先ほどと同じ結果が返ってくればOKです。
![13.png](https://qiita-image-store.s3.amazonaws.com/0/17731/5d42b7f8-1fdd-b8ad-6e2e-3031443d162e.png)

3.4. 最後にアクションからAPIのデプロイも忘れずに行ってください。
3.5. デプロイできたら`curl`でも確認しましょう。

```bash
$ curl https://abcdefghij.execute-api.ap-northeast-1.amazonaws.com/test/test \
% -d '{"key3":"value3","key2":"value2","key1":"value1"}' \
% --header "x-api-key:abcdefghijklmnopqrstuvwxyzabcdefghijklmn"
"value1"%
```

# おわりに
以上、簡単ですがAPI GatewayとLambdaの連携方法を紹介しました。
サーバのメンテナンスが不要になる上に、負荷に応じて自動でスケーリングしてくれるのでだいぶ便利かなと思います。
これから積極的に使っていきたいです。

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