AWS 无服务器入门 - Lambda 函数
在本文中,我们将学习如何在 AWS 上开始使用无服务器。这需要创建一个 AWS 账户和一张信用卡,不过不用担心,完全免费!
TL;DR
本文将教您如何在 AWS 上开始使用无服务器技术。如果您已经拥有 AWS 账户,请直接跳至“创建 AWS CDK 项目”部分。我计划发布一系列关于无服务器技术的文章,逐步讲解这项技术的特性,敬请期待!
⬇️ 我会定期发布无服务器内容,如果你想了解更多 ⬇️
快速公告:我还在开发一个名为🛡 sls-mentor 🛡的库。它汇集了 30 条无服务器最佳实践,这些实践会在您的 AWS 无服务器项目中自动检查(无论使用哪种框架)。它是免费开源的,欢迎随时查看!
为什么是无服务器?
近年来,云计算技术掀起了一股热潮。云计算正在成为软件开发的新标准。这场革命正在改变我们开发软件的方式,而且远未结束。作为开发者,我们在这场变革中扮演着重要的角色,这也是我们在这个新范式中占据一席之地的机会。
使用云时,我们无需过多考虑服务器的基础设施。如果使用得当,云可以让我们专注于构建功能的业务逻辑:我们的注意力将集中在我们编写的代码上,而不是运行代码的服务器上。这对开发人员来说是一个巨大的优势,因为它使我们能够专注于我们最擅长的事情:编写代码。
无服务器是这场云革命的巅峰:服务器消失了,开发人员变成了架构师,再加上强大的 IaC(基础设施即代码)工具,我们可以在几分钟内构建复杂的架构。这场革命仍处于起步阶段,在我看来,现在正是加入这股浪潮的时候!
无服务器和基础设施即代码
无服务器是一种云计算执行模型,云提供商动态管理服务器的分配和配置。您只需提供一些代码,即可在云端按需运行,运行次数与用户数量无关。其核心优势在于按使用付费:应用程序的规模可以缩减到零,并且在用户数量达到一定规模之前,开发基本上是免费的。
无服务器是一个非常广泛的术语,它可以应用于许多不同的云提供商。在本文中,我们将重点介绍 AWS,因为它是最受欢迎的云提供商,也是我最熟悉的。
基础设施即代码 (IaC) 是一种使用代码管理基础设施的方法。它允许您自动创建、修改和删除基础设施。结合无服务器架构,您可以使用自己喜欢的编程语言构建复杂的架构,而无需复杂的配置文件。
开始使用 AWS
创建 AWS 账户并配置您的凭证
首先,您需要创建一个 AWS 账户。您可以访问https://aws.amazon.com进行创建。您需要提供一张信用卡,但不用担心,在用户数量达到一定规模之前,我们不会向您收取任何费用。
创建帐户后,您需要配置凭证。您可以前往AWS 控制台,点击右上角的用户名。然后点击“我的安全凭证”。之后,您将能够创建一个新的访问密钥。您需要将此密钥保存在安全的地方,因为它将用于验证您向 AWS 发出的请求。
⚠️ 最佳做法是不要使用根账户进行开发,因为它拥有所有 AWS 服务的完全访问权限。相反,您应该创建一个权限尽可能少的新用户。查看本教程了解更多信息。
安装 AWS CLI
无服务器背后的理念是能够在本地计算机上开发应用程序的业务逻辑,并在一切准备就绪后将其部署到云端(您肯定不想直接在 Google Chrome 中编写代码🙃)。您需要一个 CLI 来实现这一点。
AWS CLI 是一个允许您使用命令行与 AWS 交互的工具。您可以按照此页面上的说明进行安装。
完成后,您可以通过运行以下命令来配置配置文件:
aws configure
提供您之前生成的访问密钥,指定您的 AWS 区域(例如欧洲的 eu-west-1)和输出格式(json)。
创建 AWS CDK 项目
AWS 云开发工具包(CDK)是一个用于配置云基础设施的开源软件开发框架。简单来说,CDK 允许您用代码描述要在 AWS 上部署的基础设施,这被称为“基础设施即代码”(IaC)。CDK 支持多种编程语言,本文将重点介绍 TypeScript,但 JavaScript 的工作原理几乎相同。
要创建项目,请在 CLI 中运行以下命令:
mkdir my-first-app && cd my-first-app
npx cdk init app --language typescript
npm run cdk bootstrap
它将创建一个新的存储库,安装依赖项,并在 AWS 云上引导您的项目。设置完毕!是时候开始编码了!
Lambda 函数
Lambda 函数是无服务器的核心。它们是小型的架构块,可以根据需求在云端执行代码。它们是按需配置的微型服务器,用于响应用户请求。理论上,单个 Lambda 函数每秒可以响应数百万个请求!最棒的是:它们是按使用付费的,因此您只需为运行时间付费(在应用开发期间,它基本上是免费的)。
在本部分中,您将创建第一个 Lambda 函数,并将其部署到 AWS 上。这将是一个简单的“Hello World”函数,但足以帮助您入门。
让我们看一下 CDK 生成的代码。您可以在lib
文件夹中找到它。您会看到一个名为 的文件my-first-app-stack.ts
。您将在此文件中编写基础设施即代码。让我们从创建一个简单的 Lambda 函数开始。
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import path from 'path';
export class MyFirstAppClass extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
new cdk.aws_lambda_nodejs.NodejsFunction(this, 'myFirstLambda', {
entry: path.join(__dirname, 'myFirstLambda', 'handler.ts'),
handler: 'handler',
});
}
}
如果在导入“path”时遇到错误,请esModuleInterop: true
在 tsconfig.json 文件的compilerOptions中添加。
myFirstLambda
在此代码片段中,我使用构造创建了一个名为 的新 Lambda 函数NodejsFunction
。此构造允许使用 Node.js 轻松创建 Lambda 函数,并为您处理打包工作(您无需担心导入依赖项等),它还原生支持 TypeScript!
参数entry
是处理程序文件的路径(定义将在云端执行的代码)。handler
参数是调用 Lambda 时将执行的 JavaScript 函数的名称。
这意味着您需要创建一个名为 的文件夹myFirstLambda
,lib
以及一个名为handler.ts
的文件。该文件应导出一个handler
函数。例如,该文件的内容可以如下:
export const handler = (): Promise<string> => Promise.resolve('Hello World!');
一个简单的经验法则是,Lambda 函数执行的代码必须始终是异步的(实际上情况会更复杂一些,但现在只需记住它们的返回类型应该是 Promise)。在这里,我使用 Promise.resolve 异步返回一个字符串,即使本例中的所有内容都是同步的。
npm run cdk deploy
哎呀!出错了!我忘了添加esbuild
dev-dependency 了。esbuild 是用来打包 NodejsFunction 的工具。我只需要运行以下命令就可以修复它:
npm i --save-dev esbuild
让我们重新运行 deploy 命令。现在应该可以正常工作了。在 AWS 控制台上,我可以看到一个新的 Lambda 函数已创建:
点击它并前往test
标签页。您可以通过点击按钮来调用 Lambda 函数Test
。
您可以在绿色区域看到调用日志:“Hello World!”。您刚刚创建了第一个 Lambda 函数!
初探 AWS API Gateway
你的第一个 Lambda 函数很棒,但用处不大。没人能从互联网上访问它,而且它也没做任何有用的事。
要解决这个问题,你需要一个 API,就像经典的“serverful”应用程序一样。AWS API 网关服务提供了创建可调用 Lambda 函数的 REST API 的功能 -> 目前来说,它已经满足了所有需求!
让我们通过创建一个新的 Lambda 函数来解决这个问题,该函数插入一个可以调用它的 API 端点。您将使用 Api Gateway 和 CDK 来实现这一点。
首先,让我们创建一个用于调用 Lambda 函数的 REST API。为此,我们将使用RestApi
以下构造。将以下代码添加到您的my-first-app-stack.ts
文件中:
// Under the instantiation of your first Lambda function
const myFirstApi = new cdk.aws_apigateway.RestApi(this, 'myFirstApi', {});
const diceResource = myFirstApi.root.addResource('dice');
我还添加了一个名为 的资源dice
。它的作用是告诉 AWS 我们的 API 现在已/dice
注册了 API 路由。例如,如果 API 部署在 上https://my-api.com
,则端点将是https://my-api.com/dice
。
让我们创建一个rollADice
Lambda 函数,它将返回一个介于 1 到 6 之间的随机数。创建一个名为 的新文件夹rollADice
,lib
以及一个名为 的文件handler.ts
。该文件的内容如下:
export const handler = async (): Promise<{ statusCode: number; body: number }> => {
const randomNumber = Math.floor(Math.random() * 6) + 1;
return Promise.resolve({ statusCode: 200, body: randomNumber });
};
注意函数的返回类型。它是一个包含 astatusCode
和 a的对象 Promise body
。这是 API 网关期望 Lambda 函数返回的格式。
最后,我们将此源代码与 Lambda 函数关联起来。将以下代码添加到您的my-first-app-stack.ts
文件中:
// Under the instantiation of the API resource
const rollADiceFunction = new cdk.aws_lambda_nodejs.NodejsFunction(this, 'rollADiceFunction', {
entry: path.join(__dirname, 'rollADice', 'handler.ts'),
handler: 'handler',
});
diceResource.addMethod('GET', new cdk.aws_apigateway.LambdaIntegration(rollADiceFunction));
同时,我创建了一个新的 Lambda 函数,并将其执行与路由/dice
和 http 方法关联起来GET
(POST
等等PUT
...也可用)。
是时候重新部署基础架构了!在 AWS 控制台上,您应该会看到新的 API 网关:
点击它并转到stages
选项卡。您可以看到 API 的 URL。
将其复制并粘贴到浏览器或 Postman 中,并在末尾添加 /dice。您应该在响应正文中看到一个介于 1 到 6 之间的数字!
如果您留意首次响应的延迟,就会发现它相当长(约 100-200 毫秒)。这是因为 Lambda 函数处于冷状态。这意味着它已经有一段时间没有被调用了,AWS 基础设施需要启动一个新的 Lambda 函数实例来执行它。新的执行速度会更快,实际上,您会感觉 Lambda 函数就像在您的计算机上运行一样!
家庭作业🤓
现在您已经对如何创建 Lambda 函数和 API 端点有了基本的了解,接下来就可以创建您自己的 Lambda 函数和 API 端点了。我建议创建一个 Lambda 函数,它可以掷任意数量的骰子并返回结果。例如,如果您调用该端点GET /dice/3
,它应该返回一个介于 3 到 18 之间的随机数。
我唯一的建议是如何在 API 网关中使用路径参数。就像我们root
创建第一个资源时所做的那样,将资源添加到 中diceResource
作为'{diceCount}'
值。
这将创建一个新的路由,其中包含一个名为 的路径参数diceCount
,您可以在 Lambda 函数中使用它。只需创建一个新的 Lambda 并将类型用作{ pathParameters: { diceCount } }: { pathParameters: { nbOfDices: string } }
新处理程序的输入即可。剩下的应该很容易理解!
如果你遇到困难,请随时寻求帮助!我很乐意帮助你!你也可以在我的 GitHub 上查看这个代码库,查看解决方案,以及我们之前一起创建的两个 Lambda 函数。
结论
我计划每两个月更新一次这个系列的文章。我将涵盖一些新的主题,例如在数据库中存储数据、创建事件驱动的应用程序等等。如果您有任何建议,请随时联系我!
如果您能回复并分享这篇文章给您的朋友和同事,我将不胜感激。这将极大地帮助我扩大读者群。另外,别忘了订阅,以便及时收到下一篇文章的更新!
如果您想保持联系,这是我的推特账户。
文章来源:https://dev.to/slsbytheodo/dont-miss-on-the-cloud-revolution-learn-serverless-on-aws-the-right-way-1kac