AWS API Gateway - Lambda - 内部服务器错误

Posted

技术标签:

【中文标题】AWS API Gateway - Lambda - 内部服务器错误【英文标题】:AWS API Gateway - Lambda - Internal Server Error 【发布时间】:2019-12-21 06:48:39 【问题描述】:

我正在通过 lambda 将图像上传到 s3,一切正常,没有错误,但 API Gateway 的响应是 500 Internal Server Error。

我按照本教程配置了我的 api-gateway:Binary Support for API Integrations with Amazon API Gateway。

我的 lambda 接收到 base64Image,解码并成功上传到 s3。

这是我的 lambda 代码:

def upload_image(event, context):
    s3 = boto3.client('s3')
    b64_image = event['base64Image']
    image = base64.b64decode(b64_image)

    try:
        with io.BytesIO(image) as buffer_image:
            buffer_image.seek(0)
            s3.upload_fileobj(buffer_image, 'MY-BUCKET', 'image')

        return 'status': True

    except ClientError as e:
        return 'status': False, 'error': repr(e)

这是我收到的: “消息”:“内部服务器错误” ,带有 500 状态码。

Obs:我没有使用 lambda 代理集成。

【问题讨论】:

你是如何导入boto3的?您的项目环境中是否包含 boto3? 是的,我的项目中包含了 boto3,并且我已经测试了我的 lambda 隔离,它运行良好。 【参考方案1】:

您需要在响应中返回一个标头,例如在 Python 中:

    return 
        "statusCode": 200,
        'headers':  'Content-Type': 'application/json' ,
        "body": json.dumps(body)
    

【讨论】:

【参考方案2】:

该示例在映射响应部分以支持传递方面似乎存在不足。在这种情况下,将您的退货更改为:return 'status': True, 'statusCode': 200 可能会起作用。

一般来说,使用 ApiGateway-Lambda 构建响应时有两种路径。一个是 lambda-proxy(您的 lambda 函数定义响应),另一个是 ApiGateway 转换您的响应并基于映射生成适当的标头/状态的地方。

示例中的路径适用于后者。

我个人会改变: return 'status': Truereturn 'status': "Success" 并创建一个正则表达式,分别查找单词“Success”和“Error”。

我已经通过这种技术成功地使用了这个blog post(它还详细描述了两种方法之间的差异)。一旦你得到一个映射工作,你可以调整它,使其更适合你的实现。

编辑:热门提示这些装饰器很棒,让 python 和 lambda 更清洁/更容易but mostly for the proxy setup

【讨论】:

以上是关于AWS API Gateway - Lambda - 内部服务器错误的主要内容,如果未能解决你的问题,请参考以下文章

AWS API Gateway - Lambda - 内部服务器错误

是否可以使用 AWS API 为 Lambda 函数设置 AWS API Gateway 端点?

通过 API-Gateway 将动态路径传递给 AWS-Lambda

如何将特定 AWS API Gateway 阶段连接到特定 AWS lambda 别名

使用代理通过 AWS API Gateway 的 Lambda 错误

如何调试 AWS Api Gateway 和 Lambda 的“AWS/ApiGateway 5XXError”