开始使用 AWS

构建基本 Web 应用程序

部署 Web 应用程序并添加与 API 和数据库的交互

模块 4:创建数据表

在本模块中,您将创建 DynamoDB 表并启用您的 Lambda 函数以将数据存储在其中。

简介

在本模块中,我们将使用 Amazon DynamoDB 创建表来持久存储数据。DynamoDB 是一个键值数据库服务,因此我们不需要为我们的数据创建 Schema。它在任意规模下都能提供一致的超高性能,并且使用它时不需要管理服务器。

此外,我们还将使用 AWS Identity and Access Management (IAM) 服务为我们的服务安全地授予互相交互所需的权限。具体来说,我们将允许我们在模块 2 中创建的 Lambda 函数使用 IAM 策略写入我们新创建的 DynamoDB 表中。为实现此目的,我们将使用 Lambda 函数中的 AWS 开发工具包(Python、JavaScript 或 Java)。

您将学到的内容

  • 使用 AWS 管理控制台创建一个 DynamoDB 表
  • 使用 IAM 创建角色并管理权限
  • 使用 AWS 开发工具包(Python、JavaScript 或 Java)写入 DynamoDB 表

重要概念

永久存储数据存储数据,以便我们以后可以独立于程序执行来访问数据。

非关系数据库非关系数据库不使用行和列组成的表格 Schema。它们使用针对存储数据类型的特定要求优化的存储模型。

键值数据库一种非关系数据库,它将数据存储为键值对集合,其中键作为唯一标识符。

主键标识 DynamoDB 表中每一段数据的值。该值还将用于对表格进行分区,以使其可扩展。

Schema 数据的组织形式,用作数据库构建方式的蓝图。

AWS SDK SDK 表示“软件开发工具包”。 AWS 开发工具包提供一组工具、库、文档、示例代码、过程和指导,从而使开发人员能够在特定平台上创建软件应用程序。

IAM 策略定义实体(例如,服务、用户、组)可以访问哪些 AWS 资源的文档。

 完成时间

10 分钟

 使用的服务

