Sigma IDE现在支持Python无服务器Lambda函数!

想想无服务器,使用Pythonic –全部在您的浏览器中!

(好吧,这则新闻已经过了几周了,但是仍然……)

如果您沉迷于整个无服务器的“事物”中 ,您可能已经注意到我们,一个在SLAppForge臭名昭著的人 ,对“无服务器的IDE”感到困惑。 是的,我们已经运行了很长一段时间的Sigma IDE (这是同类产品中的第一个),已经得到了全世界用户的反馈。

我们的标准反馈表中有一个问题: “开发无服务器应用程序时首选的语言是什么?” ; 带有选项NodeJavaGoC#和一个建议框。 令人惊讶的是(或可能不是),建议框是最受欢迎的选项。 除了两个以外,其他所有“替代”选项都是一个-Python

是Python!

我们甚至有一些用户想要取消他们的全新订阅,因为Sigma不像他们期望的那样支持Python。

因此,在我们的路线图会议之一中,整个Python的故事问世了; 我们决定试一试。

在故事发生之前,一些积分要整理好。

Hasangi是我们以前的开发人员之一,最初负责评估在Sigma中支持Python的可行性。 她离开后,我接手了。 现在,在这一胜利的时刻,我要感谢哈桑吉(Hasangi)率领整个Python行动。 👏

Chathura ,我们以前的另一个向导,已经使用Babel解决了IDE的整个NodeJS代码分析部分。 尽管在我的编译器理论讲座中有关于抽象语法树(AST)的课程,但经过他的代码后,我才真正“感受到”了AST的力量。 Chathura,这就是您的生命,它赋予了我们IDE的核心–并使我们的Python旅程大大加快了! 🖖

谢谢你

Chathura的工作很棒。 然而,这就像“水在水里”(哎呀,这是什么样的比喻?)。 换句话说,我们基本上是在ReactJS(yeah,JS)应用程序内解析(Node)JS代码。

因此,自然而然,我们的第一个问题(当时的百万美元问题)是:我们可以在JS应用程序中解析Python吗? 以及我们所有的魔术–为API调用呈现漂亮的弹出窗口,自动检测资源使用情况,自动生成IAM权限等吗?

Hasangi已经找到了filbert.js ,这是acorn的衍生版本,可以解析Python。 不幸的是,不久之后,我和她了解到它无法理解AWS SDK API调用的标准(也是最受欢迎的)格式,即命名为params

 s3.put_object( Bucket= "foo" , Key= "bar" , Body=our_data  ) 

如果我们改为使用“流利的”格式,请执行以下操作:

 boto.connect_s3() \ .get_bucket( "foo" ) \ .new_key( "bar" ) \ .set_contents_from_string(our_data) 

我们将不得不重写整个lotta AST解析逻辑; 也许是用于基于Python的用户区代码的全新AST解释器。 我们不想要那么多冒险-至少现在还没有。

(有用!!)

