开始使用 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 分钟

 使用的服务

实施

    1. 登录 Amazon DynamoDB 控制台
    2. 确保注意到您创建函数时处于哪个区域。您可以在页面最顶部您的账户名称旁看到此信息。
    3. 单击蓝色的“创建表”按钮。
    4. 在“表名称”旁,键入 HelloWorldDatabase
    5. 在“主键”字段中,键入 ID
    6. 单击蓝色的“创建”按钮。
    7. 从右边的面板中复制表的“Amazon 资源名称 (ARN)”(在本模块中,您稍后将需要它)。
    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 函数选项卡。


    • 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 完成后,我们来看看当前的架构:

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

此模块有帮助吗?

添加交互到 Web 应用程序