实施

  • 创建 DynamoDB 表
    1. 登录 Amazon DynamoDB 控制台
    2. 确保注意到您创建函数时处于哪个区域。您可以在页面最顶部您的账户名称旁看到此信息。
    3. 单击蓝色的“创建表”按钮。
    4. 在“表名称”旁,键入 HelloWorldDatabase
    5. 在“主键”字段中,键入 ID
    6. 单击蓝色的“创建”按钮。
    7. 从右边的面板中复制表的“Amazon 资源名称 (ARN)”(在本模块中,您稍后将需要它)。
  • 创建并添加 IAM 策略到 Lambda 函数中
    1. 现在我们已创建表,下面来编辑 Lambda 函数以便能够在其中写入数据。在新建浏览器窗口中,打开 AWS Lambda 控制台
    2. 单击我们在模块 2 中创建的函数(如果您使用我们的示例,它将被称为“HelloWorldFunction”)。
    3. 我们将添加权限到函数中,以便它可以使用 DynamoDB 服务,我们将使用 AWS Identity and Access Management (IAM) 执行此操作。
    4. 单击“权限”选项卡
    5. 在“执行角色”框中,单击角色。新的浏览器选项卡将打开。
    6. 单击“权限策略”框右侧的“添加内联策略”。
    7. 单击“JSON”选项卡。
    8. 将以下策略复制到文本区域中,注意替换第 15 行中“资源”字段中的表 ARN:
    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "dynamodb:PutItem",
                "dynamodb:DeleteItem",
                "dynamodb:GetItem",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:UpdateItem"
            ],
            "Resource": "YOUR-TABLE-ARN"
        }
        ]
    }

    9.此策略将允许我们的 Lambda 函数读取、编辑或删除项目,但限制它只能在我们创建的表中执行这些操作。

    10.单击蓝色的“查看策略”按钮。

    11.在“名称”旁,键入 HelloWorldDynamoPolicy

    12.单击蓝色的“创建策略”按钮。

    13.您现在可以关闭此浏览器选项卡并返回您的 Lambda 函数选项卡。


  • 修改 Lambda 函数以写入 DynamoDB 表
    • Python
    • JavaScript
    • Java
    • Python
      1. 单击“配置”选项卡
      2. 使用以下代码替换函数的代码:
      # import the json utility package since we will be working with a JSON object
      import json
      # import the AWS SDK (for Python the package name is boto3)
      import boto3
      # import two packages to help us with dates and date formatting
      from time import gmtime, strftime
      
      # create a DynamoDB object using the AWS SDK
      dynamodb = boto3.resource('dynamodb')
      # use the DynamoDB object to select our table
      table = dynamodb.Table('HelloWorldDatabase')
      # store the current time in a human readable format in a variable
      now = strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime())
      
      # define the handler function that the Lambda service will use as an entry point
      def lambda_handler(event, context):
      # extract values from the event object we got from the Lambda service and store in a variable
          name = event['firstName'] +' '+ event['lastName']
      # write name and time to the DynamoDB table using the object we instantiated and save response in a variable
          response = table.put_item(
              Item={
                  'ID': name,
                  'LatestGreetingTime':now
                  })
      # return a properly formatted JSON object
          return {
              'statusCode': 200,
              'body': json.dumps('Hello from Lambda, ' + name)
          }

      3.单击页面顶部的橙色“保存”按钮。

    • JavaScript
      1. 单击“配置”选项卡
      2. 使用以下代码替换函数的代码:
      // Include the AWS SDK module
      const AWS = require('aws-sdk');
      // Instantiate a DynamoDB document client with the SDK
      let dynamodb = new AWS.DynamoDB.DocumentClient();
      // Use built-in module to get current date & time
      let date = new Date();
      // Store date and time in human-readable format in a variable
      let now = date.toISOString();
      // Define handler function, the entry point to our code for the Lambda service
      // We receive the object that triggers the function as a parameter
      exports.handler = async (event) => {
          // Extract values from event and format as strings
          let name = JSON.stringify(`Hello from Lambda, ${event.firstName} ${event.lastName}`);
          // Create JSON object with parameters for DynamoDB and store in a variable
          let params = {
              TableName:'HelloWorldDatabase',
              Item: {
                  'ID': name,
                  'LatestGreetingTime': now
              }
          };
          // Using await, make sure object writes to DynamoDB table before continuing execution
          await dynamodb.put(params).promise();
          // Create a JSON object with our response and store it in a constant
          const response = {
              statusCode: 200,
              body: name
          };
          // Return the response constant
          return response;
      };

      3.单击页面顶部的橙色“保存”按钮。

    • Java
      1. 单击“配置”选项卡
      2. 转至“函数代码”并上传下面的 JAR 文件。(在本教程中,我们将跳过部署程序包的创建。)
      3. 将“句柄”更新com.example.app.SavePersonHandler::handleRequest
      4. 单击页面顶部的橙色“保存”按钮。
  • 测试更改
    1. 单击白色的“测试”按钮。
    2. 您应看到绿色背景的“执行结果:已成功”消息。
    3. 浏览器选项卡中,打开 DynamoDB 控制台
    4. 单击左侧导航栏上的“表”。
    5. 单击我们之前在本模块中创建的 HelloWorldDatabase
    6. 单击右侧的“项目”选项卡。
    7. 此处应出现与您的测试匹配的项目。如果您在使用我们的示例,项目 ID 将为“Ada Lovelace”。
    8. 您的 Lambda 函数每次执行时,都将更新 DynamoDB 表。如果使用相同的名称,只能更改时间戳。

应用程序架构

模块 4 完成后,我们来看看当前的架构:

full-stack amplify console arch diagram module 4

我们在本模块中添加了两项服务:DynamoDB(用户存储)和 IAM(用于安全地管理权限)。这两项服务都与我们的 Lambda 函数连接,因此可以写入到我们的数据库。最后一步是添加代码到客户端中以调用 API Gateway。

此模块有帮助吗?

谢谢
请告知我们您喜欢什么。
很抱歉让您失望了
是否存在过时、令人困惑或不准确的内容? 请向我们提供反馈,帮助我们改进本教程。

添加交互到 Web 应用程序