Lambda函数确实是一项很棒的技术 ,如果您还没有读懂我的理论,即无服务器 (尤其是AWS Lambda)将在2018年占领世界,那么请在此处查看:
它吸引了一些读者,并且以某种方式被标记为1月1日最受读者欢迎的中篇文章之一……我想这肯定是一个缓慢的新闻日。
无服务器到底能做什么?
我宣传这些无服务器技术非常好,但是并没有向您展示该技术的真正潜力。
因此,为了向您展示Lambda的真正潜力,我想我将汇总如何指导并向您展示该技术的真正作用!
UpTimeGirl简介—我最新的百万美元创业公司
在本文中,我将构建一个网站正常运行时间监视器,该监视器将允许人们填写表格,它将为您自动神奇地创建一个新的lambda函数,该函数将每15分钟检查一次您的网站运行状况,并向您发送这些网站之一死亡的电子邮件。 我将更多地关注面向Lambda的概念,并讨论诸如IAM和角色设置之类的事情。
每个优秀的创业公司都需要一个易记的名称,因此我们将其称为UpTimeGirl
网站监控服务,这是对Billy Joel的一种UpTimeGirl
吗?
免责声明:如果您从这个想法中赚了一百万美元,我希望至少有一杯啤酒!
要求
由于这是一个软件项目,因此需要一系列要求,否则我们将如何从项目中定义成功的任何形式? 当我想为我的所有站点构建一个世界一流的,价值数百万美元的监视解决方案时,我希望它具有以下要求:
- 它绝不能掉下去。
- 它必须便宜运行。 当然,我们需要最大化利润。
- 每当网站出现故障时,它都必须通过短信或电子邮件通知我
- 它必须扩展到数百个(如果不是数千个)站点。
我们将在不到半小时的时间内完成一个项目的一系列相当不错的要求,我想您会同意的。
前端
前端将是一个简单的VueJS应用程序,它将具有一个输入框和一个显示当前已注册网站的图块列表,该输入框将包含要监视的新站点。
为什么选择VueJS? —我目前正在尝试学习它,以为为什么不呢?
这只是一个非常简单的前端,如下所示:
如果您想要此源代码,则可以在我的github存储库中找到它: https : //github.com/elliotforbes/uptimegirl
我目前仅使用一个非常简单的HTTP GET
请求来触发构造lambda函数的Python API。
API
该API将使用Python编写,并将使用Boto3 AWS开发工具包使我能够与AWS的各种API进行交互。 该API本质上将采用URL
和time_period
,并将根据这些参数动态生成和创建新的Lambda函数。
免责声明:我可以保证这还没准备好生产。
在这段代码中,我们在Python 3.6中创建了一个简单的aiohttp REST API 。 这将具有2个主要端点,分别可以通过/funcs
和/create
访问的get_functions端点和create_lambda_function端点。
在get_functions()
函数中,我们仅返回一个json响应,其中包含当前在Lambda服务中注册的所有函数。
create_lambda_function()
函数很有趣。 在此,我们创建一个我们希望传递的所有环境变量的字典对象。在这种情况下,我们只是传递我们希望监视的URL
。 为了某种程度上确保唯一的函数名,我们然后使用一点点正则表达式魔术从URL创建一个字母数字函数名。
完成此操作后,我们将创建Code
字典对象,该对象将简单地将lambda.zip
文件作为字节传递。 然后,我们通过这两个env
字典和code
字典到AWS的create_function
功能,这样应该可以创造我们的lambda表达式我们。
之后,我们尝试通过使用put_targets()
函数并将我们已经在AWS控制台中定义的15分钟规则的名称和目标列表传递给我们,将CloudWatch Event触发器附加到我们新创建的lambda函数中,在这种情况下为单个目标。
一旦所有这些都愉快地运行了,我们就返回一个简单的非json(我知道……对不起)响应。
在github存储库中,我包括了一个可以在AWS ECS上运行和部署的dockerfile,如果您希望沿该路线运行,那么现在我将其全部保留在localhost上,因为显然还有很多开发工作要做做完了。
Lambdas
我们将动态创建的Lambda函数实际上将尝试使用简单的GET
请求来获取传递给它的所有URL。 然后,我们将根据用来触发每个功能的CloudWatch Event规则每15分钟运行一次。
如果这些计划的请求中的任何一个碰巧失败,它将自动向SNS发布事件,然后SNS将丢弃电子邮件并将文本消息发送给订阅该SNS的任何人。
编码
我们的lambda函数的代码非常简单。 它所做的只是尝试将GET
请求发送到URL,该URL从我们动态创建函数时设置的环境变量中获取。 如果此请求失败,则将引发异常。
如果我们希望我们的系统将任何错误通知我们,那么我们可以采用两种不同的方法之一。 我们可以扩展Lambda函数并添加将其发布到SNS主题所需的代码,也可以在我们的Lambda函数之一报告错误时引发的CloudWatch上设置警报。
为了简单起见,我们将选择后者:
和繁荣! 我们有一个警报系统,只要系统出现故障,它都会向我们发送电子邮件。
订阅该SNS主题的人员列表可以由前端动态修改,但是一旦我们通过了创业公司的第一轮融资,我们需要做一些工作。
我们正在生产中!
在不到半小时的时间内,我们已经能够使用一系列lambda函数成功构建一个完整的监控解决方案,这些lambda函数现已投入使用并投入生产。
它不仅具有令人难以置信的弹性,而且还可以扩展到潜在的数千个站点,并且由于我们创建的lambda的性质非常小,因此这样做的成本很小。
通过创建新的lambda来协调添加新站点的前端和API尚未在本文中部署到ECS,因为我觉得这超出了范围,但是如果您想以此为起点,则可以使用Dockerfile。 。 如果您真的很想使用元数据,则可以完全从Lambda函数提供前端应用程序,并使用API网关对其进行前端处理,然后将Python API划分为一系列Lambda端点,但是我将其作为后续任务读者!
仍然可以做很多事情来改善这一点,但我希望这个简单的示例有助于突出Lambda函数的强大功能以及如何使用它们。 在传统的应用程序中,您不仅必须编写大量代码,而且还必须将其部署在多个可用性区域中。 这些都代表了额外的复杂性,要花费更多的时间来构建和发布。
结论
希望您发现本文很有见地和愉快! 如果您需要进一步的帮助来设置这些lambda函数,请随时在下面的评论部分中发表评论或发布一条推文: Elliot Forbes
我也想加入LinkedIn 。
对于那些经常关注我并喜欢我的写作风格的人,我正在通过LeanPub出版我的第二本书,题为:通过故事介绍云开发! 如果您想同时支持我自己和EFF,请查看!