我已经设置了一个lambda函数,并在API网关中创建了一些GET和POST方法,这些方法在Web应用程序中进行测试时似乎工作正常。然后我尝试调用使用移动集线器设置的iOS应用程序中的函数。这些功能也可以通过移动集线器完美地在测试设备内部工作,但是当我实际测试应用程序内部的功能时,我得到:
"message" : "Internal server error"
我知道这个错误并不多,但我无法找到一种方法来获得更详细的错误描述。
有任何想法吗?
这可能是因为您的Lambda函数未设置为返回HTTP状态代码。
改变
exports.handler = (event, context, callback) => {
callback(null, 'Hello from Lambda');
};
至
exports.handler = (event, context, callback) => {
callback(null, { statusCode: 200, body: 'Hello from Lambda' });
};
应该解决这个问题。
JSON.stringify()
解决了我的问题。 response.body
需要采用String
格式,而不是JSON
。我希望这有帮助。
exports.sendRes = (body, status = 200) => {
var response = {
statusCode: status,
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(body)
};
return response;
};
另一个可能的原因可能是API网关(10MB)和/或Lambda(6MB)上的有效负载/请求/响应限制
上述答案都不适合我。我有一个许可问题。以下是我如何解决它。
上下文
这是我的lambda函数:
exports.handler = function(event, context, callback) {
callback(null, {
statusCode: '200',
body: JSON.stringify({ 'message': 'hello world' }),
headers: {
'Content-Type': 'application/json',
},
});
};
我使用terraform来配置api网关和lambda。我使用了这个blog post提供的示例代码。
诊断
在lambda控制台中,我在lambda上运行了一个测试事件。由于我的lambda是超级基本的,我使用了hello world测试模板,命名并保存。测试返回成功。
我检查了cloudwatch日志,但找不到任何有用的东西。我是AWS的新手,所以不确定我是否需要设置任何东西。
在api网关控制台中,我运行了一个测试事件。我刚刚将Content-Type:application/json
添加到事件的标题中并运行测试。无论出于什么奇怪的原因,测试结果都会在浏览器的右侧返回,因此必须向右滚动才能看到它们。
我得到了这个结果:Execution failed due to configuration error: Invalid permissions on Lambda function
解
我检查了api网关和lambda集成here的基本terraform示例,并注意到我错过了aws_lambda_permission
资源。这需要授予api网关调用lambda函数的权限。
对于那些不使用terraform的人来说,here是关于如何创建适当权限的aws文档的链接。