教程:使用构建和测试无服务器应用程序Amazon Lambda - Amazon Toolkit for Visual Studio
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

教程:使用构建和测试无服务器应用程序Amazon Lambda

您可以使用使用构建无服务器 Lambda 应用程序Amazon Toolkit for Visual Studio。模板。Lambda 项目模板包括一个用于Amazon无服务器应用,这是Amazon Toolkit for Visual Studio的实现Amazon无服务器应用程序模型 (AmazonSAM). 使用这种项目类型,你可以开发一个集合Amazon Lambda函数并使用任何必要的部署它们Amazon资源作为一个整体应用程序,Amazon CloudFormation以便安排部署。

有关设置先决条件和有关设置Amazon Toolkit for Visual Studio,请参阅使用Amazon中的 Lambda 模板AmazonToolkit for Visual Studio.

创建新的Amazon无服务器应用项目

  1. 打开 Visual Studio,在 File (文件) 菜单上,选择 New (新建)Project (项目)

  2. 对于 Visual Studio 2017

    新项目对话框中,展开已安装,展开Visual C#,然后选择AmazonLambda.

    对于 Visual Studio 2019

    新项目对话框中,请确保语言平台, 和项目类型下拉框设置为 “All...” 并键入aws lambda中的搜索字段中返回的子位置类型。

    可从两种类型的项目中选择:

    • Amazon Lambda项目可创建用于开发和部署单个 Lambda 函数的项目。

    • Amazon无服务器应用程序项目可使用无服务器创建 Lambda 函数Amazon CloudFormation。模板。Amazon使用无服务器应用程序,您可以定义不仅仅是函数。例如,您可以通过无服务器部署来同步创建数据库、添加 IAM 角色等。Amazon另外,无服务器应用程序还使您能够一次性部署多个函数。

  3. 选择Amazon带测试的无服务器应用程序(.NET 内核-C#)。模板。

  4. 对于 Visual Studio 2017

    名称输入“Blogger”,输入所需位置等,然后单击确定

    对于 Visual Studio 2019

    单击 Next(下一步)。在下一个对话框中,为名称输入“Blogger”,输入所需位置等,然后单击创建

  5. 这些区域有:选择蓝图页面显示了几个 Lambda 函数模板。

    
                  蓝图的AmazonLambda 无服务器项目
  6. 选择 Blog API using DynamoDB (使用 DynamoDB 的博客 API) 蓝图,然后选择 Finish (完成) 以创建 Visual Studio 项目。

检查无服务器应用程序中的文件

Blog.cs

Blog.cs是一个简单类,用于表示存储在 Amazon DynamoDB 中的博客项目。

Functions.cs

Functions.cs将 C # 函数定义为作为 Lambda 函数公开。系统定义了四个函数来管理博客平台:

  • GetBlogsAsync:获取所有博客的列表。

  • GetBlogAsync:获取由查询参数 ID 或添加到 URL 资源路径的 ID 标识的单个博客。

  • AddBlogAsync:将博客添加到 DynamoDB 表。

  • RemoveBlogAsync:从 DynamoDB 表中删除博客。

其中每个函数会接受 APIGatewayProxyRequest 对象并返回 APIGatewayProxyResponse

您可以使用 Amazon API Gateway 将这些 Lambda 函数作为 HTTP API 公开。APIGatewayProxyRequest 包含用于表示 HTTP 请求的所有信息。GetBlogAsync 任务会在资源路径或查询字符串中查找博客 ID。

public async Task GetBlogAsync(APIGatewayProxyRequest request, ILambdaContext context) { string blogId = null; if (request.PathParameters != null && request.PathParameters.ContainsKey(ID_QUERY_STRING_NAME)) blogId = request.PathParameters[ID_QUERY_STRING_NAME]; else if (request.QueryStringParameters != null && request.QueryStringParameters.ContainsKey(ID_QUERY_STRING_NAME)) blogId = request?.QueryStringParameters[ID_QUERY_STRING_NAME]; ... }

此类的默认构造函数将存储博客的 DynamoDB 表的名称作为环境变量进行传递。此环境变量在 Lambda 部署函数时设置。

public Functions() { // Check if a table name was passed in through environment variables and, if so, // add the table mapping var tableName = System.Environment.GetEnvironmentVariable(TABLENAME_ENVIRONMENT_VARIABLE_LOOKUP); if(!string.IsNullOrEmpty(tableName)) { AWSConfigsDynamoDB.Context.TypeMappings[typeof(Blog)] = new Amazon.Util.TypeMapping(typeof(Blog), tableName); } var config = new DynamoDBContextConfig { Conversion = DynamoDBEntryConversion.V2 }; this.DDBContext = new DynamoDBContext(new AmazonDynamoDBClient(), config); }

serverless.template

serverless.template 是用于部署四个函数的 Amazon CloudFormation 模板。您可以使用此模板的参数来设置 DynamoDB 表的名称,然后选择您是否需要 DynamoDB 创建表或者假定已经创建表。

此模板定义了四种 AWS::Serverless::Function 类型的资源。这是定义为组成部分的特殊元资源AmazonSAM 规范。该规范是作为 DynamoDB 部署的一部分应用到模板的转换。该转换将元资源类型转换到更具体的资源,例如 AWS::Lambda::FunctionAWS::IAM::Role。该转换在模板文件顶部声明,如下所示。

{ "AWSTemplateFormatVersion" : "2010-09-09", "Transform" : "AWS::Serverless-2016-10-31", ... }

GetBlogs 声明与函数声明类似。

"GetBlogs" : { "Type" : "AWS::Serverless::Function", "Properties": { "Handler": "Blogger::Blogger.Functions::GetBlogsAsync", "Runtime": "dotnetcore1.0", "CodeUri": "", "Description": "Function to get a list of blogs", "MemorySize": 256, "Timeout": 30, "Role": null, "Policies": [ "AWSLambdaFullAccess" ], "Environment" : { "Variables" : { "BlogTable" : { "Fn::If" : ["CreateBlogTable", {"Ref":"BlogTable"}, { "Ref" : "BlogTableName" } ] } } }, "Events": { "PutResource": { "Type": "Api", "Properties": { "Path": "/", "Method": "GET" } } } } }

许多字段都与 Lambda 项目部署的字段类似。在Environment属性,DynamoDB 表的名称将作为环境变量传入。这些区域有:CodeUri属性告诉 DynamoDB 您的应用程序包存储在 Amazon S3 中的什么位置。将该属性保留为空。在将应用程序包上传到 S3 之后,工具包在部署过程会填充该属性(它在执行此操作时不会更改磁盘上的模板文件)。这些区域有:Events部分为您的 Lambda 函数定义了 HTTP 绑定。这是您需要为您的函数完成的所有 API Gateway 设置。您还可以在此部分中设置其他类型的事件源。


            添加事件源

使用的好处之一Amazon CloudFormation要管理部署,你也可以添加和配置任何其他Amazon您的应用程序所需的资源,并让 DynamoDB 负责创建和删除资源。


            添加资源

部署无服务器应用程序

通过右键单击项目并选择来部署无服务器应用程序。Publish to (发布到 CloudWatch)AmazonLambda.


            发布项目

这会启动部署向导,另外由于 Lambda 已经在serverless.template文件,您只需要提供以下内容:

  • CloudFormation 堆栈的名称,这是在模板中声明的所有资源的容器。

  • 将您的应用程序包上传到的 S3 存储桶。

这些必须存在于同一位置Amazon区域。


            输入发布详细信息

由于无服务器模板具有参数,因此向导中将显示一个额外的页面,您可在其中指定这些参数的值。您可以将 BlogTableName 属性留空,并让 CloudFormation 为表生成唯一的名称。你确实需要设置ShouldCreateTabletrue以便 DynamoDB 将创建表格。要使用现有的表,请输入表名称并将 ShouldCreateTable 设置为 false。您可以将其他字段保留为默认值,然后选择 Publish (发布)


            编辑模板参数

完成发布步骤后,CloudFormation 堆栈视图将在中显示。AmazonExplorer。此视图显示了在无服务器模板中声明的所有资源的创建进度。


            CloudFormation 堆栈视图

部署无服务器应用程序

完成堆栈创建后,页面上会显示 API Gateway 的根 URL。如果您单击该链接,它会返回一个空 JSON 数组,因为您尚未在表中添加任何博客。要获取表中的博客,您需要向此 URL 发出 HTTP PUT 方法,用于向其传递表示博客的 JSON 文档。您可以使用代码或任意数量的工具执行此操作。此示例使用 Postman 工具,它是 Chrome 浏览器扩展程序,但您可以使用您喜欢的任何工具。在此工具中,您可以设置 URL 和更改 PUT 的方法。在 Body (正文) 选项卡上,您将输入一些示例内容。当您执行 HTTP 调用后,您可以看到返回的博客 ID。


            发布博客

使用链接返回浏览器Amazon无服务器 URL,您可以看到您正在恢复您刚刚发布的博客。


            获取博客

使用Amazon无服务器应用程序模板,您可以管理 Lambda 函数集合和应用程序的另一个函数集合。Amazon资源的费用。另外,有了AmazonSAM 规范,您可以使用简化的语法在 DynamoDB 模板中声明无服务器应用程序。