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

相關問題