教程 使用 AWS Lambda - AWS Toolkit for Visual Studio
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

教程 使用 AWS Lambda

您可以构建无服务器 Lambda 使用 AWS Toolkit for Visual Studio 模板。TheThethe Lambda 项目模板包括 AWS无服务器应用程序,这是 AWS Toolkit for Visual Studio 实施 AWS无服务器应用模型(AWSSAM). 使用此项目类型,您可以开发 AWS Lambda 使用任何必要的AWS资源将其作为整个应用程序进行部署,并使用 AWS CloudFormation 协调部署。

有关设置 AWS Toolkit for Visual Studio,参见 使用AWS工具包的AWSLambda模板可视化工作室.

创建一个新的 AWS 无服务器应用程序项目

  1. 打开VisualStudio和 文件 菜单,选择 项目.

  2. 对于 Visual Studio 2017::

    新项目 对话框,展开 已安装,展开 视觉C#,并选择 AWSLambda.

    对于 Visual Studio 2019::

    新项目 对话框,确保 语言平台,和 项目类型 下拉框设置为“所有...”和类型 AWSLambda搜索 字段。

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

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

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

  3. 选择 AWS无服务器应用程序,含测试(.NET核心-C#) 模板。

  4. 对于 Visual Studio 2017::

    输入“博主”的 名称,输入所需的 位置等等,然后点击 .

    对于 Visual Studio 2019::

    点击 下一步. 在下一个对话框中,输入“博主”的 名称,输入所需的 位置等等,然后点击 创建.

  5. TheThethe 选择蓝图 页面显示几个 Lambda 功能模板。

    
                  AWS Lambda 无服务器项目的蓝图
  6. 选择 使用DynamodB的博客API 蓝图,然后选择 完成 创建VisualStudio项目。

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

Blog.cs

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

Functions.cs

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

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

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

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

  • RemoveBlogAsync从 DynamoDB 表中删除博客。

每个功能都接受 ApigateWayProxy请求 对象并返回 ApigatewayProxyResponse.

你会暴露在这些 Lambda 使用HTTPAPI Amazon API Gateway. TheThethe APIGatewayProxyRequest 包含代表HTTP请求的所有信息。TheThethe 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

TheThethe serverless.template 是 AWS CloudFormation 用于部署四个功能的模板。模板的参数使您能够设置 DynamoDB 并选择您是否希望 DynamoDB 要创建表或假设已创建表格。

模板定义了四个类型的资源 AWS::Serverless::Function...这是定义为AWSSAM规格一部分的特殊元资源。该规范是作为 DynamoDB 部署的一部分应用到模板的转换。转换将元资源类型扩展到更具体的资源中,例如 AWS::Lambda::FunctionAWS::IAM::Role...转换在模板文件的顶部申报,如下所示。

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

TheThethe 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 表以环境变量传递。TheThethe CodeUri 属性告知 DynamoDB 您的应用程序捆绑包存储在 Amazon S3. 将该属性保留为空。在将应用程序包上传到 S3 之后,工具包在部署过程会填充该属性(它在执行此操作时不会更改磁盘上的模板文件)。TheThethe Events 部分是为您的HTTP绑定定义的 Lambda 功能。这是您需要为您的函数完成的所有 API 网关 设置。您还可以在此部分中设置其他类型的事件源。


            添加事件源

使用 AWS CloudFormation 要管理部署,您还可以在模板中添加和配置所需的任何其他AWS资源,然后让 DynamoDB 注意创建和删除资源。


            添加资源

部署无服务器应用程序

通过右键单击项目并选择,部署无服务器应用程序 发布至AWSLambda.


            发布项目

这会启动部署向导,因为所有 Lambda 配置已在 serverless.template 文件,您需要提供的只是以下内容:

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

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

这些必须位于同一 AWS 区域。


            输入发布详细信息

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


            编辑模板参数

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


            CloudFormation 堆栈视图

部署无服务器应用程序

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


            发布博客

使用 AWS 无服务器 URL 的链接返回到浏览器,您可以看到您返回到了您刚刚发布的博客。


            获取博客

使用 AWS 无服务器应用程序模板,您可以管理一组 Lambda 函数和应用程序的其他 AWS 资源。另外,采用 AWS SAM 规范,您可以使用简化的语法在 DynamoDB 模板中声明无服务器应用程序。