Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x AWS API网关Lambda失败,状态为200_Python 3.x_Amazon Web Services_Aws Lambda_Aws Api Gateway - Fatal编程技术网

Python 3.x AWS API网关Lambda失败,状态为200

Python 3.x AWS API网关Lambda失败,状态为200,python-3.x,amazon-web-services,aws-lambda,aws-api-gateway,Python 3.x,Amazon Web Services,Aws Lambda,Aws Api Gateway,我正在编写一个微服务,我的lambda处理程序在请求体中使用JSON并构建一个Jinja2模板。我的Lambda函数工作正常,返回状态代码200,但当我通过API网关调用该函数时,得到502响应 def lambda_handler(event, context): try: file_object = s3.get_object(Bucket= 'bucket_name', Key='object_name') file_content = file_o

我正在编写一个微服务,我的lambda处理程序在请求体中使用JSON并构建一个Jinja2模板。我的Lambda函数工作正常,返回状态代码200,但当我通过API网关调用该函数时,得到502响应

def lambda_handler(event, context):
    try:
        file_object = s3.get_object(Bucket= 'bucket_name', Key='object_name')
        file_content = file_object["Body"].read().decode('utf-8')
        template = Template(file_content)
        rendered_template = template.render(resume = request_body)
        # Do some logic to place render in s3 and get path
        response = {
            'statusCode': 200,
            'header': {'Content-Type': 'application/json'},
            'body': 'path to file'
        }
        return response
    except Exception as e:
        print(e)
        raise e
我使用的请求主体类似于:

{
  "username": "john-doe",
  "location": "US",
  .
  .
  .
}
我收到的响应错误是:

{
  "errorMessage": "'str object' has no attribute 'lastName'",
  "errorType": "UndefinedError",
  "stackTrace": [
    "  File \"/var/task/resume_service.py\", line 39, in lambda_handler\n    raise e\n",
    "  File \"/var/task/resume_service.py\", line 25, in lambda_handler\n    generate = template.render(resume=request_body)\n",
    "  File \"/var/task/jinja2/asyncsupport.py\", line 76, in render\n    return original_render(self, *args, **kwargs)\n",
    "  File \"/var/task/jinja2/environment.py\", line 1008, in render\n    return self.environment.handle_exception(exc_info, True)\n",
    "  File \"/var/task/jinja2/environment.py\", line 780, in handle_exception\n    reraise(exc_type, exc_value, tb)\n",
    "  File \"/var/task/jinja2/_compat.py\", line 37, in reraise\n    raise value.with_traceback(tb)\n",
    "  File \"<template>\", line 28, in top-level template code\n",
    "  File \"/var/task/jinja2/environment.py\", line 411, in getitem\n    return obj[argument]\n"
  ]
}
{
“errorMessage:“'str object'没有'lastName'属性”,
“错误类型”:“未定义错误”,
“stackTrace”:[
“文件\”/var/task/resume\u service.py\”,第39行,在lambda\u处理程序中\n raise e\n“,
“文件\”/var/task/resume\u service.py\”,第25行,在lambda\u处理程序中\n generate=template.render(resume=request\u body)\n“,
“文件\”/var/task/jinja2/asyncsupport.py\”,第76行,在渲染中\n返回原始渲染(self,*args,**kwargs)\n“,
“文件\“/var/task/jinja2/environment.py\”,第1008行,在render\n return self.environment.handle\u exception(exc\u info,True)\n中,
“文件\”/var/task/jinja2/environment.py\”,第780行,在句柄\u异常\n重新调用(exc类型,exc值,tb)\n中,
“文件\”/var/task/jinja2/\u compat.py\”,第37行,在重新提升值中\n使用\u回溯(tb)\n“,
“文件\“\”,第28行,在顶级模板代码中\n”,
文件\“/var/task/jinja2/environment.py\”,第411行,在getitem中\n返回obj[参数]\n
]
}

为什么Lambda函数在我自己调用时成功,但在通过API网关调用时失败?

当使用API网关与Lambda代理集成时,API网关希望Lambda以所列的特定格式返回数据。您还需要在返回的响应中添加
isBase64Encoded
标志

{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "multiValueHeaders": { "headerName": ["headerValue", "headerValue2", ...], ... },
    "body": "..."
}
浏览一下代码,这看起来只有在函数成功返回时才适用,但如果出现任何错误,它将引发一个异常——这是API网关所不期望的;因此出现了502格式错误的代理

为了更清楚地了解这一点,请检查这两个请求之间的区别——来自控制台的请求和来自API网关的请求。因为我们必须设置一个特定的JSON负载来从控制台(或任何调用服务)调用函数,所以我会在处理程序之后打印事件,以检查API网关请求的事件结构,并在从控制台测试时使用它来查看是否仍然有效。我猜这样做是行不通的,因为错误声明“str object”没有属性“lastName”


如果这在控制台的API网关负载下工作,我将检查API网关的完整请求/响应日志和Lambda函数日志(打印事件),以更清楚地了解这两个请求之间的关系。

问题发生在Jinja2上。Jinja2具有多个创建函数,用于呈现具有给定参数的模板

render([context]):“此方法接受与dict构造函数相同的参数”

generate([context]):“对于非常大的模板,它不会一次呈现整个模板,而是逐个计算每条语句

由于模板的大小,它无法通过更改

rendered\u template=template.render(resume=request\u body)
致:
rendered\u template=template.generate(resume=request\u body)


问题已解决。

我是否遗漏了什么?LastName甚至不在函数中。您可以添加您的api getway映像吗?您是如何创建它的,似乎您没有在gateway中添加参数