使用AWS和Node.js构建无服务器环境的第三步

首先

在上一篇文章中,我们创建了DynamoDB表和项目,配置了在Lambda函数中使用的角色和内联策略。本次我们将继续,在API Gateway(使用REST API实现CRUD)作为触发器,调用Lambda(NodeJS)函数,并能够在DynamoDB中进行查询和更新。
如果有任何不适当的表达,请指正。
※如果对无服务器概念不熟悉的话,可以参考这里。

建筑图

serverless.png

一個選項是:流動

    • ソースで直接(Api gatewayを使わず)参照や更新ができるかを確認

 

    • POST(ユーザーの登録)

domain.com/users/{id}

DELETE(対象ユーザーの削除)

domain.com/users/{id}

GET(全ユーザーの取得)

domain.com/users

PATCH(対象ユーザーの更新)

domain.com/users/{id}

我可以直接在源代码中进行参考或更新而无需使用Api网关来确认吗?

スクリーンショット 2020-01-03 19.43.16.png

为了能够查阅数据,进行源代码编辑。
我参考了这个参考资料。

'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});

  //読込用のデータ
  const params1 = {
    TableName: "Users",
    Key: {
      id: "01"
    }
  };
  //書込用のデータ
  const params2 = {
    TableName: "Users",
    Item: {
      id: "02",
      firstname: "first02",
      lastname: "last02"
    }
  };

  try {
    const readData = await documentClient.get(params1).promise();
    const writeData = await documentClient.put(params2).promise();
    console.log(readData);
    console.log(writeData);
  } catch (err) {
    console.log(err);
  }
};

请务必注意在同一区域中创建DynamoDB和Lambda。同时,请确保将代码中的myRegion变量值与上述相匹配。如果其中有任何一项不满足条件,可能会引发未知错误AccessDeniedException。

スクリーンショット 2020-01-03 19.58.10.png
スクリーンショット 2020-01-03 20.00.54.png

添加和配置 API Gateway 触发器。

スクリーンショット 2020-01-03 20.32.20.png

关于边缘优化(引用自AWS官方)

Edge optimized API是通过API网关创建和管理的通过CloudFront分配访问的端点。以前,边缘优化API是使用API网关创建API时的默认选项。

以下是参考资料:
– 我对REST API进行了研究
– 我解释了边缘优化的概念

创建和设置请求、响应映射模型。

スクリーンショット 2020-01-03 21.41.42.png
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "title": "UsersInputModel",
  "type": "object",
  "properties": {
      "id": {"type": "string"},
      "firstname": {"type": "string"},
      "lastname": {"type": "string"}
  }
}
スクリーンショット 2020-01-03 21.15.55.png

实现POST方法(用户注册)。

在这里,我们使用API Gateway创建一个POST方法来验证记录是否被成功注册。

创建并设置与API Gateway相关联的Lambda函数。

函数名为putUsers,其余设置与上次相同(参考开头创建Lambda函数的截图)。

我将贴上以下的源代码。
关于DynamoDB的配置,请参考这篇文章。(DynamoDB表的创建部分)

'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",
    Item: {
      id: id,
      firstname: firstname,
      lastname: lastname
    }
  };

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

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

  return response;
}

创建和配置POST方法 。

スクリーンショット 2020-01-03 21.24.17.png
スクリーンショット 2020-01-03 21.46.26.png

请在API网关上进行确认测试

スクリーンショット 2020-01-03 22.12.05.png
スクリーンショット 2020-01-03 22.23.42.png
{
    "id": "03",
    "firstname": "first03",
    "lastname": "last03"
}

如果在测试状态中返回201,则表示成功。
⚠️ 顺便提一下,如果请求主体设置了原本DynamoDB表中没有的项目逻辑名称(比如故意设置成nickname而不是firstname),测试处理将会顺利执行。目标记录的firstname字段被设计成可以包含空格。

スクリーンショット 2020-01-03 22.27.09.png

待续

因为可能会变得有点长,所以下次会继续发布剩下的部分。
接下来,将创建DELETE(删除目标用户)、GET(获取所有用户)和PATCH(更新目标用户)的方法,并将实现完整的CRUD功能。

广告
将在 10 秒后关闭
bannerAds