Skip to main content

有点像 Celery,但更简单,并且有更多 Lambda

项目描述

爱情

操作状态 派皮 PyPI 版本 PyPI 状态 GitHub 星星

仅 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 堆栈。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

lovage-0.0.7.ta​​r.gz (20.7 kB 查看哈希)

已上传 source

内置分布

lovage-0.0.7-py3-none-any.whl (20.9 kB 查看哈希)

已上传 py3