最后修改: 2个个7/01/2021
阅读时间:
无服务器是指由云提供商管理和分配服务器和资源的应用程序。 这意味着云提供商将动态分配资源。 该应用程序在可以由事件触发的无状态容器中运行。 上面的一个示例以及我们将在本文中使用的示例都是关于 AWS 拉姆达。
简而言之, 我们可以将“无服务器应用程序”确定为基于事件的基于云的系统的应用程序。 该应用程序依赖第三方服务, 客户端逻辑, 和远程呼叫(直接调用它 服务功能)。
无服务器框架是一个开放源代码框架。 它由命令行界面或CLI和托管的仪表板组成, 为我们提供了一个完全无服务器的应用程序管理系统。 使用框架可确保更少的开销和成本, 快速开发和部署, 并保护无服务器应用程序。
在继续安装无服务器框架之前, 您必须先设置节点JS。 在大多数操作系统上,该操作非常容易-您只需访问节点JS官方网站即可下载并安装。 请记住选择高于6的版本。0。0。
安装后, 您可以通过在控制台中运行来确认NodeJS可用。 它应该返回您已安装的节点版本:
您现在可以出发了, 因此,继续安装无服务器框架。
为了做到这一点, 请按照文档设置和配置框架。 如果你比较喜欢, 您只能为一个项目安装它, 但是在DevriX, 我们通常在全球范围内安装框架:
等待该过程完成,并通过运行以下命令来确保Serverless已成功安装:
在继续创建示例应用程序之前, 您应该在中创建一个帐户 亚马逊AWS。 如果您还没有, 就像去Amazon AWS并单击 “创建一个AWS账户” 在右上角,然后按照以下步骤创建帐户。
亚马逊要求您输入信用卡, 因此,您必须输入相应的信息才能继续操作。 成功注册和登录后,您应该看到AWS管理控制台:
伟大的! 现在开始创建您的应用程序。
在这一步中 我们必须使用AWS提供程序配置无服务器框架。 某些服务(例如AWS 拉姆达)在访问凭据时需要凭据,以确保您拥有该服务拥有的资源的权限。 AWS建议使用AWS Identity 和 Access M一个ager(我是)来完成此任务。
所以, 首先也是最重要的是创建一个 我是 用户 在 AWS 在我们的应用程序中使用它:
在AWS控制台上:
- 类型 IAM 在里面 “查找服务” 场地。
- 点击 “我是”。
- 去 “用户”。
- 点击 “添加用户”。
为了 “用户名” 使用任何您想要的。 例如, 我们正在使用 无服务器管理员。 为了 ”访问类型” 查看 “程序访问” 然后点击 “下一个权限”。
在那之后, 我们必须为用户附加权限, 点击 “直接附加现有政策,” 搜索 “管理员访问权限” 然后单击它。 继续点击 “下一个标签”
标签是可选的, 因此您可以点击 “下次点评” 和 “创建用户”。 完成并加载后, 页面上会显示一条成功消息,其中包含我们所需的凭据。
现在我们必须运行以下命令:
代替 钥匙 和 秘密 与上面提供的一个。 您的AWS凭证已创建为配置文件。 您可以通过打开 ?/。AWS /凭证 文件。 它应包含AWS配置文件。 目前, 在下面的示例中, 这只是我们创建的一个:
到目前为止做得好! 您可以继续使用以下方法创建一个示例应用程序 NodeJS 以及内置的启动模板。
笔记: 此外, 在文章中 我们正在使用命令, 这是的缩写。
创建一个空目录并输入。 运行命令
使用 创建–模板 命令指定可用模板之一, 在这种情况下, aws-nodejs, 这是一个 NodeJS “ Hello world”模板应用程序。
完成后, 您的目录应包含以下内容, 看起来像这样:
我们已经创建了新文件 处理程序。js 和 无服务器。yml。
这 处理程序。js 文件存储您的功能, 和 无服务器。yml 存储您稍后将更改的配置属性。 如果您想知道 。yml 文件是 简而言之, 它是一个 可读数据序列化语言。 熟悉它是一件好事, 因为在插入任何配置参数时使用它。 但是,让我们看一下我们所拥有的 无服务器。yml 立即提交:
服务:aws-sample-applic在ion
提供者:
名称:aws
运行时:nodejs12。X
功能:
你好:
处理程序:处理程序。你好
- 服务: –我们的服务名称。
- 提供者: –包含提供程序属性的对象, 正如我们在这里看到的 我们的提供商是AWS, 并且我们正在使用NodeJS运行时。
- 功能: –该对象包含可部署到拉姆达的所有功能。 在这个例子中 我们只有一个命名为 你好 指向 处理程序。js 你好函数。
在继续部署应用程序之前,您必须在这里做一件重要的事情。 早一点 我们使用配置文件为AWS设置凭证(我们将其命名为 无服务器管理员)。 现在您要做的就是告诉 无服务器 配置以使用该配置文件和您所在的区域。 打开 无服务器。yml 并在 提供者 在运行时下面的属性中输入以下内容:
概要文件:serverless-admin
地区:us-east-2
到底, 我们应该有这个:
提供者:
名称:aws
运行时:nodejs12。X
概要文件:serverless-admin
地区:us-east-2
笔记: 要获得该地区, 一种简单的方法是登录到控制台后查找URL:示例:
现在,我们有了有关生成的模板的必要信息。 让我们检查一下如何在本地调用该函数并将其部署到AWS Lambda。
我们可以通过在本地调用该函数立即测试该应用程序:
它调用函数(但仅在本地!), 并将输出返回到控制台:
现在, 如果一切顺利, 您可以尝试将功能部署到 AWS Lambda。
所以, 这么复杂吗? 不, 不是! 非常感谢 无服务器框架 这只是一个单行代码:
等待一切完成, 可能要花几分钟 如果一切正常,您应该以以下内容结束:
现在,让我们检查一下AWS中发生了什么。 转到Lambda(在“查找服务“ 类型 Lambda), 你应该看到你的 Lambda 函数已创建。
现在,您可以尝试从AWS Lambda调用您的函数。 在终端类型
它应该返回与先前(当我们在本地测试时)相同的输出:
您可以通过在 AWS Lambda 然后转到“监控方式”标签,然后点击“在CloudWatch中查看日志。”。
您应该在那里有一个日志。
现在, 您的应用程序中仍然缺少一件事, 但是这是什么。。。? 出色地, 您没有端点可以访问您的应用, 因此,我们使用 AWS API网关。
你必须打开 无服务器。yml 归档并首先清除注释。 您需要添加一个 大事记 在我们的职能范围内 http 财产。 这说明了 无服务器框架 在部署应用程序时创建一个API网关并将其附加到我们的Lambda函数。 我们的配置文件应以以下结尾:
服务:aws-sample-application
提供者:
名称:aws
运行时:nodejs12。X
概要文件:serverless-admin
地区:us-east-2
功能:
你好:
处理程序:处理程序。你好
事件:
-http:
路径:/ 你好
方法:获取
在 http 我们指定路径和HTTP方法。
而已, 让我们通过运行再次部署我们的应用程序
完成后, 一个新的东西应该出现在输出终端中, 这就是已经创建的端点:
让我们打开端点:
您应该看到您的函数正在执行, 返回输出, 以及有关请求的一些信息。 让我们检查一下Lambda函数中发生了什么变化。
打开 AWS Lambda, 然后点击您的功能。
我们在“设计师”我们拥有的标签 API网关 附加到我们的Lambda和API端点。
伟大的! 您已经创建了一个超级简单的无服务器应用程序, 将其部署到AWS Lambda, 并测试了其功能。 还, 我们使用 AWS API网关。
迄今为止, 我们知道我们可以在本地调用函数, 但是也, 我们可以使用serverless-offline插件离线运行整个应用程序。
该插件可在本地/开发计算机上模拟AWS Lambda和API网关。 它启动一个HTTP服务器,该服务器处理请求并调用您的处理程序。
要安装插件,请在应用目录中运行以下命令
然后在项目的 无服务器。yml 打开文件并添加 外挂程式 财产:
插件:
-无服务器离线
配置应如下所示:
服务:aws-sample-application
提供者:
名称:aws
运行时:nodejs12。X
概要文件:serverless-admin
地区:us-east-2
功能:
你好:
处理程序:处理程序。你好
事件:
-http:
路径:/ 你好
方法:获取
插件:
-无服务器离线
要检查我们是否已成功安装和配置插件运行
您应该看到以下内容:
现在,在您项目的根目录中, 运行命令
如你看到的, an HTTP 服务器正在监听端口3000, 您可以访问您的功能, 例如, 在这里,我们的hello函数具有http:// localhost:3000 / dev / hello。 首先,我们的回应与 API网关, 我们之前创建的。
到目前为止,您做得很好! 您使用Serverless拥有一个可以正常运行的应用程序。 让我们扩展我们的应用程序并添加 大查询 与其集成,以查看其工作方式以及集成方式。
大查询是一种无服务器的软件即服务(SaaS), 这是一种支持查询的经济高效且快速的数据仓库。 在我们继续将其与NodeJS应用集成之前, 我们必须创建一个帐户, 因此,让我们继续。
转到https:// cloud。谷歌。com并使用您的帐户登录, 如果您还没有,请创建一个帐户并继续。
当您登录到Google Cloud Console时, 您必须创建一个新项目。 点击徽标旁边的三个点,它将打开一个模式窗口,您可以在其中选择“新项目。”
输入项目的名称。 我们将使用 big询问-eXample。 建立专案后, 导航 大查询 使用抽屉:
当大查询载入时, 在左侧, 您将看到该项目的数据, 您可以访问的 以及公共数据集。 在此示例中,我们使用了公共数据集。 它被命名 covid19_ecdc:
播放数据集和可用表。 预览其中的数据。 这是一个每小时更新一次的公共数据集,其中包含有关 新冠肺炎 全球数据。
我们必须创建一个IAM用户-> 服务帐户才能访问数据。 所以, 在菜单中 点击 “ IAM和管理员,” 然后 “服务帐户。”
点击 “创建服务帐户” 按钮, 输入服务帐户名称,然后单击 “创建。” 下一个, 去 ”服务帐户权限”, 搜索并选择, “ 大查询 Admin”。
点击 ”继续,”这是最后一步, 在这里,您需要您的钥匙, 因此,请点击“按键并导出为 JSON格式。 将其安全地保存在某个地方, 我们稍后将需要它。 点击 完毕 完成服务帐户的创建。
现在, 我们将使用此处生成的凭据连接NodeJS BigQuery库。
您需要安装 BigQuery NodeJS库可在您刚刚创建的项目中使用它。 在app目录中运行以下命令:
第一的, 通过运行初始化npm
填写所有问题,然后继续安装 BigQuery 图书馆:
在继续更改函数处理程序之前, 我们必须携带先前创建的JSON文件中的私钥。 我们将要使用 无服务器环境 变量来做到这一点。 您可以在此处获取更多信息。
打开 无服务器。yml, 和在 提供者 属性添加 环境 像这样的属性:
环境:
PROJECT_ID:${file(https:// devrix。com / tutorial / build-application-serverless-framework-aws-bigquery / 配置 / bigquery-config。json):project_id}
CLIENT_EMAIL:${file(https:// devrix。com / tutorial / build-application-serverless-framework-aws-bigquery / config / bigquery-config。json):client_email}
PRIVATE_KEY:${file(https:// devrix。com / tutorial / build-application-serverless-framework-aws-bigquery / config / bigquery-config。json):private_key}
创建 PROJECT_ID, PRIVATE_KEY, 和 CLIENT_EMAIL 环境变量, 它具有与我们生成的JSON文件相同的属性(小写)。 我们已将其放置在 config 文件夹并命名 bigquery-config。json。
现在, 您应该最终得到无服务器的支持。yml文件如下所示:
服务:aws-sample-application
提供者:
名称:aws
运行时:nodejs12。x
概要文件:serverless-admin
地区:us-east-2
环境:
PROJECT_ID:${file(https:// devrix。com / tutorial / build-application-serverless-framework-aws-bigquery / config / bigquery-config。json):project_id}
CLIENT_EMAIL:${file(https:// devrix。com / tutorial / build-application-serverless-framework-aws-bigquery / config / bigquery-config。json):client_email}
PRIVATE_KEY:${file(https:// devrix。com / tutorial / build-application-serverless-framework-aws-bigquery / config / bigquery-config。json):private_key}
功能:
你好:
处理程序:处理程序。hello
事件:
-http:
路径:/ hello
方法:获取
插件:
-无服务器离线
现在打开 处理程序。js 并导入BigQuery库, 在文件的“使用严格”下方,添加以下行:
现在,我们必须告诉BigQuery库该凭据。 以此目的, 创建一个实例化的新常量 BigQuery 具有凭据:
const bigQueryClient = new BigQuery({
projectId:进程。环境PROJECT_ID,
credentials: {
client_email:进程。环境CLIENT_EMAIL,
private_key:进程。环境PRIVATE_KEY
}
});
下一个, 让我们创建我们的BigQuery SQL查询。 我们想检索有关的最新信息 新冠肺炎 保加利亚的案例。 在继续之前,我们正在使用BigQuery查询编辑器对其进行测试, 因此,我们创建了一个自定义查询:
SELECT * FROM`bigquery-public-data。covid19_ecdc。covid_19_geographic_distribution_worldwide` WHERE geo_id ='BG'ORDER BY date DESC LIMIT 1
好的! 现在,在我们的NodeJS应用中实现它。
打开 处理程序。js 并粘贴下面的代码
const query ='SELECT * FROM`bigquery-public-data。covid19_ecdc。covid_19_geographic_distribution_worldwide` WHERE geo_id=\'BG' ORDER BY date DESC LIMIT 1';
const 选项 ={
查询:查询
}
const [job]=await bigQueryClient。createQueryJob(options);
const [行数]=await job。getQueryResults();
我们已经创建了 query 和 options 常数。 然后,我们将查询作为作业运行,并从中检索结果。
我们还更改返回处理程序,以返回查询生成的行:
return {
statusCode:200,
正文:JSON。串化(
{
行数
},
空值,
2
),
};
让我们看看完整的 处理程序。js:
“使用严格”;
const {BigQuery}=require('@google-cloud/bigquery');
const bigQueryClient = new BigQuery({
projectId:进程。环境PROJECT_ID,
credentials: {
client_email:进程。环境CLIENT_EMAIL,
private_key:进程。环境PRIVATE_KEY
}
});
模块。出口。你好=异步事件=> {
const query ='SELECT * FROM`bigquery-public-data。covid19_ecdc。covid_19_geographic_distribution_worldwide` WHERE geo_id=\'BG' ORDER BY date DESC LIMIT 1';
const options ={
查询:查询
}
const [job]=await bigQueryClient.createQueryJob(options);
const [rows]=await job.getQueryResults();
return {
statusCode:200,
正文:JSON。串化(
{
rows
},
空值,
2
),
};
};
好的! 让我们在本地测试我们的功能:
我们应该看到输出:
继续部署应用程序以通过HTTP端点对其进行测试,因此运行
等待它完成并打开端点。 结果如下:
做得好! 现在,我们有了一个应用程序,可以从BigQuery检索数据并返回响应! 最后,让我们检查一下它是否可以离线运行。 跑
并加载本地端点:
做得好。 我们几乎快要结束了。 最后一步是稍微更改应用程序和行为。 代替 AWS API网关, 我们要使用 应用程序负载均衡器. 让我们在下一章中了解如何实现这一目标。
我们使用 AWS API网关。 在这一章当中, 我们将介绍如何用替换API网关 应用程序负载平衡器(阿尔巴)。
第一的, 让我们来看看与API网关相比,应用程序负载平衡器的工作原理:
在应用程序负载均衡器中, 我们会映射特定的路径(例如G。,/你好/)到目标组–一组资源, 就我们而言 这 Lambda 功能。
目标组只能具有一个与其关联的Lambda函数。 每当目标群体需要回应时, 应用程序负载平衡器向Lambda发送请求, 并且该功能必须使用响应对象进行响应。 像API网关一样, 这 ALB 处理所有HTTP请求。
ALB和 API网关. 主要区别在于API网关仅支持HTTPS(SSL), 而ALB同时支持HTTP和HTTPS。
但, 让我们来看看API网关的优缺点:
API网关:
优点:
- 出色的安全性。
- 实施起来很简单。
- 部署迅速,一分钟内即可完成。
- 可扩展性和可用性。
缺点:
- 面对高流量时,它可能会变得非常昂贵。
- 需要更多的编排, 这给开发人员增加了一定的难度。
- 性能下降 由于API场景, 可能会影响应用程序的速度和可靠性。
让我们继续创建ALB并切换到它,而不是使用API网关:
应用程序负载平衡器允许开发人员配置和路由传入的流量。 这是“弹性负载平衡。” 它是客户的单一联系点, 将传入的应用程序流量分布在多个目标上, 例如多个区域中的EC2实例。
让我们通过Amazon AWS中的UI创建应用程序负载平衡器(ALB)。 登录到“ AWS控制台”中的“查找服务。“ 类型 ”EC2”,然后找到“负载均衡器。”
点击 ”创建负载均衡器,“ 在下面 ”应用程序负载均衡器,“ 选择 ”创建.”。 为了一个名字, 输入您的选择, 我们使用了“样本相册“选择方案”面向互联网,” IP地址类型 ipv4。
在 ”听众”, 保留原样– HTTP和端口80。 可以为HTTPS进行配置, 尽管您必须先拥有一个域并进行确认,然后才能使用HTTPS。
可用区–适用 VPC 从下拉列表中选择一个,然后将所有标记为“可用区”:
点击 ”下一步配置安全设置”,提示您改善负载均衡器的安全性。 点击下一步。
在 ”第三步配置安全组“, at 分配安全组 选择“创建新的安全组。”接下来,点击“下一步:配置路由。”。 在第4步中,如上面的屏幕截图所示配置它:
点击 下一个, 下一个, 和 创建.
回到负载均衡器并复制ARN,如屏幕截图所示:
现在,我们必须更改无服务器。yml并删除API Gateway http属性。 在事件属性下, 删除http属性并添加alb属性。 函数对象应如下所示结束:
你好:
处理程序:处理程序。hello
事件:
-白:
listenerArn:arn:aws:elasticloadbalancing:us-east-2:115129174008:listener / app / sample-alb / ae6e398a898c48e6 / 67ce6bf319d0513d
优先级:1
情况:
路径:/ hello
保存文件并运行用于部署应用程序的命令
成功部署后,返回到AWS Load Balancers并找到您的DNS名称,如屏幕截图所示:
复制DNS名称并输入路径 /你好.
它应该可以工作,并最终为您提供下载内容的选项:)。 迄今为止, 应用程序负载平衡器运行良好, 但是应用程序需要为我们的最终用户返回正确的响应。 去做这个, 打开 处理程序。js 并将return语句替换为以下语句:
return {
statusCode:200,
状态描述:“ 200 OK”,
headers: {
“ Content-Type”:“ application / json”
},
isBase64Encoded:否,
正文:JSON。串化(行)
}
ALB的区别在于响应必须包含容器statusDescription, 标头 和isBase64Encoded。 请保存文件, 并再次部署, 但是这次不是整个应用程序, 但反而, 只有我们已更改的功能。 运行以下命令:
这条路, 我们只定义功能 hello 部署。 成功部署后, 再次访问带有路径的DNS名称, 您应该有适当的回应!
伟大的! 现在,我们已用Application Load Balancer替换了API网关。 应用程序负载平衡器比API网关便宜, 现在我们可以扩展我们的应用程序以满足我们的需求, 特别是如果我们希望流量会更高。
我们使用 无服务器框架, AWS, and BigQuery, 并涵盖了其主要用法。 无服务器是未来, 而且使用它来处理应用程序也毫不费力。 继续学习并深入研究无服务器框架,以探索其所有功能和秘密。 这也是一个非常简单易用的工具。
根据您的技术规范构建定制的解决方案。 提交您的提案或请求一个完整的发现会话,以确定您的要求并评估您的业务需求。
浏览更多:询问您的代理商发展教程
后端开发人员
你好! 我是Dimitar Dimitrov,并且是DevriX后端开发团队的成员。 我在销售和产品管理方面有经验, 但是成为开发人员一直是我儿时的梦想。 所以, 在DevriX,我的梦想成真了! 我喜欢与家人度过闲暇时光, 我也喜欢摄影 旅行和快车。 我也喜欢读书(惊悚片, 小说), 我最喜欢的作家之一是詹姆斯·罗林斯。