12

对于 Kinesis 流,我使用 AWS API Gateway 创建了一个代理 API。我使用 python Lambda 为代理添加了一个自定义授权方。在发布 lambda 函数并部署 API 后,我能够使用网关测试功能成功测试 API。我可以在 cloudwatch 中看到日志,其中包含来自自定义 auth lambda 函数的详细打印。成功验证后,API Gateway 将记录推送到我的 Kinesis 流

但是当我从 Chrome Postman 客户端调用相同的 API 时,我得到500 Internal Server Error并且响应标头包括X-Cache → 来自云端的错误,x-amzn-ErrorType → AuthorizerConfigurationException

Lambda 身份验证函数返回允许对我的 API 执行请求的策略。返回的政策文件是:

            {
              “政策文件”:{
                “版本”:“2012-10-17”,
                “陈述”: [
                  {
                    “动作”:“执行 API:调用”,
                    “资源”:[
                      “arn:aws:execute-api:us-east-1:1234567:myapiId/staging/POST/*”
                    ],
                    “效果”:“允许”
                  }
                ]
              },
              “principalId”:“Foo”
            }

为什么 Chrome 或 curl 的请求失败,但 API Gateway 的相同 API 测试工作正常?

4

4 回答 4

11

AuthorizerConfigurationException通常表示 API Gateway 由于权限错误而未能调用您的授权方。

请确保您已正确配置要由 API Gateway 调用的函数。一个简单的重置方法是删除该功能并将其重新添加到您的授权人。然后控制台将提示您添加必要的权限。

于 2016-07-28T15:12:42.883 回答
6

找出导致问题的原因。从 python lambda 函数,我返回了一个 json 字符串实例。相反,它应该是 json 对象。奇怪的是,当我从 API Gateway“测试”功能测试 API 时,相同的 lambda 函数没有出错。但是当从互联网(curl 或 chrome)调用 API 时,它失败了。

#return policy_string ... this is incorrect.
return json.loads(policy_string)
于 2016-07-28T15:19:43.930 回答
5

我遇到了同样的错误,在我的例子中是一个 nodejs 函数,我正在添加一个上下文键作为数组。

{
  policyDocument: {
  Version: '2012-10-17',
  Statement: [{
    Action: 'execute-api:Invoke',
    Effect: effect,
    Resource: `${arn.split('/').slice(0, 2).join('/')}/*`,
  }],
},
context: {
  roles: ['admin']
}

正如医生所说:

您可以通过调用 $context.authorizer.stringKey、$context.authorizer 来访问映射模板中上下文映射的 stringKey、numberKey 或 booleanKey 值(例如“value”、“1”或“true”)。 numberKey 或 $context.authorizer.booleanKey,分别。返回的值都是字符串化的。请注意,您不能将 JSON 对象或数组设置为上下文映射中任何键的有效值。

删除角色密钥并且它正在工作。

于 2019-04-29T00:49:10.457 回答
0

就我而言,我没有返回格式正确的 IAM 政策文档。我的 Authorizer 函数对如何从请求中获取一些参数做了错误的假设,并且默认结果不是正确的策略(这是我的具体情况)。我设法使用 CloudWatch 日志服务对其进行了调试,传统的日志记录指令来自我的函数代码。

于 2019-01-14T15:48:53.780 回答