为4DN DCIC分叉。用于打包和部署lambda函数。
python-lambda-4dn的Python项目详细描述
python lambda是用于在aws lambda中开发和部署serverlesspython代码的工具集。
重要
这是nick ficano最初python lambda包的一个分支。 它不会定期更新,并根据我们的项目需要冻结。
征集投稿人
随着python lambda和pytube都在继续增长,我呼吁贡献者帮助构建新的特性,审查pull请求,修复bug,并保持总体代码质量。如果你感兴趣,请发邮件到nficano[gmail.com]。
说明
aws lambda是一个允许您编写python、java或node.js代码的服务,这些代码是响应诸如http请求或上传到s3的文件之类的事件而执行的。
使用lambda相对来说比较容易,但是捆绑和部署代码的过程并没有那么简单。
python lambda库通过提供一个工具集来简化烦人的部分,从而消除了开发python lambda服务的猜测工作。
要求
- python 2.7&3.6(在编写本文时,aws lambda只支持python2.7/3.6)。
- PIP(~8.1.1)
- virtualenv(~15.0.0)
- 虚拟说唱歌手(~4.7.1)
开始
首先,必须在aws帐户上创建名为lambda_basic_execution的iam角色,并附加lambdabasiceexecution策略。
在您的计算机上,创建一个新的virtualenv和project文件夹。
$ mkvirtualenv pylambda (pylambda) $ mkdir pylambda
接下来,通过pypi使用pip下载python lambda。
(pylambda) $ pip install python-lambda
从pylambda目录中,运行以下命令以引导项目。
(pylambda) $ lambda init
这将创建以下文件:event.json、__init__.py、service.py和config.yaml。
首先,在您选择的文本编辑器中打开config.yaml。在本教程中,唯一需要的信息是aws_access_key_id和aws_secret_access_key。您可以通过登录到aws管理控制台来找到它们。
接下来打开service.py,在这里您将找到以下函数:
defhandler(event,context):# Your code goes here!e=event.get('e')pi=event.get('pi')returne+pi
这是handler函数;这是aws lambda响应事件调用的函数。您将注意到,在示例代码e和pi中是dict中的值。aws lambda使用event参数将事件数据传递给处理程序。
因此,例如,如果您的函数正在响应http请求,event将是POSTjson数据,如果您的函数返回某些内容,则内容将在http响应负载中。
接下来打开event.json文件:
{"pi":3.14,"e":2.718}
在这里您可以找到示例代码中引用的e和pi的值。
如果您现在尝试运行:
(pylambda) $ lambda invoke -v
您将获得:
# 5.858 # execution time: 0.00000310s # function execution timeout: 15s
如您所述,lambda invoke命令获取存储在event.json文件中的值并将它们传递给您的函数。
event.json文件应该可以帮助您在本地开发lambda服务。通过将--event-file=<filename>.json参数传递给lambda invoke,可以指定替代的event.json文件。
当您准备好将代码部署到lambda时,只需运行:
(pylambda) $ lambda deploy
部署脚本将评估您的virtualenv并确定您的项目依赖项。它会将这些文件和处理函数打包成一个zip文件,然后上传到aws lambda。
现在您可以登录到AWS Lambda management console来验证成功部署的代码。
连接到API端点
如果你想开发一个简单的微服务,你可以很容易地将你的函数连接到一个http端点。
首先导航到AWS Lambda management console并单击您的函数。单击API端点选项卡,然后单击“添加API端点”。
在“API端点类型”下,选择“API G阿泰韦”。
下一步将方法更改为POST,将security更改为“open”,然后单击submit(注意:您应该保护它以便在生产中使用,opensecurity用于演示)。
最后,您需要更改函数的返回值以符合为api网关端点定义的标准,该函数现在应该如下所示:
defhandler(event,context):# Your code goes here!e=event.get('e')pi=event.get('pi')return{"statusCode":200,"headers":{"Content-Type":"application/json"},"body":e+pi}
现在尝试运行:
$ curl --header "Content-Type:application/json"\ --request POST \ --data '{"pi": 3.14, "e": 2.718}'\ https://<API endpoint URL> # 5.8580000000000005