创建的Node.js和AWS LAMBDA无服务器微服务在同行审核通过卡米洛·雷耶斯 , 琼尹 , Yaphi伯哈努·和莫里茨克罗格 。 感谢所有SitePoint的同行评审人员使SitePoint内容达到最佳状态!
如果您曾经想编写一个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
}
该函数接收三个参数:
事件 — Lambda传递给函数的“触发数据”的键值对字典。
上下文 -AWS内部信息,例如AWS请求ID,Lambda过期超时和日志信息。
有关更多信息,请参见:http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.htmlcallback —一个标准的异步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
它看起来应该与此类似:
单击蓝色按钮创建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)
});
});
};
以下是此代码的功能细分:
- 包括并初始化GitHub API。
- 定义与Lambda签名匹配的函数
handler
。 - 调用
handler
,它将向GitHub发出搜索请求,以搜索与“ sitepoint”匹配的所有存储库。 - 使用响应表Github,将创建一个包含每个回购的url和星数的映射。
- 最后,使用与API Gateway的预期Integration相匹配的HTTP响应(如object)来调用lambda回调。
上载到AWS Lambda
使用您熟悉的任何zip实用工具创建函数文件的zip文件。 我在OSX上使用了命令行zip
实用程序,如下所示:
zip -r lambdaupload.zip ./index.js ./node_modules/
要将代码上传到Lambda,请将“代码输入类型”选项从“ 内联编辑代码 ”更改为“ 上传zip文件” ,然后使用表单上传代码。
配置功能处理程序和角色
在此部分下,我们要设置一些值。 处理程序是上载的JavaScript文件中对Lambda函数的引用。 默认情况下,它设置为index.handler
。 这通过查找文件index
(在我们的情况下为index.js
)映射到我们的上载代码,并为handler
函数查找与我们的export.handler
对应的export语句。
使用以下信息填写“角色”字段,以为我们的Lambda函数创建基本角色:
- 角色 :从模板创建新角色
- 角色名称 :LambdaGetRole
- 策略模板 :简单的微服务权限
完成该部分后,单击蓝色的“下一步”按钮继续。 您应该看到一个“ Review”屏幕,其中概述了配置:
如果一切正常,请单击“ 创建功能”按钮以继续。
为我们的新功能分配触发器
现在我们的函数已经创建并初始化,我们需要一种方法来调用它。 现在是为该函数分配触发器的时候了。 对于我们的触发器,我们将使用API网关。
API Gateway是另一项AWS服务,可自动创建HTTP终端节点,您可以从中配置响应。 我们将附加Lambda函数作为API网关响应。
- 点击“触发器”
- 点击“添加触发器”
- 点击Lambda旁边的空白方块
- 选择“ API网关”
- 在安全下,选择“打开”
- 点击提交
以下GIF中显示了这些步骤:
成功添加触发器后,您应该在“ 触发器”选项卡下看到它已附加到您的函数中。
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之上构建了一些框架,可帮助简化此过程。
无服务器是当前最强大的无服务器框架。 但是,在撰写本文时,该框架正在进行从
0.5
到正式1.0
发行版的主要版本升级。 不幸的是,此升级不向后兼容。 目前,大多数来自0.5
的流行插件已被破坏,以等待1.0
版本的完成。无服务器及其可运行的插件有望提供非常全面的Lambda体验。 它提供了用于快速迭代的本地开发环境设置,自动Lambda代码部署,多个部署登台环境等等。
OpenLambda尝试通过提供本地开发经验来模拟Lambda环境。 它还提供了一些工具,可以简化Lambda代码的部署,从而实现快速迭代。 这可以弥补上面列出的Lambda的缺点之一。
你怎么看?
您会考虑将FaaS用于未来的项目吗? 也许您已经开始使用Lambda作为应用程序体系结构的一部分? 无论哪种方式,我都想听听您的想法。 请在下面的评论中分享您的想法!
From: https://www.sitepoint.com/getting-started-node-js-aws-lambda/