如何使用Python在本地测试lambda?

问题描述 投票:0回答:5

有什么方法可以在本地测试 aws lambda 吗?我知道有一个名为“localstack”的包,但似乎没有多少人尝试过。

python amazon-web-services local aws-lambda
5个回答
30
投票

您可以像运行任何 python 脚本一样运行 Lambda 函数,例如

if __name__ == "__main__":
    event = []
    context = []
    lambda_handler(event, context)

如果您使用虚拟环境,这有助于确保您为 lambda 函数安装了所有必需的依赖项以及正确的 python 版本。

“localstack”中是否有您需要但本地没有的其他服务?


8
投票

我认为 Moto(一个允许您的测试轻松模拟 AWS 服务的库)可能非常有用。

假设您有以下要测试的 Python 代码:

 import boto3

 class MyModel(object):
    def __init__(self, name, value):
        self.name = name
        self.value = value

    def save(self):
        s3 = boto3.client('s3', region_name='us-east-1')
        s3.put_object(Bucket='mybucket', Key=self.name, Body=self.value)

花点时间想想过去你会如何测试它。

现在看看如何使用 Moto 进行测试:

import boto3
from moto import mock_s3
from mymodule import MyModel

@mock_s3
def test_my_model_save():
conn = boto3.resource('s3', region_name='us-east-1')
# We need to create the bucket since this is all in Moto's 'virtual' AWS account
conn.create_bucket(Bucket='mybucket')

model_instance = MyModel('steve', 'is awesome')
model_instance.save()

body = conn.Object('mybucket', 'steve').get()['Body'].read().decode("utf-8")

assert body == b'is awesome'    

随着装饰器包装测试,对 s3 的所有调用都会自动模拟出来。模拟保留了存储桶和密钥的状态。


8
投票

我在pip中使用了Python Lambda Local,https://pypi.python.org/pypi/python-lambda-local

希望对您有帮助。


2
投票

[自最初的问题以来,这已经改变了很多]

模拟 AWS 服务很困难,因为它们会发生变化。理想情况下,您在开发环境中使用实时服务。实时服务的问题是需要部署以..等待..测试每个更改。

如果您只需要开发或调试 lambda 函数本身,AWS SAM CLI 本地调用是一个不错的选择。

如果您还需要调用 S3、Dynamodb 等其他服务,Stackery CLI 是 AWS SAM CLI 的扩展,旨在使用 cloudstack 的权限针对实时云资源进行开发。

Stackery CLI 是独立于语言且免费的,但这里有一个 Python 无服务器快速入门以及一些其他资源


0
投票

测试更复杂的 AWS lambda 函数的最佳方法,其中开发时间和本地基础设施是关键。使用他们的官方 AWS Lambda docker 镜像

文档中的简单 Dockerfile 示例:

FROM public.ecr.aws/lambda/python:3.8

# Copy function code
COPY app.py ${LAMBDA_TASK_ROOT}

# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "app.handler" ]
© www.soinside.com 2019 - 2024. All rights reserved.