我正在通过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代理集成。
答案 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()