5

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

然而,当我打电话从Chrome的邮差客户端相同的API,我得到500内部服务器错误和响应头包括从CloudFront的,X X-缓存→错误-amzn-ErrorType→AuthorizerConfigurationException
AWS API网关自定义授权者AuthorizerConfigurationException

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

 
      { 
       "policyDocument": { 
       "Version": "2012-10-17", 
       "Statement": [ 
        { 
        "Action": "execute-api:Invoke", 
        "Resource": [ 
         "arn:aws:execute-api:us-east-1:1234567:myapiId/staging/POST/*" 
        ], 
        "Effect": "Allow" 
        } 
       ] 
       }, 
       "principalId": "Foo" 
      } 

为什么请求从Chrome或失败卷曲,但相同的API测试工作正常,从API网关?

+0

它实际上意味着你的授权人未返回政策或返回无效的政策或返回的政策unauthorizing API请求。如果政策没有被返回,授权人代码会因为某种原因失败... – Prabhat

回答

1

找出造成问题的原因。从python lambda函数中,我返回了一个json字符串实例。相反,它应该是json对象。 奇怪的是,当我从API网关“测试”功能测试API时,相同的lambda函数没有错误。但是,当API从互联网(卷曲或铬)被称为失败。

#return policy_string ... this is incorrect. 
return json.loads(policy_string) 
5

AuthorizerConfigurationException通常表示由于权限错误,API网关未能调用授​​权人。

请确保您已正确配置了要由API网关调用的函数。一个容易重置的方法是删除并重新添加该函数给授权人。控制台然后会提示您添加必要的权限。

+0

嘿,鲍勃,你可以扩展一点关于我将如何“配置我的功能被API网关调用”吗? – Stretch

+0

@Stretch您必须允许API网关调用您的功能。有关使用AWS CLI的示例,请参阅[此问题](http://stackoverflow.com/questions/38027414/giving-aws-api-gateway-permission-to-invoke-lambda-function-using-boto3)。 –

+0

[本文档页面更详细](http://docs.aws.amazon.com/apigateway/latest/developerguide/integrating-api-with-aws-services-lambda.html)。简而言之,您的api-gw需要具有Lambda/Invoke权限。如果你通过swagger定义你的自定义授权者,确保authorizerCredentials中的角色具有lambda/invoke,并且可以通过api-gw(在可信实体中)保证。 – deddu

相关问题