使用Node.js和AWS Lambda创建无服务器微服务

创建的Node.js和AWS LAMBDA无服务器微服务在同行审核通过卡米洛·雷耶斯琼尹Yaphi伯哈努·莫里茨克罗格 感谢所有SitePoint的同行评审人员使SitePoint内容达到最佳状态!

使用Node.js和AWS Lambda创建无服务器微服务

如果您曾经想编写一个Web应用程序或API而又不会弄乱服务器,那么您可能正在寻找Amazon的Lambda 。 AWS是Amazon开发并公开提供的开发人员工具的集合。

在本文中,我们将使用Amazon Web Services(AWS)套件中的新工具Lambda并使其运行。 我们将使用Lambda创建HTTP GET端点,该端点将使用GitHub API发出请求,以从GitHub中提取存储库信息并返回JSON响应。

要继续阅读本文,您将需要一个自己的AWS账户。 您可以在https://aws.amazon.com/创建一个免费的AWS账户

什么是AWS Lambda?

Lambda标记行是“无需考虑服务器即可运行代码”。 乍一看,这听起来可能令人困惑。 代码实际上在哪里或如何运行?

无服务器和功能即服务

“无服务器”是您可能听说过的一个新的软件基础结构术语。 它用于描述按需执行代码的解决方案。 术语“无服务器”可能会引起误解,因为实际上,方程中仍然存在服务器。 更好的描述符是FaaS或“功能即服务”。

这两个定义均用于描述新的开发和部署体验。 这种新体验被认为是“无服务器的”,因为您作为开发人员不再需要管理,监视或扩展正在运行代码的任何服务器。 您只需将代码上传到FaaS提供程序(在这种情况下为AWS Lambda),然后FaaS提供程序将执行代码并在后台为您管理任何基础架构。

无服务器架构的优缺点

鉴于对“无服务器”架构的这种扩展定义,让我们看一下使用Lambda时的一些优缺点。

优点
  • 按需使用定价。

    传统的服务器托管使用循环计费周期。 您的服务器始终在使用资源并等待输入的情况下启动并运行。 您需要支付月费或年费,才能在结算周期内保持运行状态。

    Lambda使用按需定价,其中按功能使用计算计费。 这意味着,如果您的项目利用的Lambda功能并没有被大量使用,那么与传统的托管解决方案相比,您可以节省大量资金。

    Lambda定价如下:

    • 每100万个请求$ 0.20
    • 每GB秒的计算时间$ 0.00001667,每次执行舍入到最接近的100ms

    有关更多信息,请访问:https://aws.amazon.com/lambda/pricing/

  • 内置自动缩放

    在传统的托管基础​​架构中,有时您可能需要担心性能和扩展性。 随着应用程序流量和使用量的增加,您可能需要向基础架构中添加更多托管服务器,以适应需求。 这可能会给您的用户带来失败和瓶颈。 Lambda会在需要时静默扩展,从而消除了额外的认知开销。

缺点
  • 本地开发工作流程不一致。

    您可以在本地编写Lambda函数代码并进行隔离测试,但是,如果不创建自己的黑名单版本的Lambda,就无法在本地模拟生产环境。

Lambda关键概念

功能代码和触发器

Lambda有两个主要概念:代码和触发器。 代码是不言自明的。 在我们的例子中,这是您编写并上传到Lambda以产生所需行为的JavaScript代码。

上传后,代码将无法自行执行。 Lambda还有一个附加概念,称为“触发器”。 触发器是由其他AWS服务触发的事件,这些事件将数据传递给Lambda函数以执行。

一些示例触发器是:

  • 对AWS API Gateway的HTTP请求会触发Lambda代码
  • 每隔一段时间触发一次事件,例如CloudWatch Events中的cron作业
  • DynamoDB表将更新并触发Lambda代码

Lambda代码功能签名

您可以通过从JavaScript导出与期望的Lambda签名匹配的常规函数​​来定义Lambda函数。

exports.myLambdaFunction = (event, context, callback) => {
   // Use callback() and return 
}

该函数接收三个参数:

  1. 事件 — Lambda传递给函数的“触发数据”的键值对字典。

  2. 上下文 -AWS内部信息,例如AWS请求ID,Lambda过期超时和日志信息。
    有关更多信息,请参见:http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html

  3. callback —一个标准的异步JavaScript回调处理程序。
    有关更多信息,请参见:http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html#nodejs-prog-model-handler-callback

建立Lambda函数

要开始创建新的Lambda函数,请访问Lambda仪表板,网址为:
https://console.aws.amazon.com/lambda/home?region=us-east-1#/functions?display=list

它看起来应该与此类似:
AWS Lambda仪表板的屏幕截图

单击蓝色按钮创建Lambda函数以开始使用。

选择一个蓝图

下一个屏幕将提示您选择一个蓝图,并显示可过滤的蓝图列表。 单击空白功能选项,它应该在蓝图列表中的第一位。 该页面可用于将来参考以检查Lambda的其他实用程序。

配置触发器

以下屏幕是“ Configure Triggers” ,它应该看起来像:

“配置触发器”屏幕的屏幕截图

单击下一步绕过此屏幕。 设置功能后,我们将在以后分配触发器。

配置功能

配置功能屏幕上的字段的屏幕截图

在本节中,我们将为Lambda函数命名。 我将使用名称GithubGet 。 您也可以选择对该功能进行描述。

指定Lambda功能代码

默认情况下,Lambda UI设置为内联编辑代码 。 应该为您提供一个内联编辑器,它具有一个示例函数,如下所示:

在线功能编辑器的屏幕截图

