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

时间:2019-08-14 17:20:02

标签: amazon-web-services amazon-s3 aws-lambda aws-api-gateway

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

我按照本教程Binary Support for API Integrations with Amazon API Gateway配置了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)}

这是我收到的:      {         “ message”:“内部服务器错误”      },状态代码为500。

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

2 个答案:

答案 0 :(得分:0)

该示例似乎不足以映射映射响应部分以支持传递。在这种情况下,将返回值更改为return {'status': True, 'statusCode': 200}可能会起作用。

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

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

我个人将更改: return {'status': True}return {'status': "Success"}并创建一个正则表达式,分别查找单词“ Success”和“ Error”。

我已经成功地将此blog post用于此技术(它也详细描述了两种方法之间的差异)。一旦完成一个映射工作,就可以对其进行调整,使其更适合您的实现。

编辑:最热的技巧是这些装饰器很棒,并且使python和lambda更加干净/容易but mostly for the proxy setup

答案 1 :(得分:0)

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

from User import User

def ask_for_input(question):
    answer = input(question)
    return answer.strip() # strip any user created white space.

def main():

   # Store our users
   users = []

   # Collect the user info
   id = ask_for_input(question = "ID ")
   first_name = ask_for_input(question = "First Name ")
   last_name = ask_for_input(question = "Last Name ")
   hair_color= ask_for_input(question = "Hair Color ")

   # Create our user object
   user = User(id=id, first_name=first_name, last_name=last_name, hair_color=hair_color)
   print(user)

   # accessing the id property
   print(user.id)

   users.append(user)

if __name__ == '__main__':
    main()