AWS+NodeJSでサーバレスな環境構築④

# はじめに
今回は[前回](https://qiita.com/isacRU/items/b4ab67d12f2d2377aea8)の続きで、DELETE(対象ユーザーの削除), GET(全ユーザーの取得) PATCH(対象ユーザーの更新)を作っていきます。

# DELETE(対象ユーザーの削除)
指定されたidを元に、対象のユーザーが削除されるようにしていきます。
### Lambda関数の作成と設定
<img width="1284" alt="スクリーンショット 2020-01-04 15.20.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43096/a7ac28a6-f3fd-6ec6-0190-9c817fe90e79.png">

ソース

```javascript:index.js
'use strict';
const AWS = require('aws-sdk');
const myRegion = "us-east-2";

AWS.config.update({ region: myRegion});

exports.handler = async (event, context) => {
  const documentClient = new AWS.DynamoDB.DocumentClient({ region: myRegion});

  let responseBody = "";
  let statusCode = 0;

  const { id } = event.pathParameters;

  const params = {
    TableName: "Users",
    Key: {
      id: id
    }
  };
  
  try {
    const data = await documentClient.delete(params).promise();
    responseBody = JSON.stringify(data);
    statusCode = 204;
  } catch (err) {
    responseBody = `Unable to delete user: ${err}`;
    statusCode = 403;
  }

  const response = {
    statusCode: statusCode,
    headers: {
      "Content-Type": "application/json"
    },
    body: responseBody
  };

  return response;
};
```
### メソッド作成と設定
<img width="1184" alt="スクリーンショット 2020-01-03 23.23.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43096/5dcc5ecd-aa36-50cb-004f-c8af683675fa.png">
<img width="1188" alt="スクリーンショット 2020-01-03 23.32.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43096/d7bdd407-2f07-19fc-523a-2531925bf0ae.png">

### テスト実行と確認
テストボタン
<img width="1138" alt="スクリーンショット 2020-01-03 23.42.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43096/2ada5b93-fe90-ee3d-da76-b94610ce3887.png">
削除されていることを確認
<img width="930" alt="スクリーンショット 2020-01-04 15.36.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43096/7b7eba7f-b495-15f9-89fb-9cb3f07cb092.png">

# GET(全ユーザーの取得)
GETメソッドを実行したとき、全ユーザーが取得されるようにする。
### Lambda関数の作成と設定
<img width="1301" alt="スクリーンショット 2020-01-04 11.47.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43096/864612f6-3a0d-8c89-9802-b346683fec8f.png">
ソース

```javascript:index.js
'use strict';
const AWS = require('aws-sdk');
const myRegion = "us-east-2";

AWS.config.update({ region: myRegion});

exports.handler = async (event, context) => {
  const documentClient = new AWS.DynamoDB.DocumentClient({ region: myRegion});

  let responseBody = "";
  let statusCode = 0;

  const params = {
    TableName: "Users"
  };

  try {
    const data = await documentClient.scan(params).promise();
    responseBody = JSON.stringify(data);
    statusCode = 200;
  } catch (err) {
    responseBody = `Unable to get users: ${err}`;
    statusCode = 403;
  }

  const response = {
    statusCode: statusCode,
    headers: {
      "Content-Type": "application/json"
    },
    body: responseBody
  };

  return response;
};
```

### メソッド作成と設定
<img width="1185" alt="スクリーンショット 2020-01-04 11.48.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43096/fefe036c-3546-4d65-afc7-7bb80b96ee73.png">
<img width="1180" alt="スクリーンショット 2020-01-04 11.49.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43096/bf066572-323f-6e9e-25f1-1f6449551959.png">

###　テスト実行と確認
何も入力せつ、テストボタン。
<img width="1158" alt="スクリーンショット 2020-01-04 15.50.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43096/ed22a3ce-e2f5-8b50-7032-78659dc61f9b.png">

# PATCH(対象ユーザーの更新)
PATCHメソッドを実行したとき、対象のユーザが更新されるようにする。
### Lambda関数の作成と設定
<img width="1289" alt="スクリーンショット 2020-01-04 12.11.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43096/84e7d6df-7bb3-ad03-b2e6-9ddb1db09525.png">
ソース

```javascript:index.js
/**
 * 対象のユーザ情報を更新する
 */
'use strict';
const AWS = require('aws-sdk');
const myRegion = "us-east-2";

AWS.config.update({ region: myRegion});

exports.handler = async (event, context) => {
  const documentClient = new AWS.DynamoDB.DocumentClient({ region: myRegion});

  let responseBody = "";
  let statusCode = 0;

  const { id, firstname, lastname } = JSON.parse(event.body);

  const params = {
    TableName: "Users",
    Key: {
        id: id
    },
    UpdateExpression: "set firstname = :fname, lastname = :lname",
    ExpressionAttributeValues: {
        ":fname": firstname,
        ":lname": lastname
    },
    ReturnValues: "UPDATED_NEW"
  };

  try {
    const data = await documentClient.update(params).promise();
    responseBody = JSON.stringify(data);
    statusCode = 204;
  } catch (err) {
    responseBody = `Unable to patch user ${err}`;
    statusCode = 403;
  }

  const response = {
    statusCode: statusCode,
    headers: {
      "Content-Type": "application/json"
    },
    body: responseBody
  };

  return response;
};
```


### メソッド作成と設定
<img width="1181" alt="スクリーンショット 2020-01-04 12.12.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43096/65556ac3-f8f7-abfe-c099-6588e8cb89f8.png">
以下のように設定、~~赤枠使うのが面倒になったので察して~~
<img width="965" alt="スクリーンショット 2020-01-04 12.14.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43096/5f10f015-eb67-66f2-db45-bea0e82e46f4.png">

###　テスト実行と確認
<img width="610" alt="スクリーンショット 2020-01-04 12.20.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43096/f802a1f8-3b6c-974c-d7ed-f66f053a34f3.png">

```json:リクエスト本文
{
    "id": "02",
    "firstname": "update_firstname",
    "lastname": "update_lastname"
}
```
更新されることを確認
<img width="936" alt="スクリーンショット 2020-01-04 12.24.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43096/47c2fb8b-efbc-482c-0732-dabf95d092d5.png">

# 終わりに
これでサーバレスでREST APIを使ったCRUD作成の環境構築をしました。
次はAPI Gateway+Lambda(NodeJS)+S3を組み合わせていこうと思います。