亚马逊AWS官方博客

面向无服务器开发人员的 24 种开源工具:第 2 部分



本文章是来自 AWS Serverless 明星 Yan Cui 的访客贴。

这个连载包括两部分,在第一部分中,我们了解了部署框架并探索了部分最佳无服务器框架插件。我们还了解了 org-formationlumigo-cli 以及在使用 AWS 并构建无服务器应用程序时它们如何让您的生活变得更轻松。

在第 2 部分中,我们将了解在 Node.js 中编写 AWS Lambda 函数时可以使用的常用库,还将探索有用的 AWS Serverless Application Repository 应用程序,您可以利用它们处理很多常见杂务。

docker-lambda

如果您使用 AWS 无服务器应用程序模型 (AWS SAM)local invoke 或无服务器框架的 invoke local 命令,则佻可以随时使用 docker-lambda,这是一种复制实时 AWS Lambda 环境的 Docker 映像。除了在本地调用 Lambda 函数外,当您需要编译原生依赖性时它也非常有用。

middy

Middy 是用于 Node.js Lambda 函数的中间件引擎,用户可以利用它轻松地处理横切关注点,并将其封装到中间件内。超过 15 种内置中间件可用于解决共同关注点,例如设置 Amazon API Gateway 响应中的 CORS 标题。

我收藏了 ssmsecretsManager 中间件,它们实施将机密加载到 Lambda 函数的最佳实践。我的经验是从不将机密存储在环境变量中的未加密表单,这是攻击者设法损害我的应用程序时考虑的第一个位置,或许是通过受损或恶意依赖项。相反,我的建议是:

  1. 在冷启动过程中从 SSM 或 Secrets Manager 加载机密。
  2. 缓存机密,这样您不必每次调用都从源读取。
  3. 将机密设置为 context 对象,而非环境变量。
  4. 通过处理程序代码内的 context 对象访问机密。

输出显示:通过处理程序代码内的 context 对象访问机密。

或者,您还应启用缓存失效,并将有效期设置为几分钟。这样,当您在源中轮换机密时 — 您应这样操作 — 所有并发执行在其本地缓存失效后都将自动更新。

dazn-lambda-powertools

dazn-lambda-powertools 是一套 NPM 包,可以让您轻松地在 Node.js 中构建生产级无服务器应用程序。它的功能包括让您通过多种 AWS 服务捕获和转发相关性 ID。使用这些工具,您的函数将自动在其日志中包含相关性 ID。

输出显示:使用这些工具,您的函数将自动在其日志中包含相关性 ID。

另外,当您使用提供的 SDK 客户端(打包官方 AWS SDK 客户端)时,这些相关性 ID 将自动传播到下游函数。目前,支持的 AWS 服务包括:

图形显示:支持的 AWS 服务

轻量级日志记录程序支持采用 JSON 和可配置的日志级别的结构化日志记录。当日志记录程序与套装中的其他中间件共用时,您还可以启用对生产中的调试日志进行抽样的功能。通常,您在生产中从 WARN 级别记录日志,以降低日志大小以及与处理它们相关的成本。很多情况下,这意味着您会错误有用的调试日志消息,当生产中出现问题时它们可能有助于快速进行问题调试。抽样允许您在生产中保留小百分比的调试日志,它们有望包含每种场景和代码途径执行。出现问题时这些数据就可以派上用场,而您将不必再启用调试日志记录并重新部署应用程序。

抽样允许您在生产中保留小百分比的调试日志,它们有望包含每种场景和代码途径执行。

另外请务必注意,抽样发生在事务级,而不是单个函数。默认情况下,dazn-lambda-powertools 对 1% 的事务进行调试日志抽样。这样,即使事务涉及异步事件来源,例如 Amazon Simple Notification Service (Amazon SNS)Amazon Simple Queue Service (Amazon SQS)Amazon EventBridge 及更多,您也将看到相关 Lambda 函数中发生的每种情况。

如果您使用 Python,则还有用于 Python 的 aws-lambda-powertools 项目,它支持来自 dazn-lambda-powertools 的部分功能。

