AWS 错误:代理集成无法配置为转换响应

问题描述 投票:0回答:5

我是 Amazon Lambda-API 实现的初学者。

我只是部署一个非常简单的 API:一个非常简单的 lambda 函数,使用 Python 2.7 打印“Hello World”,我使用 API Gateway 触发该函数。但是,当我单击 Invoke URL 链接时,它告诉我“{“message”:“内部服务器错误”}”。

因此,我试图看看这里出了什么问题,所以我单击 API 本身,我可以在方法执行中看到以下内容呈灰色:“集成响应:代理集成无法配置为转换响应。

我测试了许多不同的配置,但仍然面临同样的错误。我不知道为什么这一步是灰色的。

api amazon-web-services lambda aws-lambda aws-api-gateway
5个回答
18
投票

我在尝试集成API网关和lambda函数时遇到了同样的问题。基本上,花了几个小时后,我就明白了。 因此,当您创建新资源或方法时,默认设置使用 Lambda 代理集成

所以你需要删除它。按照集成请求并取消选中使用 Lambda 代理集成

你会看到下图

然后在ResourcesAtction选项卡中,选择Enable CORS

完成后,再次部署您的 API 并测试功能。 此外,本主题将解释幕后发生的事情。

祝你好运...


7
投票

Lambda 响应应采用特定格式供 API 网关处理。你可以在帖子中找到详细信息。 https://aws.amazon.com/premiumsupport/knowledge-center/malformed-502-api-gateway/

exports.handler = (event, context, callback) => {

var responseBody = {
    "key3": "value3",
    "key2": "value2",
    "key1": "value1"
};

var response = {
    "statusCode": 200,
    "headers": {
        "my_header": "my_value"
    },
    "body": JSON.stringify(responseBody),
    "isBase64Encoded": false
};
callback(null, response);

1
投票

当我开发前端时,我的 API 可以在 Postman 中运行,但不能在本地运行。当我尝试在我的资源上启用 CORS 进行 GET、POST 和 OPTIONS 时,我遇到了同样的错误,在搜索了 @aditya 答案后,我走上了正确的道路,但我不得不稍微调整我的代码。

我需要添加

res.statusCode
和两个标题,它开始工作。

// GET
// get all myModel
app.get('/models/', (req, res) => {
  const query = 'SELECT * FROM MyTable'
  pool.query(query, (err, results, fields) => {
    //...

    const models = [...results]
    const response = {
      data: models,
      message: 'All models successfully retrieved.',
    }
    //****** needed to add the next 3 lines
    res.statusCode = 200;
    res.setHeader('content-type', 'application/json');
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.send(response)
  })
})

1
投票

如果您使用 terraform 进行 aws 资源配置,您可以设置 “aws_api_gateway_integration” type =“AWS”而不是“AWS_PROXY”,这应该可以解决您的问题。


0
投票

我在尝试使 Lambda 函数包装器为 API 网关可见的异常生成标准错误响应时遇到了类似的问题。

我尝试了响应模型、基于选择模式的集成响应,但没有任何效果。最终的解决方案是不依赖 Lambda 函数包装器来生成异常的 JSON 表示形式,并按照 API 网关响应格式构建我自己的错误响应,其中包含 isBase64Encoded、statusCode、标头和正文字段。

© www.soinside.com 2019 - 2024. All rights reserved.