如何使用 python 在本地测试 lambda?
How can I test lambda in local using python?
有什么方法可以在本地测试 aws lambda?我知道有个包叫 'localstack' 但好像没有多少人试过。
您可以 运行 您的 Lambda 函数就像 运行 任何 python 脚本一样,例如
if __name__ == "__main__":
event = []
context = []
lambda_handler(event, context)
如果您使用虚拟环境,这有助于确保为您的 lambda 函数安装所有必需的依赖项以及正确的 python 版本。
是否有您需要的 'localstack' 中存在而您在本地没有的其他服务?
我认为 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 的调用都会自动模拟出来。模拟保持桶和键的状态。
我在 pip 中使用了 Python Lambda Local,https://pypi.python.org/pypi/python-lambda-local
希望对你有帮助。
[自最初的问题以来,这已经改变了很多]
模拟 AWS 服务很困难,因为它们会发生变化。理想情况下,您在开发环境中使用实时服务。实时服务的问题是需要部署以..等待..测试每一个变化。
如果您只需要开发或调试 lambda 函数本身,AWS SAM CLI 本地调用是一个不错的选择。
如果您还需要调用其他服务,如 S3、Dynamodb 等,Stackery CLI 是 AWS SAM CLI 的扩展,旨在利用 cloudstack 的权限针对实时云资源进行开发。
Stackery CLI 独立于语言且免费,但这里有一个 Python serverless quickstart a few other resources。
有什么方法可以在本地测试 aws lambda?我知道有个包叫 'localstack' 但好像没有多少人试过。
您可以 运行 您的 Lambda 函数就像 运行 任何 python 脚本一样,例如
if __name__ == "__main__":
event = []
context = []
lambda_handler(event, context)
如果您使用虚拟环境,这有助于确保为您的 lambda 函数安装所有必需的依赖项以及正确的 python 版本。
是否有您需要的 'localstack' 中存在而您在本地没有的其他服务?
我认为 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 的调用都会自动模拟出来。模拟保持桶和键的状态。
我在 pip 中使用了 Python Lambda Local,https://pypi.python.org/pypi/python-lambda-local
希望对你有帮助。
[自最初的问题以来,这已经改变了很多]
模拟 AWS 服务很困难,因为它们会发生变化。理想情况下,您在开发环境中使用实时服务。实时服务的问题是需要部署以..等待..测试每一个变化。
如果您只需要开发或调试 lambda 函数本身,AWS SAM CLI 本地调用是一个不错的选择。
如果您还需要调用其他服务,如 S3、Dynamodb 等,Stackery CLI 是 AWS SAM CLI 的扩展,旨在利用 cloudstack 的权限针对实时云资源进行开发。
Stackery CLI 独立于语言且免费,但这里有一个 Python serverless quickstart a few other resources。