【问题标题】:How can I test lambda in local using python?如何使用 python 在本地测试 lambda?
【发布时间】:2017-03-30 15:04:29
【问题描述】:

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

【问题讨论】:

  • Atlassian localstack 存在,但只测试 Lambda 函数可能有点矫枉过正。如果您必须同时测试更多 AWS 的东西,那一定很好。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 你能不能有一个lambda_handlercli_handler 函数,这样脚本既可以在命令行上使用传入的点击参数,也可以作为一个lambda函数工作?由于示例将导致 lambda 函数运行两次。
【解决方案2】:

我认为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 的调用都会自动模拟出来。模拟保持桶和键的状态。

【讨论】:

  • @mabe02 谢谢。我也会在其他帖子中使用它:)
【解决方案3】:

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

希望对你有帮助。

【讨论】:

    【解决方案4】:

    [与最初的问题相比,这已经改变了很多]

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

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

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

    Stackery CLI 独立于语言且免费,但这里有一个Python serverless quickstart a few other resources

    【讨论】:

      猜你喜欢
      • 2021-10-24
      • 2016-02-26
      • 2019-07-28
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-06
      相关资源
      最近更新 更多