“消息”:Lambda / API网关和iOS的“内部服务器错误”问题

时间:2017-07-15 16:01:59

标签: ios amazon-web-services amazon-dynamodb aws-lambda aws-api-gateway

我已经设置了一个lambda函数,并在API网关中创建了一些GET和POST方法,这些方法在Web应用程序中进行测试时似乎工作正常。 然后我尝试调用使用移动集线器设置的iOS应用程序中的函数。这些功能也可以通过移动集线器在测试设备内部完美地工作,但是当我实际测试app中的功能时,我得到了:

"message" : "Internal server error"

我知道错误并不多,但我无法找到一种方法来获得更详细的错误描述。

有什么想法吗?

6 个答案:

答案 0 :(得分:24)

这可能是因为您的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' });
};

应该解决问题。

答案 1 :(得分:0)

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;
};

答案 2 :(得分:0)

另一个可能的原因可能是API网关(10MB)和/或Lambda(6MB)的有效负载/请求/响应限制

答案 3 :(得分:0)

以上所有答案均不适用于我。我遇到了权限问题。以下是我的解决方法。

上下文

这是我的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文档。

答案 4 :(得分:0)

我在以下代码上遇到了同样的问题:

exports.handler = async event => {
  console.log("hello world");
  return {
    statusCode: 200,
    body: event
  };
};

要解决所有问题,请JSON.stringify() body

exports.handler = async event => {
  console.log("hello world");
  return {
    statusCode: 200,
    body: JSON.stringify(event), // <-- here
  };
};

答案 5 :(得分:0)

请尝试

  1. 授予执行lambda权限API网关
  2. 勾选复选框:使用Lambda代理集成
  3. 处理查询字符串,标头和正文的空指针。