AWS Cloudfront从api请求返回403到S3存储桶

时间:2020-04-23 14:43:22

标签: amazon-web-services amazon-s3 amazon-cloudfront

我正在开发一个放大的React应用。从应用程序内部,我轮询了一个S3 bucket,我希望它会在几分钟后被填充。为了清楚起见,流程为:

  1. 用户将文本文件上传到S3,并且应用会在响应中获取文件url
  2. 应用程序随后使用aws api-gateway uri向S3 bucket发送请求,这会触发lambda,然后调用aws textract,而后者又会触发第二个{{1 }}写入lambda。第一个S3 bucket将jobId返回到应用程序。
  3. 然后该应用将轮询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,因为对于不存在的某些东西这完全是错误的代码。

我在这里有几个问题:

  1. 这是正确的方法吗(结果S3 bucket的分布为403)?
  2. 为什么使用cloudfront url而不是S3 bucket结果url时会得到403
  3. 如果第1点是正确的方法,我该怎么做才能修复第2点?

1 个答案:

答案 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