在本模块中,您将使用 AWS Lambda 和 Amazon DynamoDB 来构建一个后端进程,用于处理 Web 应用程序的请求。用户可以通过您在第一个模块中部署的浏览器应用程序来请求将 Unicorn 发送至他们选择的位置。为了满足这些请求,在浏览器中运行的 JavaScript 需要调用在云中运行的服务。

Serverless_Web_App_LP_assets-04

您将实施一个用户每次请求获取 Unicorn 时都会调用的 Lambda 函数。该函数将从队列中选择一个 Unicorn,在 DynamoDB 表中记录该请求,然后使用将要分派的 Unicorn 的详细信息响应前端应用程序。

系统会使用 Amazon API Gateway 通过浏览器调用此函数。您将在下一模块中实施该连接。在本模块中,您只需要单独测试函数。

完成模块所需时间:30 分钟

使用的服务:AWS Lambda、Amazon DynamoDB


按照以下分步说明创建无服务器后端进程。单击各个步骤号可展开该部分。

  • 步骤 1.创建 Amazon DynamoDB 表

    使用 Amazon DynamoDB 控制台创建一个新的 DynamoDB 表。将您的表命名为 Rides,并为其指定类型为 String、名为 RideId 的分区键。表名称和分区键都区分大小写。确保您使用的是提供的正确 ID。所有其他设置都保留默认值。

    创建该表之后,记录 ARN,以备下一步中使用。


    1. 在 AWS 管理控制台中选择 Services (服务),然后选择“Databases (数据库)”下的 DynamoDB

    2. 选择 Create Table

    3. 输入 Rides 作为表名称 此字段区分大小写。

    4. 输入 RideId 作为分区键,并选择 String (字符串) 作为键类型。此字段区分大小写。

    5. 选中 Use default settings (使用默认设置) 框,然后选择 Create (创建)

    6. 滚动到新表“Overview (概述)”部分的底部,并记录 ARN。您在下一节中会用到它。

  • 步骤 2.为 Lambda 函数创建 IAM 角色

    每个 Lambda 函数都有一个与之关联的 IAM 角色。此角色定义了函数可与哪些 AWS 服务进行交互。在本次研讨会中,您需要创建一个 IAM 角色,用于授予 Lambda 函数将日志写入 Amazon CloudWatch Log 和向 DynamoDB 表中写入项目的权限。

    使用 IAM 控制台创建一个新角色。将其命名为 WildRydesLambda 并选择 AWS Lambda 作为角色类型。您需要挂载相应的策略,以便授予函数写入 Amazon CloudWatch Log 和将项目存入 DynamoDB 表的权限。

    将名为 AWSLambdaBasicExecutionRole 的托管策略附加到此角色,以便授予必要的 CloudWatch Logs 权限。此外,为您的角色创建一个自定义内联策略,该策略允许对您在上一节创建的表执行 ddb:PutItem 操作。


    1. 在 AWS 管理控制台中,单击 Services (服务),然后在“Security, Identity & Compliance (安全性、身份与合规性)”部分选择 IAM

    2. 在左侧导航栏中选择 Roles (角色),然后选择 Create New Role (创建新角色)

    3. AWS service (AWS 服务) 组中选择 Lambda 作为角色类型,然后单击 Next: Permissions (下一步: 权限)

      注意:选择角色类型会自动为您的角色创建信任策略,并允许 AWS 服务代表您担任此角色。如果您使用 CLI、AWS CloudFormation 或其他机制创建此角色,则应直接指定信任策略。

    4. Filter (筛选条件) 文本框中键入 AWSLambdaBasicExecutionRole,并选中此角色旁边的复选框。

    5. 选择 Next Step

    6. Role Name (角色名称) 中输入 WildRydesLambda

    7. 选择创建角色

    8. 在“Roles (角色)”页面的筛选条件框中键入 WildRydesLambda,并选择您刚刚创建的角色。

    9. 在“Permissions (权限)”选项卡上,选择右下角的 Add inline policy (添加内联策略) 链接以创建新的内联策略。

    10. 选择 Choose a service (选择一项服务)

    11. 在标记为 Find a service (查找服务) 的搜索框中键入 DynamoDB,然后在 DynamoDB 出现后将其选中。

    12. 选择 Select actions (选择操作)

    13. 在标记为 Filter actions (筛选操作) 的搜索框中输入 PutItem,然后在 PutItem 出现时选中其旁边的复选框。

    14. 选择 Resources (资源) 部分。 

    15. 在选中 Specific (特定) 选项的情况下选择 table (表) 部分中的“Add ARN (添加 ARN)”链接。

    16. 将您在上一节中创建的表格 ARN 粘贴到 Specify ARN for table (指定表的 ARN) 字段中,然后选择 Add (添加)

    17. 选择 Review Policy (查看策略)

    18. 输入 DynamoDBWriteAccess 作为策略名称,然后选择 Create policy (创建策略)

  • 步骤 3.创建用于处理请求的 Lambda 函数

    AWS Lambda 将运行您的代码以响应诸如 HTTP 请求之类的事件。在此步骤中,您将构建核心函数,用于处理来自 Web 应用程序的 API 请求,以便分派 Unicorn。在下一模块中,您将使用 Amazon API Gateway 创建一个 RESTful API,用于公开可以通过用户浏览器调用的 HTTP 终端节点。然后,您可以将在此步骤中创建的 Lambda 函数连接到此 API,以便为您的 Web 应用程序创建功能齐全的后端。

    使用 AWS Lambda 控制台创建一个名为 RequestUnicorn 的新 Lambda 函数,用于处理 API 请求。将提供的 requestUnicorn.js 示例实施用于您的函数代码。只需从该文件中复制该示例并将其粘贴到 AWS Lambda 控制台的编辑器中即可。

    务必将该函数配置为使用您在上一节中创建的 WildRydesLambda IAM 角色。


    1. 选择 Services (服务),然后在“Compute (计算)”部分中选择 Lambda

    2. 单击 Create function (创建函数)​。

    3. 将默认的 Author from scratch (从头开始创作) 卡片保持选定状态。

    4. Name (名称) 字段中输入 RequestUnicorn

    5. 选择 Node.js 6.10 作为运行时

    6. 确保从 Role (角色) 下拉列表中选择 Choose an existing role (选择现有角色)

    7. Existing Role (现有角色) 下拉列表中选择 WildRydesLambda

    8. 单击 Create function (创建函数)

    9. 向下滚动到 函数代码部分,然后将 index.js 代码编辑器中的现有代码替换为 requestUnicorn.js 的内容。

    10. 单击页面右上角的 Save (保存)

  • 步骤 4.测试您的实施

    在本模块中,您将测试使用 AWS Lambda 控制台构建的函数。在下一模块中,您将使用 API Gateway 添加一个 REST API,以便从在第一个模块中部署的基于浏览器的应用程序中调用此函数。


    1. 从函数的主编辑主屏幕中,选择 Select a test event...(选择测试事件...) 下拉列表中的 Configure test event (配置测试事件)

    2. Create new test event (新建测试事件) 保持选中状态。

    3. Event name (事件名称) 字段中输入 TestRequestEvent

    4. 复制以下测试事件并将其粘贴到编辑器中:

    {
        "path": "/ride",
        "httpMethod": "POST",
        "headers": {
            "Accept": "*/*",
            "Authorization": "eyJraWQiOiJLTzRVMWZs",
            "content-type": "application/json; charset=UTF-8"
        },
        "queryStringParameters": null,
        "pathParameters": null,
        "requestContext": {
            "authorizer": {
                "claims": {
                    "cognito:username": "the_username"
                }
            }
        },
        "body": "{\"PickupLocation\":{\"Latitude\":47.6174755835663,\"Longitude\":-122.28837066650185}}"
    }
    1. 单击 Create (创建)

    2. 在函数的主编辑屏幕中,从下拉列表中选择 TestRequestEvent 并单击 Test (测试)

    3. 滚动到页面顶部,展开 Execution result (执行结果) 部分的 Details (详细信息) 部分。

    4. 验证执行是否成功,以及函数结果是否如下所示:

    {
        "statusCode": 201,
        "body": "{\"RideId\":\"SvLnijIAtg6inAFUBRT+Fg==\",\"Unicorn\":{\"Name\":\"Rocinante\",\"Color\":\"Yellow\",\"Gender\":\"Female\"},\"Eta\":\"30 seconds\"}",
        "headers": {
            "Access-Control-Allow-Origin": "*"
        }
    }