我正在开发一个放大的React应用。从应用程序内部,我轮询了一个S3 bucket
,我希望它会在几分钟后被填充。为了清楚起见,流程为:
S3
,并且应用会在响应中获取文件url aws api-gateway
uri向S3 bucket
发送请求,这会触发lambda
,然后调用aws textract
,而后者又会触发第二个{{1 }}写入lambda
。第一个S3 bucket
将jobId返回到应用程序。lambda
,以便使用jobId获取响应文件并将该文件显示给用户。最初,在轮询存储桶时,我会在api调用中使用结果存储桶url。
在本地运行应用程序时,此操作效果很好,因为存储桶url使用S3 bucket
协议,返回http
直到创建文件。
然后我为该应用程序创建了一个status code 404
发行版,并且轮询请求返回了错误:cloudfront
,这很合理。
但是,将应用的Cloudfront分发中的查看器协议行为从xhr.js:178 Mixed Content: The page at '<>my cloudfront url>' was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint '<my endpoint>'. This request has been blocked; the content must be served over HTTPS.
更改为Redirect HTTP to HTTPS
似乎无效。
因此,我想我可以为使用HTTP and HTTPS
的{{1}}结果存储桶创建第二个Cloudfront分布。
但是,当我现在运行api调用时,我得到一个S3
,而不再是https
。
因此,我尝试设置自定义错误响应,将403 status code
错误映射到404
。我等了很长时间,因为cloudfront可能要花一些时间,但这似乎没有任何改变。
更改应用程序中的代码以期望使用403
而不是404
,并且在将文件写入结果403
之后,我得到了文件并将其显示在应用程式。但是我不想指望404
,因为对于不存在的某些东西这完全是错误的代码。
我在这里有几个问题:
S3 bucket
的分布为403
)?cloudfront
url而不是S3 bucket
结果url时会得到403
?答案 0 :(得分:0)
因此,解决方案似乎是,不定义特殊的错误响应,而是按照here所述,实际上改变S3存储桶访问策略。
我的存储桶策略最初是:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject"
],
"Resource": "arn:aws:s3:::my-results/*"
}
]
}
然后我将其更新为:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject"
],
"Resource": "arn:aws:s3:::my-results/*"
},
{
"Sid": "PublicListBucket",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:ListBucket"
],
"Resource": "arn:aws:s3:::my-results"
}
]
}
这似乎解决了我的问题。但是,这似乎没有解释为什么我在使用cloudfront之前会先得到404
,而在使用cloudfront时会得到403
。