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

时间:2017-03-30 15:04:29

标签: python amazon-web-services local aws-lambda

有什么方法可以在本地测试aws lambda吗?我知道有一个名字是' localstack'但似乎没有多少人尝试过它。

4 个答案:

答案 0 :(得分:13)

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

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

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

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

答案 1 :(得分:6)

我认为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的所有调用都会被自动模拟掉。模拟保持桶和密钥的状态。

答案 2 :(得分:5)

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

希望它对你有所帮助。

答案 3 :(得分:2)

[自原始问题以来,这已经改变了一堆]

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

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

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

Stackery CLI是独立于语言且免费的,但这是Python serverless quickstart a few other resources