一个好的夜晚,我继续玩filbert.js 。 浏览解析路径时,我注意到:

 ... } else if (!noCalls && eat(_parenL)) { if (scope.isUserFunction(base.name)) { // Unpack parameters into JavaScript-friendly parameters, further processed at runtime var pl = parseParamsList();  ... node.arguments = args; } else node.arguments = parseExprList(_parenR, false );  ... 

等等...他们故意跳过命名参数吗?

如果我注释掉该状况检查该怎么办?

 ... } else if (!noCalls && eat(_parenL)) {  //   if (scope.isUserFunction(base.name)) { // Unpack parameters into JavaScript-friendly parameters, further processed at runtime var pl = parseParamsList();  ... node.arguments = args;  //   } else node.arguments = parseExprList(_parenR, false);  ... 

然后……嗯,我简直不敢相信自己的眼睛。

注释了两行,它已经开始工作!

那是我的关键时刻。 我要把Python引入Sigma。 无论。

我不能放弃。 不追随我刚刚看到的。

大重构

当我们诞生Sigma时 ,它应该更像是PoC –证明我们无需本地开发人员设置,仪表板和文档往返以及大量配置即可进行无服务器开发。

结果,那时的可扩展性和可定制性还不太成熟。 事情几乎与AWS和NodeJS绑定在一起。 (并认为我们仍然称它们为“ JavaScript”文件…😁)

因此,从解析器开始,一大堆重构都在等待着我急切的手指。 从Language抽象开始,我逐步完成了编辑器和弹出式渲染,代码段生成,构建工件,部署等工作。

( 在为Sigma提供Google Cloud支持时,我已经解决了类似的挑战-因此我对如何处理整个问题有一些了解。)

测试环境

自从Chathura(我们的前Adroit向导)一手实现它以来, 测试环境就成为Sigma功能集中最重要的一个。 如果Python产生了影响,我们还将需要一个Python测试环境。

这里的事情开始变得有些时髦。 由于它的历史有些尴尬 ,Python具有两个明显的“特色”:2.7和3.x。 因此,实际上,我们需要维护两个不同的环境-每个版本一个-并根据当前函数的运行时设置调用正确的环境。

(好吧,实际上,NodeJS也确实有同样的问题(6.x,8.x,10.x,...);但是显然我们没有考虑太多,也没有造成任何问题。也是主要问题!!)

pip install

我们还需要一种处理Python( pip )依赖项的新方法。 幸运的是,Lambda容器上已经提供了pip ,因此安装不是主要问题。 真正的问题是必须将它们直接提取到测试环境中的项目根目录中。 (与npm相反,这里的所有内容都进入一个漂亮且易于管理的node_modules目录中,以便我们可以一次性提取和清理内容。)幸运的是,一点点(希望很稳定!)代码带领我们完成了工作。

没有

一切运行顺利,直到…

 from subdirectory.util_file import util_func 
 , in <module> File "/tmp/pypy/ding.py" , line 1 , line from subdirectory.util_file import util_func  ImportError: No module named subdirectory.util_file 

仅在Python 2.7中发生过,因此这一点很容易弄清楚–我们需要在subdirectory内部有一个__init__.py来将其标记为可导入模块

我们决定不自己依靠用户来创建它,而是决定自己做。 每当创建Python文件时,我们现在都确保__init__.py在其父目录中也存在; 如果没有文件,则创建一个空文件。

该死的原木–它们功能异常!

SigmaTrail是我们Sigma IDE的另一个瑰宝。 逐段编写Lambda时,在代码窗口旁边放置一个日志窗格确实有帮助。 此外,如果您看不到刚运行的日志,那么测试环境有什么用?

Chathura再次成为SigmaTrail的策划者。 (是的,毕竟,他编写了一半以上的IDE!)他的代码是谦虚地解析CloudWatch日志,并将它们与Lambda调用返回的LogResult合并; 所以我想我可以将其插入Python运行时,坐下来欣赏一下视图。

我错了。

举起手来,那些使用Python

在Node中,您要从控制台中获得某种东西的唯一(显而易见的)方法(或从技术上来说是stdout )是通过其中一个console.{level}()调用。

但是Python提供了一些选择 –例如内置的printlogging模块。

如果要进行logging ,则必须:

  1. import logging
  2. 创建一个Logger并设置其处理程序的级别-如果要生成调试日志等。
  3. 涉及到适当的logger.{level}logging.{level}方法

是的,在Lambda上,您还可以

 context.log( "your log message\n" ) 

如果您的context仍然存在-仍然需要在末尾添加\n ,以便将其记录到自己的行中。

但是,仅print("your log message")更容易-哎呀,如果您使用的是2.x,则甚至不需要那些花括号!

对你有益。

但这对SigmaTrail造成了严重的问题。

uck

对于Node中的console.log ,Lambda自动为每个日志添加当前时间戳和请求ID( context.awsRequestId )。 Chathura利用这些数据来分离出日志行,并在SigmaTrail中将它们显示为不错的线索。

但是现在,有了print ,就没有前缀了。 什么都没捡到。

解决这个问题可能是工作中最困难的部分。 我花了大约一个星期的时间来尝试理解代码(由于使用了基于工人的模式); 然后又一个星期尝试在不破坏NodeJS流程的情况下对其进行修复。

到现在为止,它应该相当稳定-并且能够处理随着时间的流逝可能抛出的任何其他语言。

“真正的”运行时:与

测试环境复活后,我以为所有麻烦都结束了。 “传统”构建(由CodeBuild驱动)和部署非常易于重构,因此我很高兴–甚至为初始版本提高了环保标志。

但是我犯了一个严重的错误。

直到我实际上通过API网关触发器调用已部署的Lambda时,我才意识到这一点。

 { "errorMessage" : "Unable to import module 'project-name/func'" } 

什么...

 Unable to import module 'project-name/func' : No module named 'subdirectory' : No module named 

ma模块在哪里?

测试工作正常! 那么为什么不生产呢?

经过几次随机实验,并检查了其他框架生成的Python捆绑软件,我意识到罪魁祸首是我们的部署档案(zipfile)结构。

所有其他捆绑软件都具有顶层功能,但我们的捆绑软件将它们包含在目录(我们的“项目根目录”)中。 到目前为止,这对于NodeJS来说不是问题。 但是现在,无论我如何定义处理程序路径,AWS的Python运行时都找不到它!

改变项目结构将是一场灾难。 破坏几乎所有其他事物的风险太大。 一个更安全的想法是重写可用设置之一(例如特定于Python的环境变量),以某种方式将我们的根目录添加到PYTHONPATH

一个简单的技巧

是的,答案就在那里, PYTHONPATH ; 但我不想像这样覆盖掉来自AWS Gods的帮助。

因此,我开始深入研究Lambda运行时( 是的,再次 )以查找是否可以使用某些东西:

 import os  def handler(event, context): print(os.environ) 

给出:

 { 'PATH' : '/var/lang/bin:/usr/local/bin:/usr/bin/:/bin:/opt/bin' ,  'LD_LIBRARY_PATH' : '/var/lang/lib:/lib64:/usr/lib64:/var/runtime:/var/runtime/lib:/var/task:/var/task/lib:/opt/lib' ,  ...  'LAMBDA_TASK_ROOT' : '/var/task' ,  'LAMBDA_RUNTIME_DIR' : '/var/runtime' ,  ...  'AWS_EXECUTION_ENV' : 'AWS_Lambda_python3.6' , '_HANDLER' : 'runner_python36.handler' ,  ...  'PYTHONPATH' : '/var/runtime' ,  'SIGMA_AWS_ACC_ID' : 'nnnnnnnnnnnn' } 

LAMBDA_RUNTIME_DIR看起来是一个很有前途的选择; 但不幸的是,AWS拒绝了它。 每次部署均失败,并出现长期平均错误:

 Lambda was unable to configure your environment variables because the environment variables  you have provided contains reserved keys that are currently not supported for modification.  this request: LAMBDA_RUNTIME_DIR Reserved keys used in request: LAMBDA_RUNTIME_DIR 

但是,该调查显示出一些重要的信息:Lambda中的PYTHONPATH并不像我想象的那样复杂或拥挤。

 'PYTHONPATH' : '/var/runtime' 

显然,Lambda的内部代理商对此并没有太在意。 只需拉出并阅读/var/runtime/awslambda/bootstrap.py然后自己看看。 😎

ew

因此,我最终重写了PYTHONPATH ,以包含项目的根目录/var/task/project-name (除了/var/runtime )。 如果您希望在其中显示其他内容,请随时修改环境变量 -但不要把我们的片段留在后面!

从好的方面来说,这应该意味着我的功能也应该在其他平台上工作,因为PYTHONPATH应该是跨平台的。

Google Cloud for Python –即将推出!

经过一些调整,我们也可以使Python在Google Cloud Functions上运行。 它已经在我们的暂存环境中; 只要GCP上线,它就会很幸运! 🎉

还有很长的路要走……但是Python已经存在并且正在不断发展!

您可以在当前版本的IDE中编写Python函数。 只需单击“ 项目”窗格右上方的加号(+)按钮,选择“ 新建Python函数文件” (或“ 新建Python文件” ),然后开始魔术吧!

当然, 让我们-世界-知道事情的发展!

翻译自: https://www.javacodegeeks.com/2019/09/sigma-ide-now-supports-python-serverless-lambda-functions.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idle不是python自带的开发工具_Python的开发工具

通常情况下&#xff0c;为了提高开发效率&#xff0c;需要使用相应的开发工具。进行Python开发也可以使用开发工具。下面将详细介绍Python自带的IDLE 一使用自带的IDLE 在安装Python后&#xff0c;会自动安装一个IDLE。它是一个Python shell(可以在打开的IDLE窗口的标题栏上看到…

java se 导原码_Java SE 8新功能导览:Java开发世界中的重大变化

java se 导原码我很自豪&#xff0c;像其他专业团队成员一样&#xff0c;是采用OpenJDK的成员之一&#xff0c;但是从过去8个月就加入了&#xff0c;我们经历了Java SE 8 开发&#xff0c;编译&#xff0c;编码&#xff0c;讨论等各个阶段&#xff0c;直到将其付诸实践为止。 。…

linux将日期和日历信息追加到文件中_Linux任务调度

crontab 任务调度crontab 进行定时任务的设置概述 任务调度&#xff1a;是指系统在某个时间执行的特定的命令或程序。任务调度分类&#xff1a;1.系统工作&#xff1a;有些重要的工作必须周而复始地执行&#xff0c;如病毒扫描等 。2.个别用户工作&#xff1a;个别用户可能希望…

android sdk build-tools_从零开始仿写一个抖音App——视频编辑SDK开发(一)

本文首发于微信公众号——世界上有意思的事&#xff0c;搬运转载请注明出处&#xff0c;否则将追究版权责任。交流qq群&#xff1a;859640274。大家好久不见&#xff0c;又有一个多月没有发文章了。不知道还有哪些读者记得我的 从零开始仿写抖音App 的系列文章&#xff0c;这个…

爱默生E系列服务器机柜托盘,艾默生通信电源PS48300-3B/1800 一体化室内机柜

PS48300-3B/1800电源系统PS48300-3B/1800电源系统是艾默生网络能源集多年开发和网上运行经验&#xff0c;采用 DSP控制技术&#xff0c;为满足3G网络需求而设计的高可靠、高功率密度、高性能、全数 字化通信电源系统。根据交流配电和机柜高度。一、特点 1、休眠节能专利技术&am…

功能Java示例 第8部分–更多纯函数

这是第8部分&#xff0c;该系列的最后一部分称为“ Functional Java by Example”。 我在本系列的每个部分中发展的示例是某种“提要处理程序”&#xff0c;用于处理文档。 在上一期文章中&#xff0c;我们已经使用Vavr库看到了一些模式匹配&#xff0c;并且还将故障也视为数据…

tensorflow 小于_坐姿不对,屏幕就变模糊!教你用TensorFlow做一款“隐形背背佳”...

大数据文摘出品作为一个上班族&#xff0c;每天坐在电脑前那么久&#xff0c;难免出现腰酸背痛的情况&#xff0c;时间长了甚至脊柱都歪曲变形了&#xff0c;这可不行&#xff01;一定要克制住自己的坐姿。这里有款“隐形背背佳”&#xff0c;要不要了解一下&#xff1f;一位名…

python里随机抽取样本_概率分布和抽样分布基础知识及Python实现

本文主要介绍推论统计中的概率分布和抽样分布,本文结构如下: 一、概率分布 随机变量:在一定条件下,某件事情可能发生或者不发生,这个事件就叫随机事件。例如抛硬币哪面朝上。随机变量X就是用来量化随机事件的函数,是将随机事件每一个可能出现的结果映射到数值的一个函数。…

php 创建目录_使用SMB绕过PHP远程文件包含限制

译文声明本文是翻译文章&#xff0c;文章原作者mannulinux&#xff0c;文章来源&#xff1a;mannulinux.org 原文地址&#xff1a;http://www.mannulinux.org/2019/05/exploiting-rfi-in-php-bypass-remote-url-inclusion-restriction.html译文仅供参考&#xff0c;具体内容表达…

eas系统服务器地址,EAS7.0EAS7.5服务端及其客户端标准配置介绍

金蝶EAS是基于JavaEE的大型企业应用。目前服务端支持以下主流软硬件环境。适用版本&#xff1a;EAS7.0 EAS703 EAS7.51.金蝶EAS服务端支持的软硬件环境注&#xff1a;标志为部署支持的环境&#xff0c;可以正常安装配置&#xff0c;但是正式运行前需联系金蝶技术支持。2.客户端…

Java的Kafka:构建安全,可扩展的消息传递应用程序

使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证&#xff0c;管理和保护。 今天尝试Okta。 当今的用户希望可以通过其计算机&#xff0c;手机&#xff0c;平板电脑或任何其他设备访问您的应用程序&#xff01; …

background复合属性顺序_CSS有哪些好用的字体属性?

本文创建于2020年9月&#xff0c;以下为正文&#xff1a;CSS中有哪些字体属性呢&#xff1f;font&#xff1a;复合属性。设置或检索对象中的文本特征。font-style&#xff1a;设置或检索对象中的字体样式。用于定义字体的风格&#xff0c;如&#xff1a;斜体&#xff08;italic…

转译和编译_10个有趣又能编译为JavaScript的语言,你用过哪些?

点击上方“IT平头哥联盟”&#xff0c;选择“置顶或者星标”你的关注意义重大&#xff01;来源&#xff1a;https://www.sitepoint.com/现代应用相比普通的网页有不同的要求。但是浏览器是一个有着一套(大部分)固定可用的技术的平台&#xff0c;JavaScript依然是web应用的核心语…

OPC服务器如何采集设备的信息,如何将OPC服务器采集的设备数据转为MQTT方式,实现云端发布或订阅...

通过与PLC、智能仪表等硬件设备&#xff0c;以及OPC服务器、数据库等软件建立通讯&#xff0c;进行实时数据采集监控&#xff0c;然后将相关数据转换为数据库、OPC&#xff0c;以及MQTT、HTTP等多种服务接口&#xff0c;实现各类自动化与信息化系统软件灵活对接。MQTT智能网关案…

微信小程序摄像头监控_微信必备黑科技小程序!

↑点击上方蓝字关注极物推荐欢迎分享到朋友圈-不花冤枉钱&#xff0c;历史见真谛对于喜欢购物的朋友们&#xff0c;这绝对是一把利器。只需把商品链接复制粘贴到上面&#xff0c;就可以轻松的查阅到该商品的历史价格&#xff0c;轻松直观的了解商品过去的价格波动&#xff0c;同…

无线打印 airprint 服务器,如何让 Windows 的共享打印机支持 AirPrint

对很多办公室环境来说&#xff0c;局域网共享打印机往往都是刚需&#xff0c;而如果局域网内的设备大多为 Windows 设备&#xff0c;通过 网络共享 的方式就可以轻松将所连接的 USB 打印机共享到局域网。但对同一个局域网内的 Apple 设备而言&#xff0c;因为很多打印机的 Mac …

硒测试中所需的功能和示例

所需功能是用于声明一组基本要求&#xff08;例如浏览器&#xff0c;操作系统&#xff0c;浏览器版本等的组合&#xff09;的类&#xff0c;以对Web应用程序执行自动跨浏览器测试。 当我们尝试通过Selenium自动化测试来自动化测试脚本时&#xff0c;我们需要考虑这些组合&…

边沿触发是什么意思_集基耦合双稳电路,集成化单稳电路,数字逻辑电路,门电路,触发器...

1).箝位器能把脉冲电压维持在某个数值上而使波形保持不变的电路称为箝位器。它也是整形电路的一种。例如电视信号在传输过程中会造成失真&#xff0c;为了使脉冲波形恢复原样&#xff0c;接收机里就要用箝位电路把波形顶部箝制在某个固定电平上。下图中反相器输出端上就有一个箝…

鲸鱼优化算法_盘点 35 个 Java 代码优化细节

代码优化&#xff0c;一个很重要的课题。可能有些人觉得没用&#xff0c;一些细小的地方有什么好修改的&#xff0c;改与不改对于代码的运行效率有什么影响呢&#xff1f;这个问题我是这么考虑的&#xff0c;就像大海里面的鲸鱼一样&#xff0c;它吃一条小虾米有用吗&#xff1…

powerbi导入地图_Power BI系列教程之powerBI功能介绍及使用导引(一)

作为从事数据分析相关工作的小伙伴&#xff0c;我们总会遇到一些工作是每周、每月甚至每天都是重复做的工作&#xff0c;这个时候我们有没有一种结构化的方法来处理这一些数据呢&#xff1f;答案是肯定的&#xff0c;微软为了满足广大职场数据分析人员的需求&#xff0c;开发了…