[AWS]Lambda + API Gateway でモックAPIを作る

Lambda + API Gateway でモックAPIを作成してみたのでメモ

リージョン：東京

# Lambda
Lambda公式

https://aws.amazon.com/jp/lambda/

## Lambdaを作成する

[Lambdaの画面](https://ap-northeast-1.console.aws.amazon.com/lambda/home?region=ap-northeast-1#/functions) から、関数の作成を選択

![スクリーンショット 2021-03-30 19.48.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855610/1d7eed8f-da02-cabe-3f55-edfd85099ca8.png)

### 関数の作成

* エンジンのタイプ ： 一から作成

![スクリーンショット 2021-03-30 19.52.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855610/9f21d4d7-e7c4-2259-2006-00e8738493d4.png)

### 基本的な情報

以下を入力し、関数の作成を選択

* 関数名 : test
* ランタイム : Node.js 14.x
* 実行ロール : AWS ポリシーテンプレートから新しいロールを作成
* ロール名 : testRole
* ポリシーテンプレート - オプション : 空白

![スクリーンショット 2021-03-30 19.56.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855610/b310da6e-cd2f-0349-745e-f4d77c874859.png)

### 関数の完成
これで関数が完成しました。雛形が表示されているので確認してみます。
コードソースから、 index.js を選択

![スクリーンショット 2021-03-30 19.57.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855610/cb6d81ce-9770-160d-06ce-78036b69ed2b.png)


```javascript
exports.handler = async (event) => {
    // TODO implement
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};
```

ステータスコード200と、簡単な文字列を返却するサンプルコードが記述されています。
次はAPI GatewayからこちらのLambda関数を呼び出してみます。

# API Gateway
API Gateway公式

https://aws.amazon.com/jp/api-gateway/

## API Gatewayを作成する

[API Gatewayの画面](https://ap-northeast-1.console.aws.amazon.com/apigateway/main/apis?region=ap-northeast-1) から、APIを作成を選択

![スクリーンショット 2021-03-30 19.41.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855610/270c89c8-bf8a-39d0-dc22-1e158933f0cb.png)

### API タイプを選択

以下から選択できます。今回は `REST API` で構築を選択

* HTTP API
* WebSocket API
* REST API

![スクリーンショット 2021-03-30 19.41.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855610/d13f5e64-e2fd-11a7-8ac3-0af6a771ea20.png)

### 新しいAPIの作成 / 名前と説明

以下のように選択し、APIの作成を選択

* 新しいAPIの作成 : 新しいAPI
* API名 : test
* 説明 : テスト用モックAPI

![スクリーンショット 2021-03-30 19.44.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855610/cd860fb3-a980-edbe-eb24-02f7cc456b84.png)

### リソースの追加

現状は何もリソースがない状態なので追加します。アクション → リソースの作成を選択

![スクリーンショット 2021-03-30 20.05.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855610/08906ca8-25b4-1e30-fb73-f85d9f6fc9d3.png)

以下のように設定し、リソースの作成を選択

* プロキシリソースとして設定する : チェックしない
* リソース名 : test
* リソースパス : test
* API Gateway CORS を有効にする : チェックしない

![スクリーンショット 2021-03-30 20.05.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855610/4f5da434-3df7-dd28-3285-62602a24af95.png)

### メソッドの追加

リソースは追加できましたが、メソッドがない状態なので追加します。アクション → メソッドの作成を選択

![スクリーンショット 2021-03-30 20.12.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855610/9fd636f6-57ed-46c3-b497-4b21ea624655.png)

今回はGETメソッドを作ってみます。
表示されたプルダウンからGETを選択し、以下を入力し保存を選択

* 統合タイプ : Lambda 関数
* Lambda プロキシ統合の使用 : チェックを入れる
* Lambdaリージョン : ap-northeast-1
* Lambda関数 : test
* デフォルトタイムアウトの使用 : チェックを入れる

![スクリーンショット 2021-03-30 20.14.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855610/2f8bbc5c-0853-7c03-6fdb-ae57d4fd8a24.png)

これで API Gateway と Lambdaの連携ができるようになりました！

![スクリーンショット 2021-03-30 20.16.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855610/14755f35-46e2-7d64-c11b-65592bad7d62.png)

### APIのデプロイ

APIをデプロイします。 アクション → APIのデプロイを選択

![スクリーンショット 2021-03-30 20.16.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855610/7c42e833-e248-f730-8519-156fc90bf4b7.png)

デプロイするステージを選択します。今回は初回なので、新規に作成していきます。
以下を入力し、デプロイを選択

* デプロイされるステージ : [新しいステージ]
* ステージ名 : test
* ステージの説明 : test
* デプロイメントの説明 : 空白

![スクリーンショット 2021-03-30 20.17.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855610/3cc3d583-ad04-056d-28a5-93b66421aa1b.png)

デプロイしたので、URLの呼び出し欄にURLが表示されます。

![スクリーンショット 2021-03-30 20.22.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855610/e2af446a-1734-c15a-e85d-880c174f889c.png)

今回追加したリソースパスの /test を呼び出したいので `[表示されたURL]/test` でアクセスしてみます。

![スクリーンショット 2021-03-30 20.25.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855610/d7fc88ea-15de-226f-a142-78d1b8d252bc.png)

先ほどのLambdaに設定されていた文字列が表示されました！
これで設定完了です。

# JSONモックにする
JSONを返せるようにしてみます。
設定は完了しているので、あとはLambda側を編集するだけでOKです。

簡単にユーザーIDとユーザー名を返すようにしてみます。

```javascript
exports.handler = async (event) => {
    let responseCode = 200;
    let responseBody = {
        status: 'success',
        user_id: 'TEST012345',
        user_name: 'tora_test'
    };
    let response = {
        statusCode: responseCode,
        body: JSON.stringify(responseBody)
    };
    return response;
};
```

編集したら、Deployボタンを押し忘れないようにしましょう。

![スクリーンショット 2021-03-30 20.29.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855610/e2a70ff4-d1a3-992a-a6d3-291b1c129a51.png)

再度確認し、設定したJSONが返ってきたら完成です。

![スクリーンショット 2021-03-30 20.30.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855610/e0d0ce16-1568-0165-bd21-06576b390e92.png)