模块 1:AWS Lambda 简介
学习模块
概览
在本教程中,您将了解如何将 .NET 与 AWS Lambda 配合使用。您并不需要事先了解 AWS Lambda 也可学习本课程,但您应该熟悉 AWS 和 .NET。在本课程中,您将学习使用命令行、Visual Studio、Visual Studio Code 和 Rider 创建、部署、运行、测试和调试 .NET Lambda 函数。
在这个简介模块中,您将了解什么是无服务器计算、它有哪些优势,以及它与 AWS Lambda 的关系。随后您会看到两个示例,展示了开始使用 .NET AWS Lambda 函数有多轻松。
所需时间
45 分钟
无服务器计算
在讨论无服务器计算之前,我们先简单讲讲传统计算。
无论规模如何,许多公司都使用本地服务器或基于数据中心的服务器来运行其应用程序。在这些公司需要增加服务器时,他们只能购买、实际安装、配置、保护和维护额外的服务器。(在某些情况下,数据中心可能会代您进行物理安装,但其余工作仍然需要您负责完成。)
在所有这些工作都完成后,公司才能将其应用程序部署到这些服务器上。对许多公司来说,这个过程都可能需要数周或数月的时间。过去,这样的延误增加了扩展应用程序的难度,
云计算简化了这一切。公司只需几分钟即可启动一个(或多个)服务器实例。公司可以创建自己的计算机映像,并按照自己想要的方式配置虚拟机和操作系统。这减少了服务器启动后所需的配置工作量,但他们仍然需要安装补丁、安全更新和软件更新等,从而让服务器保持最新状态。
在许多情况下,这些服务器往往是全天候运行的,尽管它们并非一直处于使用状态。通常预置服务器来处理应用程序预期的峰值工作负载。但在非峰值情况下,至少有一部分服务器会处于空闲状态。利用适当的扩展策略来实现精简虽然有助于应对此问题,但很难处理得当。
此外,服务器的预置和维护工作以及服务器空闲时间都会产生成本,而这对公司没有直接好处。
无服务器计算是此类情景的替代方案。无需服务器、无需维护,扩展由我们代您处理。您只需编写和部署代码,基础设施由 AWS 为您打理。
AWS 为无服务器计算提供了两种可选方案:AWS Fargate,适合基于容器的应用程序;AWS Lambda,适合事件驱动的应用程序。
AWS Lambda
AWS Lambda 是一项无服务器计算服务,可执行您的代码以响应服务接收到的事件。事件可以由其他 AWS 服务生成,例如 SNS、SQS、S3、DynamoDB、API Gateway 等。
利用 API 网关或 Lambda 函数 URL,您可以触发 Lambda 函数的运行,以响应 HTTP 请求。您还可以直接调用 Lambda 函数,虽然这也会视为一个事件。
您不需要预置任何基础设施即可使用 AWS Lambda。AWS 还负责自动扩展来满足应用程序的需求,无论是每天执行几次,还是每秒执行数万次,它都能处理得当。由 AWS 管理的 Lambda 基础设施具有高可用性和容错性的特点。
使用 Lambda 函数时,您只需为您使用的计算资源付费。未运行代码就不必付费。
您使用自己熟悉的 IDE 编写 .NET 应用程序,然后在 AWS 工具(或您选择的 IaC)的帮助下,将应用程序部署到 AWS Lambda。
当事件调用 Lambda 函数时,将会创建一个执行环境来运行您的初始化代码(构造函数等),然后运行处理该事件的代码。
执行完成后,执行环境在一段时间内仍可重复使用,而且这段时间并不是固定的。
如果收到另一个事件,则使用相同的执行环境,并且不会再次运行初始化代码。
如果没有可用的执行环境,则创建新的执行环境,此时要再次运行初始化代码。
AWS Lambda 函数目前为 .NET Core 3.1 和 .NET 6 提供托管运行时系统。如果您想在其他版本的 .NET 中编写应用程序,则可以使用 Lambda 自定义运行时系统,或者基于容器的应用程序版本。
AWS 为 Lambda 函数提供了 C# 和 F# 项目模板。您可通过命令行、Visual Studio、Visual Studio Code 和 Rider 使用这些模板。
您可以在 x86_64 和 arm64 处理器上运行 .NET Lambda 函数。无论选择何种处理器架构,您编写应用程序的方式都不受影响。部署到您选择的处理器上轻而易举,只需更改一个配置参数即可。
AWS Lambda 的主要特点
您不需要学习新的编程语言,而是可以运用现有 C# 和 F# 知识来编写 Lambda 函数。
您可以将 Lambda 函数与其他 AWS 服务(例如 SNS、SQS、S3、Step Functions 和 DynamoDB)配合使用,以创建事件驱动的应用程序,还可以执行自定义任务,以响应来自这些服务的事件。
如果您需要编排多个正在运行的 Lambda 函数,则可以使用 AWS Step Functions。借助 Step Functions,您可以创建管理 Lambda 函数执行的状态机。
因此无需预置或管理基础设施。AWS 可以为您处理好这一切。您只需要确定处理器架构,以及要分配给该函数的内存量。AWS 将根据您选择的内存,选择适当的 CPU 速度、网络带宽和磁盘 I/O。
您的 Lambda 函数具有高可用性和容错性,可在每个区域的多个可用区中运行。
在收到事件后的几毫秒内,AWS Lambda 函数就会启动,并且能快速自动扩展以匹配传入事件的数量。
您只需按实际用量付费,计费精确到毫秒。
Lambda 提供慷慨且始终免费的套餐,包括每月 1 百万次免费请求以及每月 400000GB-秒的计算时间
如果您出现突发流量模式,Lambda 将根据需求扩展,在流量减少时,您无需为不再需要的资源付费。
Lambda 是计算类节省计划的一部分,该计划提供较为低的价格,要求是承诺在一到三年内使用一定的计算时间。
在下一节中,您将看到开始使用 AWS Lambda 有多么轻松。只需几分钟时间,您就可以在云端运行两个 .NET AWS Lambda 函数
另外还有两个示例,展示了开始使用 .NET AWS Lambda 函数有多轻松
预计时长:30 分钟
请注意,您可以按照此处提供的示例进行操作,但这不是强制要求。
如果您从未使用过无服务器技术,那么最初可能会觉得有些胆怯,甚至难以弄清楚如何入手。
在学完这个简短的模块后,您将在 AWS 上启动并运行两个 .NET Lambda 函数。
其中一个是从命令行调用的,另一个是通过公共 HTTPS 端点调用的,设置几乎毫不费力。
您将使用命令行创建、构建和部署这两个示例。
先决条件
1.一个 AWS 账户。
如果您没有 AWS 账户,请参阅这个介绍账户创建和激活的网页。 创建新账户时,系统会自动为您激活免费套餐。免费套餐提供部分免费的 AWS 服务,但每项服务的用量都有限额。在此详细了解免费套餐。
2.安装和配置完毕的 AWS CLI。
如果您没有 AWS CLI,请下载并安装。然后使用您的凭证和默认区域配置 AWS CLI。您默认的区域选择将取决于您的地理位置和要使用的 AWS 服务。服务可用性因地区而异。
AWS 用户应附加 AdministratorAccess 策略,如需了解详情,请参阅模块 3 中的“权限说明”部分。
3..NET 6 SDK
如果您未安装 .NET 6 SDK,请下载并安装。
获取工具和模板
后续将有一个模块详细解释可用工具和模板,不过现在请运行以下两条命令来开始使用:
dotnet tool install -g Amazon.Lambda.Tools
dotnet new -i Amazon.Lambda.Templates
演示 1:Lambda 函数“Hello World”
这是您可以编写的最基本的 Lambda 函数,它需要一些输入,然后返回响应,您只要几分钟时间即可启动并运行它。
步骤 1 – 创建 .NET 项目
在命令行/终端窗口中,运行以下命令来创建一个新的 Lambda 函数。
dotnet new lambda.EmptyFunction -n HelloLambda
步骤 2 – 部署 Lambda 函数
转到 HelloLambda/src/HelloLambda 目录:
cd HelloLambda/src/HelloLambda
如果您有兴趣,可以打开这个目录中的项目。您会看到一个名为 Function.cs 的文件。其中包含执行您的函数的代码。请暂时不要更改此文件中的任何内容。
在命令行中运行以下命令,以部署您的函数:
dotnet lambda deploy-function --function-name HelloLambda
您将看到如下输出。
AWS Toolkit for Visual Studio 不支持使用 ECR 公共注册表,也不支持为私有注册表中的新存储库启用自动扫描和存储库加密等功能。如果需要用到这些功能,请使用 AWS 管理控制台或命令行工具(如 AWS CLI 和 AWS Tools for PowerShell)创建存储库。
此时,可能发生的情况有两种。
- 如果您的 AWS 账户中没有角色,系统会提示您“输入新 IAM 角色的名称”,请按要求操作。使用 HelloLambdaRole 这个名称。
- 如果您的 AWS 账户中有角色,则系统会显示一个列表,但底部是创建新的 IAM 角色,输入与之相关的数字。随后,系统将要求您“输入新 IAM 角色的名称”。使用 HelloLambdaRole 这个名称。
接下来,您将看到可以为所创建的角色附加的权限列表。选择 AWSLambdaBasicExecutionRole。在我的列表中,它在第 6 位。
等待几秒钟,此时系统会创建角色、权限和 Lambda 函数。
步骤 3 – 调用 Lambda 函数
从命令行运行:
dotnet lambda invoke-function --function-name HelloLambda --payload "Hello World!"
在输出中,您会看到:
完成了! 您已经将 Lambda 函数部署到了云端!
步骤 4 – 清理
使用 Lambda 函数时,只要不运行函数,您就不必付费,但若使用其他 AWS 服务,即使服务处于空闲状态,您也可能要付费。所以最好删除未使用的资源。
运行以下命令可删除 Lambda 函数:
dotnet lambda delete-function --function-name HelloLambda
请注意,这并不会删除您创建的角色,只会删除函数。
演示 2:在 Lambda 函数中运行的 .NET API
在此演示中,您将创建一个处理 HTTPS 请求的 .NET API 应用程序。您可以使用较新的最简 API 模板,也可以使用带有控制器的较旧完整 API 模板,两者的步骤是一样的。如果您熟悉 .NET 6 顶级语句和 API 端点,可以考虑使用最简模板,即 serverless.AspNetCoreMinimalAPI。如果您不熟悉顶级语句,请使用较旧的模板,即 serverless.AspNetCoreWebAPI。
步骤 1 – 创建 .NET 项目
如果您想使用最简 API 模板,请运行以下命令:
dotnet new serverless.AspNetCoreMinimalAPI -n HelloLambdaAPI
如果您更熟悉带有控制器的完整 API 模板,请运行以下命令:
dotnet new serverless.AspNetCoreWebAPI -n HelloLambdaAPI
步骤 2 – 创建 S3 桶
此步骤仅需执行一次。步骤 3 中的命令需要 S3 桶来存储部署相关文件。
在创建桶名称时,您需要确保这个名称在所有 AWS 账户(不仅仅是您的)和所有区域中都是唯一的。
如果您使用的是 us-east-1 区域,请运行以下命令:
aws s3api create-bucket --bucket your-unique-bucket-name1234
如果想使用不同的区域,请运行:
aws s3api create-bucket --bucket your-unique-bucket-name1234 --create-bucket-configuration LocationConstraint=REGION
如果您选择的桶名称已被使用,则会收到以下错误:
An error occurred (BucketAlreadyExists) when calling the CreateBucket operation: The requested bucket name is not available.The bucket namespace is shared by all users of the system.Please select a different name and try again.(调用 CreateBucket 操作时出错(BucketAlreadyExists):请求的存名称不可用。桶命名空间由系统的所有用户共享。请选择其他名称,然后重试。)
步骤 3 – 部署 Lambda 函数
更改为 HelloLambdaAPI/src/HelloLambdaAPI 目录。
在命令行中运行以下命令,以部署您的函数:
dotnet lambda deploy-serverless --stack-name HelloLambdaAPI --s3-bucket your-unique-bucket-name1234
耐心等待片刻…
您将看到一些与构建和部署过程相关的输出,最后会有一个链接:
Output Name Value
------------------------------ --------------------------------------------------
ApiURL https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/Prod/
在浏览器中打开此链接。根据您选择的项目模板,您将看到以下消息之一:
步骤 4 – 清理
若要删除 Lambda 函数和相关资源,请运行以下命令:
dotnet lambda delete-serverless HelloLambdaAPI