内联编辑器需要很少的开销来启动和运行lambda代码,但是对于本教程,我们将做一些更高级的事情。

创建具有依赖关系的复杂函数

在大多数实际场景中,您将要使用通过npm安装的第三方库来创建更复杂的功能。

让我们创建一个使用npm依赖项的自定义函数,并将其上传到Lambda。 您可以按照以下步骤操作,也可以从示例存储库中随意获取代码。

创建一个新功能

让我们为新功能设置一个文件夹,然后从内部使用默认的package.json文件初始化npm:

npm init -f

接下来,我们将安装GitHub客户端:

npm install github

使用以下代码创建文件index.js

var GitHubApi = require('github');
var github = new GitHubApi();

exports.handler = (event, context, callback) => {

  github.search.repos({
    q: 'sitepoint',
    sort: 'stars'
  }, function(err, res){
    if(err){
      callback(err);
    }

    var results = res.items.map((repo) => {
      return {
        url: repo.html_url,
        stars: repo.stargazers_count
      };
    });

    callback(null, {
      statusCode: 200,
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify(results)
    });
  });

};

以下是此代码的功能细分:

  1. 包括并初始化GitHub API。
  2. 定义与Lambda签名匹配的函数handler
  3. 调用handler ,它将向GitHub发出搜索请求,以搜索与“ sitepoint”匹配的所有存储库。
  4. 使用响应表Github,将创建一个包含每个回购的url和星数的映射。
  5. 最后,使用与API Gateway的预期Integration相匹配的HTTP响应(如object)来调用lambda回调。
上载到AWS Lambda

使用您熟悉的任何zip实用工具创建函数文件的zip文件。 我在OSX上使用了命令行zip实用程序,如下所示:

zip -r lambdaupload.zip ./index.js ./node_modules/

要将代码上传到Lambda,请将“代码输入类型”选项从“ 内联编辑代码 更改为 上传zip文件” ,然后使用表单上传代码。

动画GIF,显示上传到Lambda流程

配置功能处理程序和角色

在此部分下,我们要设置一些值。 处理程序是上载的JavaScript文件中对Lambda函数的引用。 默认情况下,它设置为index.handler 。 这通过查找文件index (在我们的情况下为index.js )映射到我们的上载代码,并为handler函数查找与我们的export.handler对应的export语句。

使用以下信息填写“角色”字段,以为我们的Lambda函数创建基本角色:

  • 角色 :从模板创建新角色
  • 角色名称 :LambdaGetRole
  • 策略模板 :简单的微服务权限

上面提到的设置的屏幕截图

完成该部分后,单击蓝色的“下一步”按钮继续。 您应该看到一个“ Review”屏幕,其中概述了配置:

查看屏幕,汇总所选​​选项

如果一切正常,请单击“ 创建功能”按钮以继续。

为我们的新功能分配触发器

现在我们的函数已经创建并初始化,我们需要一种方法来调用它。 现在是为该函数分配触发器的时候了。 对于我们的触发器,我们将使用API​​网关。

API Gateway是另一项AWS服务,可自动创建HTTP终端节点,您可以从中配置响应。 我们将附加Lambda函数作为API网关响应。

  1. 点击“触发器”
  2. 点击“添加触发器”
  3. 点击Lambda旁边的空白方块
  4. 选择“ API网关”
  5. 在安全下,选择“打开”
  6. 点击提交

以下GIF中显示了这些步骤:

动画逐步介绍添加AWS Lambda函数触发器的步骤

成功添加触发器后,您应该在“ 触发器”选项卡下看到它已附加到您的函数中。

触发器选项卡,显示新创建的API网关触发器

API网关ID下将列出一个URL。 您可以在浏览器中访问此URL,并且应该看到类似于以下内容的JSON响应:

[{"url":"https://github.com/bodrovis/Sitepoint-source","stars":106},
{"url":"https://github.com/Azzurrio/moviestore","stars":80},
{"url":"https://github.com/bodrovis/SitepointMiniChat","stars":54},
{"url":"https://github.com/upchuk/d8-demo-modules","stars":34},

恭喜你! 您已在Lambda上成功部署并触发了代码。

Lambda的下一步和未来

希望该项目为您使用AWS Lambda奠定了良好的基础。 尽管我们在功能代码中使用了第三方客户端(GitHub)集成,但是可以用任何其他客户端API或数据库客户端连接来代替。

无服务器框架

本文已演示了设置Lambda的过程,该过程非常手动且有些短暂,但是还有其他方法可以配置和初始化由AWS API驱动的Lambda。

当前,在AWS API之上构建了一些框架,可帮助简化此过程。

  • https://serverless.com/

    无服务器是当前最强大的无服务器框架。 但是,在撰写本文时,该框架正在进行从0.5到正式1.0发行版的主要版本升级。 不幸的是,此升级不向后兼容。 目前,大多数来自0.5的流行插件已被破坏,以等待1.0版本的完成。

    无服务器及其可运行的插件有望提供非常全面的Lambda体验。 它提供了用于快速迭代的本地开发环境设置,自动Lambda代码部署,多个部署登台环境等等。

  • https://open-lambda.org/

    OpenLambda尝试通过提供本地开发经验来模拟Lambda环境。 它还提供了一些工具,可以简化Lambda代码的部署,从而实现快速迭代。 这可以弥补上面列出的Lambda的缺点之一。

你怎么看?

您会考虑将FaaS用于未来的项目吗? 也许您已经开始使用Lambda作为应用程序体系结构的一部分? 无论哪种方式,我都想听听您的想法。 请在下面的评论中分享您的想法!

From: https://www.sitepoint.com/getting-started-node-js-aws-lambda/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值