上下文
我有一个使用AWS trio构建的无服务器Web应用程序:API Gateway + Lambda + DynamoDB。 应用程序的第一页发送2个http请求以获取数据并组合响应以打印结果。
/ APIGateway /projects => Lambda (DynamoDB request) \
web app => { } => display data
\ APIGateway /organizations => Lambda (Github API request) /
问题
我第一次要求页面时,每次都很顺利。但是,如果我尝试刷新此页面,则会在403
请求中收到/organizations
错误。从那里,如果我等待~3-5分钟,我再次刷新页面,我正确地看到所有数据,我的页面完美显示。有时,GET /organizations
失败,有时候,它是GET /projects
。
为什么我必须等待才能正确刷新页面?我该如何解决?
其他信息
当我遇到403
错误时,...
200 OK
请求OPTIONS /organizations
响应
GET /organizations
请求(OPTIONS
请求在那里,但GET
没有)响应标头是:
Connection:keep-alive
Content-Length:60
Content-Type:application/json
Date:Mon, 12 Dec 2016 11:31:29 GMT
Via:1.1 af2dd53407c5eae7ddf5c44e27a5dd1b.cloudfront.net (CloudFront)
X-Amz-Cf-Id:Kl1JS1ZCCJuGAmydXv3qDoq3E-rFZrlZbs8Bgvw8RSrb8xsjEyAJNQ==
x-amzn-ErrorType:AccessDeniedException
x-amzn-RequestId:8689b86c-c05e-11e6-b851-7ff70d9a3125
X-Cache:Error from cloudfront
(我不知道为什么我有x-amzn-ErrorType:AccessDeniedException
和X-Cache:Error from cloudfront
)
我的Chrome控制台出现了CORS错误:
XMLHttpRequest cannot load https://********.execute-api.eu-central-1.amazonaws.com/prod/organizations. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. The response had HTTP status code 403.
(...即使启用了CORS且Access-Control-Allow-Origin:*
响应标头中存在OPTIONS
)
感谢您的帮助!
答案 0 :(得分:7)
此问题的根源是自定义授权程序,它为特定资源生成自定义策略。当缓存此策略时,当第二个请求到达时,它与先前生成的请求不匹配并返回错误。
在以秒为单位的结果TTL 中,键入 0 ,然后点击更新。现在,您必须部署API以发布更改:
def generatePolicy(principalId, context):
return {
'principalId': principalId,
'policyDocument': {
'Version': '2012-10-17',
'Statement': [{
'Action': 'execute-api:Invoke',
'Effect': 'Allow',
'Resource': 'arn:aws:execute-api:eu-central-1:123456789012:abcdefghij/prod/*'
}]
},
'context': context
}
使用数组
>可以在资源属性中更精确'Resource': [
'arn:aws:execute-api:eu-central-1:123456789012:abcdefghij/prod/GET/projects',
'arn:aws:execute-api:eu-central-1:123456789012:abcdefghij/prod/GET/user',
...
]
您可以允许资源的超集和拒绝特定的超集。
查看@Jeremiah的链接:https://forums.aws.amazon.com/thread.jspa?threadID=225934&tstart=0
答案 1 :(得分:1)
因此,自定义授权程序中的策略似乎是针对非常特定的资源生成的。该主题解释了它 - https://forums.aws.amazon.com/thread.jspa?threadID=225934&tstart=0