在本模块中,您将使用 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,并为其指定名为 RideId 的分区键,类型为 String。表名称和分区键都区分大小写。确保您使用的是提供的正确 ID。所有其他设置都保留默认值。

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


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

    2. 选择创建表

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

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

    5. 选中使用默认设置框,然后选择创建

    6. 滚动到新表“概述”部分的底部,并记录 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 管理控制台中,单击服务,然后在“安全、身份与合规”部分选择 IAM

    2. 在左侧导航栏中选择角色,然后选择创建新角色

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

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

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

    5. 选择下一步

    6. 角色名称中输入 WildRydesLambda

    7. 选择创建角色

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

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

    10. 选择选择一项服务

    11. 在标记为查找服务的搜索框中输入 DynamoDB,然后在 DynamoDB 出现后将其选中。

    12. 选择选择操作

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

    14. 选择资源部分。

    15. 选中 Specific (特定资源) 选项,选择部分中的“添加 ARN”链接。

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

    17. 选择查看策略

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

  • 第 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. 选择服务,然后在“计算”部分选择 Lambda

    2. 选择创建 Lambda 函数

    3. 选择空白函数蓝图卡片。

    4. 此时不要添加任何触发。选择下一步继续定义您的函数。

    5. Requestunicorn输入名称字段中。

    6. 可选择输入描述。

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

    8. requestunicorn.js 中复制代码并将其粘贴到代码输入区域。

    9. 将默认值 index.handler 保留在处理程序字段中。

    10. 选择 WildRydesLambda 作为现有角色下拉列表中的选项。

    11. 选择下一步,然后在“审核”页面选择创建函数

  • 第 4 步:测试您的实施

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


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

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

    3. 事件名称字段中输入 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. 单击创建

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

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

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

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