有点像 Celery,但更简单,并且有更多 Lambda
项目描述
爱情
仅 Python 的无服务器库,更像 RPC,更少面向 HTTP 服务。
状态:可用但未经过实战测试。欢迎 PR!
安装
Lovege 是一个没有外部依赖的 Python 库。只需安装和使用。
pip install lovage
您必须设置 AWS 凭证以使用环境变量、共享凭证文件或任何其他适用于 boto3 的方法进行部署。
概述
Lovage 是一个 Python 3 库,可以非常轻松地使用 AWS Lambda 函数将普通 Python 函数卸载到云中。
轻松调用函数
Lovege 让您在不了解 AWS API 的情况下调用函数。您将函数定义为代码库的一部分,使用@app.task装饰器,部署它,然后使用.invoke()or调用函数invoke_async()。函数参数、返回值和异常仍然可以照常使用。您无需担心序列化或 AWS API。一切都像正常的 Python 函数一样正常工作。
注意:只有在使用PickleSerializer. 默认情况下,JSONSerializer所有异常都转换为LovageRemoteException.
import lovage.backends
app = lovage.Lovage(lovage.backends.AwsLambdaBackend("lovage-test"))
@app.task
def hello(x):
return x + 1
if __name__ == "__main__":
app.deploy(root=".", requirements=["requests"])
print("hello.invoke(1) returned", hello.invoke(1))
划分功能
为每个功能定义单独的 IAM 策略很容易,以通过划分来增强您的安全性。您可以将每个功能的精细访问权限授予它所需的资源。
import boto3
import lovage.backends
import os.path
app = lovage.Lovage(lovage.backends.AwsLambdaBackend("lovage-test"))
# let this function send emails using SES as info@cloudsnorkel.com
EMAIL_POLICY = {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ses:SendEmail",
],
"Resource": "*",
"Condition": {
"StringEquals": {
"ses: FromAddress": "info@cloudsnorkel.com"
}
}
}
]
}
@app.task(aws_policies=[EMAIL_POLICY])
def send_email(x):
boto3.client("ses").send_email(Source="info@cloudsnorkel.com", ...)
if __name__ == "__main__":
app.deploy(root=os.path.dirname(__file__), requirements=["boto3==1.12.25"])
send_email.invoke_async()
Lambda 中生成的需求层
与其他解决方案不同,Lovage 在 Lambda 本身中收集和打包所需的库。每个部署都有一个自定义资源,获取需求列表作为参数,在 Lambda 中下载所有需求,直接上传到 S3,最后创建一个包含所有依赖项的 Lambda 层。这给了你:
- 更快的云本地依赖项下载和上传
- 没有本地开发依赖,只有 Python(不需要 Docker,不需要在 Linux 上运行等)
- 更快的代码更新,因为您不必压缩需求并将它们与您的代码一起上传
- 更干净的工作目录,没有从您的文件夹中复制任何依赖项,
site-packages也没有隐藏文件夹
import boto3
import lovage.backends
app = lovage.Lovage(lovage.backends.AwsLambdaBackend("lovage-test"))
if __name__ == "__main__":
app.deploy(requirements=["boto3==1.12.25", "requests", "Django>=2.0.0"])
# or...
app.deploy(requirements=open("requirements.txt").read())
其它功能
- CloudFormation 堆栈不会留下任何东西,无需任何特殊处理即可删除
- 无需部署任何东西即可轻松进行本地测试
- 不需要 Node.js
- 代码中的多功能配置
用法
该脚本将使用 Lambda、S3 和 CloudFormation 将一个函数部署到 AWS。然后它将执行该函数两次。首先它会等待函数完成并打印它的答案。然后它将异步执行它并立即将控制权返回给您的脚本。
import lovage
import lovage.backends
app = lovage.Lovage(lovage.backends.AwsLambdaBackend("lovage-test"))
@app.task
def hello(x):
print("hello world!")
return x + 1
if __name__ == "__main__":
app.deploy(requirements=[])
print("hello.invoke(1) returned", hello.invoke(1))
hello.invoke_async(2)
要删除函数,只需删除lovage-testCloudFormation 堆栈。您可以在创建
AwsLambdaBackend对象时选择名称。
本地测试
有时您不想等待完全部署,只想在本地迭代。Lovege 使这变得简单,
LocalBackend它是默认后端。app.deploy()什么都不做,任何函数调用都将在本地执行。使用时invoke_async()将创建一个新线程并且该函数将在那里执行。
import platform
import lovage
app = lovage.Lovage()
@app.task
def hello():
print("Hello locally from", platform.node())
if __name__ == "__main__":
app.deploy() # doesn't do anything
hello.invoke()
忽略文件
Lovege 会为 Lambda 函数打包当前工作目录中的所有文件并为您上传。如果您想避免包含某些文件,因为它们不是必需的,您可以创建一个名为.lovageignorece的文件.gitignore。那里列出的任何模式都将从包装中排除。
单独的环境
云开发中的一个常见用例是为开发、QA 和生产提供单独的环境。有时甚至为每个开发人员提供一个单独的环境。Lovege 为每个环境使用一个自包含的 CloudFormation 堆栈。无需担心本地或远程副作用。删除堆栈后,一切都消失了。
环境名称由赋予的第一个参数设置AwsLambdaBackend()。
app_dev = lovage.Lovage(lovage.backends.AwsLambdaBackend("lovage-dev"))
app_prod = lovage.Lovage(lovage.backends.AwsLambdaBackend("lovage-prod"))
警告:如果您使用AwsLambdaBackend.add_resource()向堆栈添加额外的 CloudFormation 资源,您可能必须手动删除这些资源。例如,如果您添加一个存储桶,您必须在删除堆栈之前确保它是空的。
可用配置
配置可以传递给@app.task()装饰器。例如:
@app.task(timeout=30)
def hello_world():
return 42
某些配置是特定于平台的,因此会有一个前缀,如aws_.
| 配置 | 目的 | 默认值 |
|---|---|---|
timeout |
以秒为单位设置 Lambda 超时。每个 Lambda 函数都有一个最长执行时间。 | 3 |
aws_policies |
要附加到 Lambda 函数的 IAM 策略文档列表。 | [] |
aws_vpc_subnet_ids |
要附加到 Lambda 函数的 VPC 子网列表。必须与aws_vpc_security_group_ids. |
[] |
aws_vpc_security_group_ids |
要附加到 Lambda 函数的 VPC 安全组列表。必须与aws_vpc_subnet_ids. |
[] |
最佳实践
- 始终指定
root以便您确定打包了哪些文件。您可以使用类似的东西from pathlib import Path; app.deploy(root=Path(__file__).parent.parent)轻松获取根文件夹。 - 始终
if __name__ == "__main__":在具有 Love 任务的文件中使用。全局代码将在本地和 Lambda 中执行。这可能会导致一些不需要的副作用。 - 您可能应该有一个单独的脚本来调用
app.deploy(). 无操作部署非常快,但仍然需要时间来压缩代码,检查 S3 上是否已经有最新版本,最后更新 CloudFormation 堆栈。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。