编者按:这是一篇博客文章的更新版本Iopipe.它现在是New Relic的一部分。

因为你毫无疑问地听到了,无刀有在跨越式发展和界限自从AWS Lambda发布以来。而且虽然不必管理服务器并仅为您使用的计算资源付费而不是提及框外的水平自动播放 - 可能听起来很声音,你怎么知道在哪里开始?

如果您是一个对无服务感兴趣的Python开发人员,您可能已经听说过无务框架,但也许您发现在一个不熟悉的生态系统中工作的前景,如node.js令人生畏。也许你不清楚框架所做的事情,或者如果它刚刚开始的人才矫枉过正。

如果这些问题与您交谈,那么你就会到达正确的地方。在此博客文章中,我将简要介绍无服务器框架,并向您展示如何使用它来构建Python的无要应用程序。

一些考虑因素

在我们跳进之前,让我们在路上得到一些问题。

是我的应用程序/工作负载权限吗?

这可能是您需要的最重要的问题。虽然无刀片提供了很多,但它并不适用于所有应用程序/工作负载。例如,AWS Lambda函数调用的当前最大持续时间为15分钟。如果您的应用程序/工作负载无法分为15分钟的块,则无操作系统不是最佳选择。

例如,如果您的应用程序使用WebSocket与服务器保持持久连接,则此连接将关闭,如果使用AWS Lambda,则需要每15分钟重新建立一次。您也支付所有计算工作负载的所有工作时间,该时间只是保持套接字打开。AWS最近介绍过WebSocket支持API网关通过将每个WebSocket Exchange分解为自己的功能调用来围绕上面描述的持久连接问题,但是长期运行的持久工作负载仍然适用。

另一方面,如果您的应用程序大多是无状态的,那么像REST或GraphQL API,那么无操作系统可能会很大,因为HTTP请求很少持续30秒,更不用说15分钟。

无服务器真的闪耀着可能有尖峰或低活动期的工作负载。当您的应用程序/工作负载尖峰时,AWS Lambda提供了相当大的水平缩放 - 默认情况下,它可以在框中处理1,000个并发请求(但您可以增加此限制)。当您的应用程序/工作负载在一段时间内,您的仪表在完全倾斜时不会运行,这可以节省更多运营费用。考虑一下:大多数应用程序/工作负载都提供一系列时区,为什么在您的客户睡觉时支付全价格运行您的应用程序/工作量?

如果您仍然不确定您的应用程序/工作量是否合适,这是一个方便的计算器将AWS Lambda与EC2进行比较。

我应该使用python 2或3吗?

Python Ecosystem在过去十年中经历了大量的变化 - 最重要的是Python 3的发布和从Python 2.x到3.x的许多代码库的转换对于新的无服务器项目,我们推荐Python 3.x.虽然Python 2.7服务了很多我们不再接收更新。所以,如果你还没有开始过渡到3。没有比现在更好的时间了。

如果您有现有的Python 2.7项目,那么你运气,因为AWS Lambda仍然支持2.7,但你应该认真考虑移植代码尽快到Python 3.x。我们在此帖子的其余部分提供的建议对于两个版本兼容。

我应该使用web API还是worker?

在讨论Python可用的无服务器工具之前,让我们更深入地研究一下我们的应用程序/工作负载。如果你的web应用程序服务的前端有几个web资产(HTML, JavaScript, CSS,和图像),不要为它们提供一个函数。这并不是说你不能,只是说你不应该。记住,使用AWS Lambda需要为函数的运行时间付费。把时间花在服务web资产上没有多大意义。事实上,由于您的前台可能有许多web资产,这可能会把一个简单的任务变成一个昂贵的负债。对于服务web资产,考虑一个内容交付网络(CDN) -亚马逊海滨是专门为此目的构建的AWS服务。(看看他们指南如何使用S3使用它。)

但这只涵盖了您的Web应用程序的前端。什么如果您的应用程序/工作负载根本没有前端?我们将打破我们在这篇文章中谈论的应用程序/工作负载分为两类:Web API(REST,GraphQL等)和工人。希望您已经在考虑应用程序的部分将通过Web API服务,以及在背景中运行的工作任务可以是哪些部件,因此您可以选择项目的合适工具。

在无服务器框架上构建“Hello World”功能

无务框架是一个完善的领导者,有充分的理由。他们已经将相当多的时间和精力放入开发人员体验中,使其成为其中最直观和可访问的无服务器的工具之一。它还提供了一个全面的功能,除了AWS Lambda之外还支持多个云供应商,并具有越来越多的插件生态系统。对于Python Developer,无服务器框架是一个很大的起点。