AWS Serverless Application Repository 应用程序

最后,介绍我在 AWS Serverless Application Repository 中找到的一些有用的应用程序。

lambda-janitor

部署之后,lambda-janitor 应用程序将清理整个区域中的旧版不使用的函数。这样,您就不必再时常担心达到 75GB 的代码存储限制。

内置有一些安全措施,确保它仅删除您不再使用的版本。例如,它不会删除别名仍在引用的任何版本。您还可以配置保留的最新版本数量,以使您在紧急情况下能够快速回滚到先前版本。

aws-lambda-power-tuning

aws-lambda-power-tuning 应用程序由鼓吹 Alex Casalboni 的 AWS 开发人员开发,您可以运行它部署的 Step Functions 状态机以帮助您找出适合函数的最佳内存设置。这是 lumigo-cli 的 powertune-lambda 命令支持的功能。我建议使用 lumigo-cli,因为它可照看此 AWS Serverless Application Repository 应用程序的部署和升级,确保您始终运行最新版的应用程序。

auto-subscribe-log-group-to-arn

auto-subscribe-log-group-to-arn 应用程序的行为与其宣称的不完全相同;它自动为您配置的 ARN 订阅 Amazon CloudWatch 日志组,这可以是 Lambda、Amazon KinesisAmazon Kinesis Data FirehoseAmazon Elasticsearch Service (Amazon ES)

部署之后,它将立刻为配置的目标订阅该区域中的现有的全部 CloudWatch 日志组。当您自己创建新日志组时或当您创建新 Lambda 函数时,还将自动为目标订阅该新日志组。如果您不想订阅该区域中的所有日志组,则可使用几个配置,通过前缀以及标签定位到特定日志组。

auto-set-log-group-retention

auto-set-log-group-rention 应用程序与 auto-subscribe-log-group-to-arn 关系密切,只不过它自动更新日志组的保留策略。

默认情况下,CloudWatch 日志组设置为**永不过期**。这涉及费用原因,因为 CloudWatch 每月收取 0.03 USD/GB 的费用。在 CloudWatch Logs 中永久保留日志几乎没什么用处,尤其是当您已将日志传输到其他位置时。

sfn-callback-urls

通过 Step Functions,您可以使用任务令牌执行回调模式。但是,它在有些情况下使用起来很复杂,例如发送包含回调链接的电子邮件,这经常需要添加 API Gateway 和 Lambda 来处理回调 URL。通过 sfn-callback-urls 应用程序,可以轻松而准确地实现此操作。

小结

就这么简单! 我希望您喜欢此包含两部分的连载文章,并学到如何借助开源工具让您在使用 AWS 和无服务器技术时变得更加轻松。

下面是我在此连载中提到的开源工具以及从哪里可以找到它们:

部署框架

无服务器框架插件

CLI

AWS Serverless Application Repository 应用程序

还有更多非常有用的开源工具,我在此无法一一介绍。例如,像 serverless-appsync-plugin 这样的工具就值得在此一提。

开源工具取决于其存活和发展的社区。如果任何这些工具引起您的共鸣,请在 GitHub 给它一颗星、加入其社区并为它们做出贡献。这可能是改进它们的文档、提出问题或对其代码进行改进。无论是什么,每种贡献都有意义!

Yan Cui

Yan Cui

Yan 是一位经验丰富的工程师,在 AWS 上大规模地运行生产工作负载已超过 10 年。他曾在多个行业担任过架构师和首席工程师,从银行业、电子商务、体育流式处理到手机游戏都有涉足。他曾广泛地将 AWS Lambda 用于生产,并曾作为独立顾问帮助世界各地的客户采用 AWS 和无服务器技术。

Yan 是 AWS Serverless 明星,并经常在国际性用户组和会议中发言。他是 Production-Ready Serverless (Manning) 的作者和 Serverless Architectures on AWS, 2nd Edition (Manning) 的合著者,经常在 theburningmonk.com 上发表博文。他的 Twitter 账号:@theburningmonk

本博文中的内容和意见属于第三方作者,AWS 不对本博文的内容或准确性负责。

精选图片来自 Pixabay