API Gateway + LambdaでREST API開発を体験しよう [10分で完成編]

# 🔷 はじめに

今回は、AWSのAPI GatewyとLambdaで、REST APIの作成を行います。
手順に沿って行うだけで、10分もかからずAPIが作成できます。

## 🔶 API Gatewy
[https://aws.amazon.com/jp/api-gateway/](https://aws.amazon.com/jp/api-gateway/)
REST APIをノンコーディングで製造、管理ができるサービス。
ただし、作れるのはAPIの入り口部分までで、APIがリクエストを受けた後の具体的な処理は、別に用意する必要があります。
今回は、処理はLambda関数を使用します。

## 🔶 Lambda
[https://aws.amazon.com/jp/lambda/](https://aws.amazon.com/jp/lambda/)
様々な言語のコードをデプロイできる実行環境。
コードは、様々なAWSプロダクトで発生したアクションをトリガーに実行する事ができます。
今回は、「API Gatewayへのリクエスト」をトリガーに、コードを実行します。

# 🔷 作業手順

今回は、GETメソッドのAPIを作成します。
1. Lambdaで、APIの内部処理を担当する関数を作成する。
2. API Gatewayで、REST APIを作成して、Lambda関数を繋げて、APIを完成させる。

## 🔶 Lambda関数の作成

まずは、以下にアクセスして、Lambda関数を作成します。
[https://aws.amazon.com/jp/lambda/](https://aws.amazon.com/jp/lambda/)

1\. Lambdaを開いたら、[関数の作成] ボタンをクリックします。
<img width="1157" alt="l00.png" src="https://qiita-image-store.s3.amazonaws.com/0/38099/5c0cdf23-1d2b-4a99-1dd9-32d58760f415.png">



2\. 「一から作成」を選択します。
<img width="1000" alt="l01.png" src="https://qiita-image-store.s3.amazonaws.com/0/38099/84f690da-1369-11d2-8e8b-0359b56dd6a1.png">
**⬛名前**
・任意の関数名を入力します。
・今回は、「helloFunction」とします。
**⬛ランタイム**
・関数は様々な言語で作成できますが、今回は`Node.js 8.10`を選択します。

3\. 続いて、今回のLambda関数の他のAWSサービスへのアクセス許可を設定します。
<img width="1000" alt="l02.png" src="https://qiita-image-store.s3.amazonaws.com/0/38099/05144991-c0b1-b46a-70b9-97fe116d220b.png">

と言っても、今回のLambda関数はAPI Gatewayから呼ばれる事はあっても、他のAWSサービスを呼ぶ用事は無いので、とりあえず動作logの書き込み先となる、CloudWatchというサービスにアクセスできるようにします。

⬛ロール
・`1つ以上のテンプレートから新しいロールを作成します。`を選択します。
⬛ロール名
・任意のロール名を入力します。
・今回は、`testRole`とします。
⬛ポリシーテンプレート
・`基本的な Lambda@Edge のアクセス権限(CloudFront トリガーの場合)`を選択します。
・このテンプレートには、CloudWatchへのアクセス権限が含まれているので、今回作成したロールが付与されたサービスは、CloudWatchにログを出力できるようになります。

一通り入力したら、 [関数の作成] ボタンをクリックします。
すると、以下のようなサンプル関数が生成されます。
<img width="1000" alt="l03.png" src="https://qiita-image-store.s3.amazonaws.com/0/38099/2780ffa0-6a5a-721a-d99c-a69d8abc7e94.png">  
今回は、このサンプルをそのまま使います。

簡単にサンプルの処理を説明すると、API Gatewayで作成したAPIがリクエストを受けると、Lambda関数が呼ばれて、そのリクエスト情報一式が1行目の`event`に渡されます。
`event`は今回は使わずに、APIには「"Hello from Lambda!"という文字列をレスポンスとして返すように」という指示を、処理結果として返します。

## 🔶 API Gatewayで、REST APIを作成

まずは、以下にアクセスして、APIを作成します。

[https://aws.amazon.com/jp/api-gateway/](https://aws.amazon.com/jp/api-gateway/)

1\. API Gatewayの設定画面を開きます。
<img width="1016" alt="a00.png" src="https://qiita-image-store.s3.amazonaws.com/0/38099/c2eca420-aefa-dabb-ffae-97754542d149.png">  
APIのタイプは`REST`で、作成方法は`新しいAPI`がデフォルトで選択されているので、そのままにします。

**⬛API名**
・任意のAPI名を入力します。
・今回は、「hello API」とします。

入力したら、[APIの作成] ボタンをクリックします。

2\. hello APIが作成されます。まずはエンドポイントを作成します。
[アクション]→[リソースの作成]をクリックします。
<img width="1017" alt="a01.png" src="https://qiita-image-store.s3.amazonaws.com/0/38099/411f7563-96f5-4e42-10a0-b0f095ffd105.png">

リソース作成画面が表示されます。
<img width="1270" alt="a02.png" src="https://qiita-image-store.s3.amazonaws.com/0/38099/adad5366-38cf-99f4-f814-6d9159a1b48e.png">

**⬛リソース名**
・任意のリソース名を入力します。
・今回は、「test」とします。
**⬛API Gateway CORS を有効にする**
・チェックを入れると、testリソースの作成と共に、optionメソッドのエンドポイントが作成されます。
・ブラウザからAPIを利用できるように、チェックを入れます。

入力したら、[リソースの作成] ボタンをクリックします。

3\. testリソースに、GETメソッドのエンドポイントを作成します。
[アクション]→[メソッドの作成]をクリックします。
<img width="1268" alt="a03.png" src="https://qiita-image-store.s3.amazonaws.com/0/38099/4959b141-d00c-aa36-aef7-b28c147797d3.png">

「GET」を選択してチェックをクリックします。
<img width="1270" alt="a04.png" src="https://qiita-image-store.s3.amazonaws.com/0/38099/84f49b86-9ac6-7414-60f1-ed548eac01c8.png">

4\. GETメソッドのエンドポイントがリクエスト受けた時、どのように処理するか設定します。
<img width="1269" alt="a05.png" src="https://qiita-image-store.s3.amazonaws.com/0/38099/7245828d-6b44-523e-2f51-8412370b28ac.png">  
他のAPIにリクエストを渡したり、モックとして固定値を返したり、色々できますが、今回はLambda関数に処理を渡しますので、統合タイプは`Lambda関数`のままにします。

**⬛Lambda プロキシ統合の使用**
・チェックを入れると、このエンドポイントに対するリクエスト情報一式を、Lambdaの`event`変数（後述）に渡します。
・必ずチェックを入れます。
**⬛Lambda関数**
・このエンドポイントに対するリクエストがあった時、呼び出すLambda関数を設定します。
・先ほど作成した、`helloFunction`を設定します。

入力したら、[保存] ボタンをクリックします。

すると、以下のように「API GatewayからLambda関数を呼び出す権限を与える」旨のメッセージが表示されるので、［OK］ ボタンをクリックします。
<img width="906" alt="a06.png" src="https://qiita-image-store.s3.amazonaws.com/0/38099/cd2b322e-51af-3a28-5e21-e03cbe70abb9.png">  
これで、hello APIから、helloFunctionを呼び出せるようになりました。
Lambda関数の画面を開いて、以下のようにLambda関数を呼び出すトリガーとして、API Gatewayが設定されている事を確認します。
<img width="1265" alt="a07.png" src="https://qiita-image-store.s3.amazonaws.com/0/38099/5622d6b2-63af-a8e3-7901-394634129d82.png">

## 🔶 hello APIのテスト

1\. hello APIを使えるようにデプロイします。
[アクション]→[APIのデプロイ]をクリックします。
<img width="1267" alt="d01.png" src="https://qiita-image-store.s3.amazonaws.com/0/38099/0f9daedb-8f0a-c0df-e979-44f012b0078f.png">  

2\. どこにデプロイするか設定します。
<img width="604" alt="d02.png" src="https://qiita-image-store.s3.amazonaws.com/0/38099/93d668e4-6b12-0f31-53a7-a25461a42373.png">  
**⬛デプロイされるステージ**
・「[新しいステージ]」を設定します。
**⬛ステージ名**
・任意のステージ名を入力します。
・今回は、「production」とします。

入力したら、[デプロイ] ボタンをクリックします。

3\. productionステージにデプロイされます。
ツリーのGETメソッドのエンドポイントを選択すると、エンドポイントのURLが表示されます。
<img width="1268" alt="d03.png" src="https://qiita-image-store.s3.amazonaws.com/0/38099/c4aee3f4-12d6-4e39-21ce-87fc1963eb42.png">

4\. URLをクリックして、APIにリクエストを送ってみます。
<img width="576" alt="d04.png" src="https://qiita-image-store.s3.amazonaws.com/0/38099/05dcc7e5-f4d1-5a94-a15f-0d474d80bbc5.png">  
Lambdaで設定した、`Hello from Lambda!`という文字列がレスポンスとして返ってきました。

このように、API Gateway + Lambdaを使えば、簡単にREST APIを作成する事ができます。

# 🔷 まとめ
今回はLambda関数は単純な文字列を返すだけのサンプルを使いましたが、具体的な処理を実装する事で、実際に使えるAPIを簡単に作る事ができます。
色々試してみてください。