但Python开发人员可能希望注意到关于无服务器框架的大警告 - 它在Node.js中编写,这可能不是每个Python Dev的首选。但是,就像任何好工具一样,如果做得好,你甚至不应该注意到它在这里实施的语言,那么这种情况肯定可以在此处进行无服务器框架。你仍然需要安装节点和NPM,但您不需要知道任何JavaScript。

试一试吧。

第1步:设置项目

首先,安装节点和NPM:

npm install -g无服务器

您可以使用这两种方式访问CLI无服务器或者速记sls。让我们创建一个项目:

Mkdir〜/ my-formerless-project cd〜/ my-serverless-project sls create-n my-serverless-project -t aws-python3

在这里,我创建了一个名为的目录my-serverless-project并使用创建项目SLS创造。我还指定了一个模板-t aws-python3。无服务器与多个模板捆绑在一起,为您设置了一些可乐的默认值serverless.yml.。在这种情况下,我为Python 3.6指定了AWS模板。如果您的项目是Python 2.7,请使用AWS-Python2.。还有其他语言和云的其他模板,但这在本指南的范围之外。

- 我无服务器项目指定服务名称,您可以将其更改为您想要命名项目的任何内容。现在,让我们来看看内容my-serverless-project目录。跑步:

cat serverless.yml.

文件serverless.yml.加载有几个有用的评论,解释了配置的每个部分。(我建议阅读这些评论,因为它将在以后会有所帮助。)

第2步:写入和部署您的功能

让我们写一个Hello World等同于函数:

def handler(event, context): return {"message": "hi there"}

保存在你的my-serverless-project目录你好。我们通常称为处理程序,但您可以将功能命名为您想要的任何内容。

现在您有一个函数,通过添加它来制作无服务器框架serverless.yml.。编辑serverless.yml.并用以下替换功能部分:

功能:你好:handler:hello.handler

现在拯救serverless.yml.。要部署此功能,您需要确保已经配置了您的AWS凭据

当您准备部署时,运行以下内容:

SLS部署

部署可能需要几分钟。本质上是无服务器的框架:

  1. 创建基于的CloudFormation模板serverless.yml.
  2. 压缩云形成模板和你好进入zip存档
  3. 创建S3桶并将zip存档上传到它
  4. 执行CloudFormation模板,其中包括配置AWS Lambda函数,并将其指向S3 zip存档

您可以手动执行所有这些步骤,但是如果框架可以为您自动执行这些步骤,为什么还要这样做呢?部署完成后,使用以下命令测试它:

SLS Invoke -f Hello

您应该看到以下响应:

{“消息”:“嗨”}

恭喜,您刚刚创建了第一个无服务器功能。

构建高级功能

现在,我们将做一些更具有挑战性的事情 - 我们会制作HTTP请求并返回结果。

步骤1:创建HTTP请求函数

让我们创建一个名为的新文件httprequest.py.并添加以下内容:

导入请求def处理程序(事件,上下文):r = requests.get(“https://news.ycombinator.com/news”)返回{“内容”:r.text}

更新的功能部分serverless.yml.

功能:hello:handler:hello.handler httprequest:handler:httprequest.handler

现在重新部署函数:

部署sls调用-f httprequest

你现在应该看到一个ImportError.。这是因为请求未安装。使用AWS Lambda,您需要捆绑您想要使用的任何库。

你可以跑步pip安装请求-t安装请求车轮(及其依赖项),但AWS Lambda在64位Linux上运行。那么如果你正在运行Mac OS,你会怎么做?或窗户?或freebsd?

谢天谢地,无操作系统附带插件生态系统来填补空白。具体我们要安装无服务器 - Python-要求

sls插件安装-n serverless-python-requirements

将以下行添加到结尾serverless.yml.

插件: - 无服务器 -  Python-要求

此插件启用要求.txt.支持,所以添加一个要求.txt.文件到项目目录:

回声“请求”>>要求.txt

现在,下次部署时,将自动安装和捆绑要求。

但我们还没有解决我们的汇编问题。为此,您需要添加一个风俗部分serverless.yml.。在本节中,您可以添加自定义配置选项,但它也是插件寻找自己的配置选项的地方。我们的新风俗部分应该如下所示:

自定义:PythonRequirements:dockerizepip:true

本节介绍无服务器 - Python-要求在将Python包打包到zip归档文件中之前,先在Docker容器中编译Python包,以确保它们是针对64位Linux编译的。你也需要这样做安装Docker.为了使这个工作,但在你做完之后,这个插件将自动处理您定义的依赖项要求.txt.

现在再次部署和调用函数:

部署sls调用-f httprequest

即使你正在运行64位Linux,这也是更清晰的,你不觉得吗?

第2步:为HTTP请求功能设置一个工作者

在我们继续之前,让我们解释事件和上下文如何有用。

函数是事件驱动的,所以当您调用一个时,您实际上在AWS Lambda中触发事件。函数的第一个参数包含触发该函数的事件,该函数在AWS Lambda中表示为JSON对象,但传递给Python是该对象的问题。当你运行时SLS Invoke -f Hello,空的dict传递给函数。但是,如果它是API请求,它将包含表示为DICT的整个HTTP请求。换句话说,事件Dict充当您的功能的输入参数,函数返回输出。随着AWS Lambda,您的输出需要是JSON Serializable。(这是一些示例活动你可能会看到AWS lambda。)

第二个参数是AWS Lambda上下文,它是一个Python对象,其具有有关函数和当前调用的有用元数据。例如,每次调用都有一个aws_request_id.如果您想在日志中跟踪特定调用中发生了什么,这是非常有用的。(见AWS Lambda文档有关上下文对象的更多信息。)您可能不需要立即担心上下文对象,但您最终会发现在调试时有用。

那么,事件如何有用?嗯,如果您的应用程序/工作负载可以使用JSON Serializable输入并产生JSON Serializable输出,您可以将其插入AWS Lambda功能。

到目前为止,您已经实施了工人所需的内容。让我们说你想跑你的httprequest每10分钟运行一次;为此,将以下内容添加到serverless.yml.

功能:httprequest:处理程序:httprequest.handler活动: - 安排:速度(1​​0分钟)

并部署函数:

SLS部署

现在httprequest每十分钟自动触发一次。如果您想要更细粒度的控制,可以这样做指定特定时间这时你的函数应该被触发。您还可以使用它构建更复杂的工作流亚马逊简易通知服务(SNS)亚马逊简单队列服务(SQS)或其他AWS服务。

第3步:为HTTP请求功能设置Web API

早些时候我提到HTTP请求可以表示为事件。在Web API的情况下,Amazon的API Gateway服务可以触发函数的事件。除此之外,API网关还提供了一个主机名,可以接收HTTP请求,将那些HTTP请求转换为事件对象,调用我们的功能,并收集响应并将其传递给请求者作为HTTP响应。这可能听起来很复杂,但值得愉快的框架为我们摘要摘要。

因此,添加一个HTTP端点到serverless.yml.

函数:webapi:handler:webapi.handler事件: -  http:path:/方法:get

这看起来很像我们之前的计划工作任务,不是吗?与该任务中一样,您将此处理程序配置为handlehttp.事件和指定的小路(我们的HTTP请求路径)和方法(此处理程序将处理的HTTP方法)。因为我们已经添加了一个新的处理程序,所以我们需要创建它WEBAPI.PY.

导入JSON DEF处理程序(事件,上下文):返回{“statuscode”:200,“body”:json.dumps({“消息”:“我是http响应”})}

这个处理程序将从API网关接受一个事件,并以一个可序列化的JSON字典响应。在字典中有两个键:statuscode.,这是我们希望API网关响应的HTTP状态代码,并且身体,其中包含作为JSON序列化的响应的HTTP主体。API网关预计HTTP响应正文是一个字符串,因此如果我们希望我们的Web API响应JSON,我们需要在将其移回API网关之前序列化。

现在再次部署函数:

SLS部署

无服务器框架将提供端点:

端点:get  -  https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev

刚才发生了什么?简而言之,无服务器框架创建了我们的新函数,然后配置了一个AWS API网关来指向该函数。返回的端点是API网关提供的端点。

试试你的端点:

curl https://xxxxxxxxxx.execute api.us amazonaws.com/dev——东- 1.

您应该看到以下响应:

{"message": "I'm a HTTP response"}

恭喜,您刚刚创建了第一个无服务器Web API!您可能已经注意到API Gateway提供的URL提供非常丑陋。如果可能是更可读的东西,那将是一个更好的更好https://api.mywebapi.com/。好吧,有一个插件, 也。

清理

如果您正在玩耍,您现在拥有三个无服务器功能和API网关。但这些只是帮助您开始无服务开发的例子。你可能想要清理你的项目;要这样运行:

sls删除

而无服务器的框架将会处理剩下的事情。

想要了解监视,可视化和排除功能的故障?访问新的Relic无服务器的AWS Lambda了解更多并请求演示。

与此同时,从...中查看此解释者视频此次,“什么是无服务员可观察性,为什么这很重要?”:

Michael Lavers是新型遗物无服务团队的高级软件工程师。当他并没有帮助客户争吵他们的AWS Lambda职能时,他通常在帮助他的妻子 - 一个山羊农民 - 妓女约有80个奶牛。他是四个女儿的骄傲的父亲,其中一些实际上是计算机,迈克尔认为是他最高的成就。查看帖子

对新遗物博客的写作有兴趣吗?亚搏体育登入网给我们发一份建议书!!