⚡️ 使用无服务器函数的 10 种方法
封面图片由@designecologist提供
在这篇文章中,我将向您展示一些使用无服务器功能的最强大和最有用的方法。
为什么是无服务器?
在我们讨论如何使用无服务器功能之前,让我们先来谈谈为什么要使用“无服务器”!
该术语起源于哪里?
“无服务器”这个术语在 2010 年左右开始在演讲和讨论中使用。据我所知,它第一次被提及是在 2010 年TechCrunch 关于一家名为 PiCloud 的初创公司的公告中。
我能找到的第一篇描述“无服务器”范式的思想领导力文章是Ken Fromm在 2012 年 10 月发表的一篇题为《为什么软件和应用程序的未来是无服务器的》的文章。
2014 年 11 月, AWS Lambda (函数即服务)发布后,该术语迅速被用户和支持者所接受,“Lambda 函数”也很快被称为“无服务器函数”。此后,许多其他云提供商和第三方服务也开始提供各自的函数即服务产品。
无服务器范式
自从无服务器功能被引入以来,这个术语已经发生了变化,并且多次被应用于任何不需要管理服务器或基础设施的服务或抽象。
在Ben Kehoe(iRobot 云机器人研究科学家)的文章中,他谈到无服务器是 “关注商业价值的结果。它是一种特质,是一个方向,而不是终点。”他还谈到了“无服务器频谱”,并表示“无服务器并非一个非此即彼的命题。它是一个频谱 — — 更重要的是,它有多个维度,无服务器的程度可以沿着这些维度变化。 ”
我认为,基本上,你越依赖托管服务和功能即服务,你的应用程序就越无服务器。你可以拥有一个完全无服务器的架构,也可以拥有一个仅在需要时利用无服务器的架构。
无服务器优势
在我的文章《无服务器计算时代的全栈开发》中,我深入探讨了我对无服务器化优势的看法。以下是使用无服务器函数并迁移到无服务器架构的主要优势:
我还喜欢 Ben Kehoe 的 3 点总结([此处])(https://read.acloud.guru/the-serverless-spectrum-147b02cb2292#60b2)。
无服务器技术还有助于简化构建事件驱动架构。无服务器功能可以由数十个事件源触发。
说到底,我喜欢无服务器的原因是它提供了开发者速度、按计算机付费以及默认的可扩展性。它让我能够快速轻松地尝试新事物。
⚡️ 使用无服务器函数的 10 种方法
现在我们已经概述了无服务器是什么以及为什么要使用它,那么您可以使用无服务器功能做什么呢?
1. 运行带路由的 Web 服务器
当我第一次开始学习如何使用无服务器功能时,令我震惊的事情之一就是我能够直接在功能中运行完整的快速服务器!
没错,您可以运行一个带有路由和所有依赖项的快速服务器,该服务器是您在无服务器功能中直接拥有的,而不必处理它所运行的实际服务器基础设施。
甚至还有有用的库可以帮助您轻松地为AWS和Azure启动和运行它。
我写了一篇博客文章,展示了如何快速部署这种类型的 API,请在此处查看。
如果您正在编写 Python,您也可以运行 Django 或 Flask 服务器。
2. 创建 Alexa 技能
如果您有兴趣开发 Alexa 技能,您可以将代码上传到 Lambda 函数,Lambda 将完成其余工作,根据 Alexa 语音交互执行该代码并自动为您管理计算资源。
以下是无服务器功能非常适合 Alexa 技能的几个原因:
- 您不需要管理或管理服务的任何计算资源。
- 您不需要 SSL 证书。
- 您无需亲自验证请求是否来自 Alexa 服务。执行函数的权限由 AWS 内部的权限控制。
- AWS Lambda 仅在您需要时运行您的代码并根据您的使用情况进行扩展,因此无需配置或持续运行服务器。
- Alexa 利用 TLS 加密与 Lambda 的通信。
- 对于大多数开发者来说,Lambda 免费套餐足以支持 Alexa 技能的功能。每月前 100 万个请求免费。请注意,Lambda 免费套餐不会自动过期,而是无限期有效。
有关如何使用 Lambda 创建 Alexa 技能的更多详细信息,请查看本教程。
3.处理图像/视频
无服务器功能最流行的用途之一是多媒体处理;执行响应文件上传的转换过程的功能的实现。
使用来自 Amazon S3 等服务的存储事件,您可以通过配置从图像或视频上传中调用的函数来自动执行此过程。
该函数的事件参数将包含有关已上传文件的元数据,允许您对其进行处理并将其存储回服务中或对其进行其他操作。
要查看其可能的外观示例,请查看为任何图像上传创建缩略图的此功能。
4.数据库事件
与存储事件类似,您可以配置一个 Lambda 表达式,以便从数据库操作中调用。如果您使用的是 AWS,则可以从 Amazon DynamoDB (NoSQL) 或 Amazon RDS (SQL) 调用函数。
这再次实现了一种非常简单的方法来集成事件驱动架构,而无需做大量的工作。
这对于各种用例都很方便,例如扩展数据库的基本功能、实现日志和分析流,或创建汇总报告和仪表板数据的服务
对于 DynamoDB,来自数据库操作的事件或事件流可能如下所示:
{
"Records": [
{
"eventID": "1",
"eventVersion": "1.0",
"dynamodb": {
"Keys": {
"Id": {
"N": "101"
}
},
"NewImage": {
"Message": {
"S": "New item!"
},
"Id": {
"N": "101"
}
},
"StreamViewType": "NEW_AND_OLD_IMAGES",
"SequenceNumber": "111",
"SizeBytes": 26
},
"awsRegion": "us-west-2",
"eventName": "INSERT",
"eventSourceARN": eventsourcearn,
"eventSource": "aws:dynamodb"
},
{
"eventID": "2",
"eventVersion": "1.0",
"dynamodb": {
"OldImage": {
"Message": {
"S": "New item!"
},
"Id": {
"N": "101"
}
},
"SequenceNumber": "222",
"Keys": {
"Id": {
"N": "101"
}
},
"SizeBytes": 59,
"NewImage": {
"Message": {
"S": "This item has changed"
},
"Id": {
"N": "101"
}
},
"StreamViewType": "NEW_AND_OLD_IMAGES"
},
"awsRegion": "us-west-2",
"eventName": "MODIFY",
"eventSourceARN": sourcearn,
"eventSource": "aws:dynamodb"
}
]
}
如您所见,如果我们有关于在数据库中存储或更新的项目的元数据,它是什么类型的操作(INSERT 或 MODIFY)、被存储的项目(NewImage
)、项目的大小以及旧项目(如果有)(OldImage
)。
5. 与数据库交互的 API 业务逻辑
使用数据库时,您通常会将数据库操作的业务逻辑存储在服务器上某个服务中。无服务器函数提供了一个完美的用例,可以减轻基础设施的负担,并使您能够快速启动 API。
您还经常会有一些不想暴露给客户端的私有变量,使用无服务器函数您可以轻松设置这些变量,并将它们作为环境变量安全地提供给数据库访问。
将其与无服务器快递之类的 Web 服务器相结合,可以让您轻松启动和运行真正的可扩展、企业级堆栈,为大多数应用程序奠定基础。
您可以从 GraphQL API 层(如 AWS AppSync(变异和查询))或 REST API 层(如 Amazon API Gateway)调用您的函数,以将 CRUD 操作/HTTP 事件方法发送到您的函数。
如果您想查看如何使用 AWS Amplify 在短短几分钟内启动并运行它的示例,请查看本教程。
6.处理短信
使用 Twilio 或 Amazon SNS 等服务,您可以轻松地在无服务器功能中处理短信。
无服务器函数中的事件对象将如下所示,为您提供元数据,例如发件人的电话号码、消息正文和消息的时间戳:
{
"Records": [
{
"EventVersion": "1.0",
"EventSubscriptionArn": "arn:aws:sns:us-east-2:123456789012:sns-lambda:21be56ed-a058-49f5-8c98-aedd2564c486",
"EventSource": "aws:sns",
"Sns": {
"SignatureVersion": "1",
"Timestamp": "2019-01-02T12:45:07.000Z",
"Signature": "tcc6faL2yUC6dgZdmrwh1Y4cGa/ebXEkAi6RibDsvpi+tE/1+82j...65r==",
"SigningCertUrl": "https://sns.us-east-2.amazonaws.com/SimpleNotificationService-ac565b8b1a6c5d002d285f9598aa1d9b.pem",
"MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e",
"Message": "Hello from SNS!",
"MessageAttributes": {
"Test": {
"Type": "String",
"Value": "TestString"
},
"TestBinary": {
"Type": "Binary",
"Value": "TestBinary"
}
},
"Type": "Notification",
"UnsubscribeUrl": "https://sns.us-east-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-2:123456789012:test-lambda:21be56ed-a058-49f5-8c98-aedd2564c486",
"TopicArn":"arn:aws:sns:us-east-2:123456789012:sns-lambda",
"Subject": "TestInvoke"
}
}
]
}
例如,查看此函数,它使用带有短信正文和消息发件人信息的变异来调用 GraphQL API。
7. 身份验证事件
在管理用户的身份验证流程(从注册到登录)时,您可能希望根据用户身份制定额外的逻辑。
例如,一个非常常见的用例是将用户放入一个组中,并根据用户的邮箱或其他属性授予他们额外的权限。一个很好的例子是,如果您有一个服务需要检查用户是否是学生,您可能希望将他们放入“学生”组中,并根据此标志授予或拒绝他们在应用中的权限。
另一个常见的用例是更新用户的元数据或根据用户身份将用户放入组中,例如,您可能有一组您知道将要注册的管理员,并且根据他们的电子邮件地址,您可以将他们放在这个管理员组中,或者根据他们是否是管理员为他们提供自定义属性。
您可以设置各种身份验证事件,以使用 Auth0 或 Amazon Cognito 等身份验证服务本机触发 lambda 函数。
以下是一些您可以挂钩的事件示例:
- 预注册(当用户提交信息进行注册时调用)
- 预身份验证(当用户提交其信息进行身份验证时调用)
- 自定义消息(发送定制的 MFA 消息)
- 后身份验证(用户身份验证后调用,允许您添加自定义逻辑)
- 确认后(用户确认后调用)
- 用户迁移(将用户从现有目录迁移到新的用户目录)
- 预令牌生成(在令牌生成之前调用,允许您自定义身份令牌中的声明)
要了解一些真实的身份验证触发器,请查看此处的示例。
8.聊天机器人
由于聊天机器人的特性,使用无服务器函数来处理逻辑非常合理。您可能不想为聊天机器人的运行构建和管理任何基础设施,而使用无服务器函数,您无需支付任何费用,直到它被大量使用为止。
如果您使用Amazon Lex等 AWS 服务编写聊天机器人,您甚至可以直接集成 Lambda 函数来处理自定义初始化和验证逻辑等内容。
9.物联网传感器输入消息
处理传感器数据时,您需要具备响应消息并进行扩展的能力。为此配置高容量的服务器意义不大。使用无服务器函数,您可以轻松地进行扩展和缩减,并且只需支付所使用的计算资源费用,而无需为峰值规模配置和维护服务器而承担资本支出。
如果您使用的是 Amazon IOT 等托管服务,您甚至可以使用内置的 Lambda 函数集成来根据服务中设置的规则处理传入的 MQTT 消息。
10.支付处理网关
使用支付处理 API 时,您通常需要一些不希望在客户端公开的密钥。使用无服务器函数,您可以将这些私钥隐藏在环境变量中,而无需耗费大量精力配置和管理服务器基础设施。要查看此示例,请查看本教程。
由于处理支付的事件驱动特性,无服务器功能也非常适合,允许您通过单个初始操作执行诸如发送电子邮件/通知、调用其他功能或与其他数据库或 API 交互等操作。
如果您有兴趣了解有关使用无服务器技术构建应用程序的更多信息,请查阅我的书《全栈无服务器》(O'Reilly Publications)。
文章来源:https://dev.to/aws/10-ways-to-use-serverless-functions-bme