【问题标题】:Using Moto to Mock Lambda Response returns 'b"error running lambda: (2, 'WaitNamedPipe', 'The system cannot find the file specified.')"'使用 Moto 模拟 Lambda 响应返回 'b"error running lambda: (2, 'WaitNamedPipe', 'The system cannot find the file specified.')"'
【发布时间】:2018-11-28 15:40:25
【问题描述】:

我正在运行一个单元测试 (Pytest),以调用一个模拟的 Lambda(使用 Moto)并期望得到响应。假设我们正在导入 boto3 并创建了一个 lambda 客户端常量。这是函数:

def invoke_lambda():
    request = {'message': 'Hello World!'}
    lambda_response = LAMBDA_CLIENT.invoke(
        FunctionName='hello-world-lambda',
        InvocationType='RequestResponse',
        Payload=json.dumps(request)
    )

    response = lambda_response['Payload'].read()
    print(response)
    return response

这是我的单元测试:

import zipfile

import boto3
from moto import mock_lambda

CLIENT = boto3.client('lambda', region_name='us-east-1')

# Expected response setup and zip file for lambda mock creation
def lambda_event():
    code = '''
        def lambda_handler(event, context):
            return event
        '''
    zip_output = io.BytesIO()
    zip_file = zipfile.ZipFile(zip_output, 'w', zipfile.ZIP_DEFLATED)
    zip_file.writestr('lambda_function.py', code)
    zip_file.close()
    zip_output.seek(0)
    return zip_output.read()

# create mocked lambda with zip file
def mock_some_lambda(lambda_name, return_event):
    return CLIENT.create_function(
        FunctionName=lambda_name,
        Runtime='python2.7',
        Role='test-iam-role',
        Handler='lambda_function.lambda_handler',
        Code={
            'ZipFile': return_event,
        },
        Publish=True,
        Timeout=30,
        MemorySize=128
    )

# Test function
@mock_lambda
def test_invoke_lambda():
    mock_some_lambda('hello-world-lambda', lambda_event)
    response = function_code.invoke_lambda()
    assert response['message'] == 'Hello World!'

在运行 Pytest 时,我看到 Lambda 响应是:b"error running lambda: (2, 'WaitNamedPipe', 'The system cannot find the file specified.')"

关于如何解决这个问题的任何想法?我从谷歌搜索中看到了一些指向 docker 的问题,但据我了解,Moto 应该能够开箱即用地运行这些东西,而无需在 docker 容器中运行它。帮助会很棒:)

【问题讨论】:

    标签: python aws-lambda pytest boto3 moto


    【解决方案1】:

    原来我只需要为 Windows 安装 Docker 并让 Docker 运行......我不再看到这个问题,所以我想一切都很好。 – SamN 刚刚编辑

    【讨论】:

      【解决方案2】:

      使用 moto 模拟 AWS lambda 需要 docker。
      如果 docker 没有运行,你会看到错误:

      'error running docker: Error while fetching server API version: (2, 'CreateFile', '系统找不到指定的文件')'

      来自文档https://github.com/spulec/moto

      【讨论】:

        猜你喜欢
        • 2011-12-30
        • 1970-01-01
        • 1970-01-01
        • 2022-01-24
        • 2014-07-13
        • 2020-01-24
        • 1970-01-01
        • 2022-12-22
        • 2020-04-22
        相关资源
        最近更新 更多