【问题标题】:AWS Cloudfront returning 403 from api request to S3 bucketAWS Cloudfront 从 api 请求返回 403 到 S3 存储桶
【发布时间】:2020-08-06 22:34:35
【问题描述】:

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

  1. 用户将文本文件上传到S3,应用在响应中获取文件 url
  2. 然后应用程序使用S3 bucket uri 向aws api-gateway 发送请求,这会触发lambda,然后调用aws textract,进而触发第二个lambda,它会写入S3 bucket。第一个 lambda 向应用返回一个 jobId。
  3. 然后应用将轮询S3 bucket,以便使用 jobId 获取响应文件并将该文件显示给用户。

最初在轮询存储桶时,我会在我的 api 调用中使用结果存储桶 url。 这在本地运行应用程序时工作正常,因为存储桶 url 使用 http 协议,在创建文件之前返回 status code 404

然后我为应用程序创建了一个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 似乎不起作用。

所以我想我可以为S3 结果存储桶创建第二个云端分发,因为它使用https。 然而,当我现在运行 api 调用时,我得到一个 403 status code 而不再是 404。 所以我尝试设置自定义错误响应,将403 错误映射到404。我等了好一会儿,因为云端可能需要一些时间,但这似乎仍然没有任何区别。 更改我的应用程序中的代码以期望 403 而不是 404 工作,并且在文件写入结果后一段时间 S3 bucket 我得到文件并将其显示在应用程序上。但我不想期待403,因为对于不存在的东西来说,这完全是错误的代码。

我在这里有几个问题:

  1. 这是正确的方法吗(为结果S3 bucket 分配cloudfront)?
  2. 为什么我在使用cloudfront url 时会得到403 而不是使用S3 结果url 时得到的404
  3. 如果第 1 点是正确的方法,我该如何解决第 2 点?

【问题讨论】:

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


    【解决方案1】:

    因此解决方案似乎是,不定义特殊错误响应,而是实际更改 S3 存储桶访问策略,如 here 所述。

    我最初的存储桶策略是:

    {
        "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

    【讨论】:

      猜你喜欢
      • 2020-08-12
      • 1970-01-01
      • 2019-03-30
      • 2016-12-08
      • 1970-01-01
      • 1970-01-01
      • 2017-07-04
      • 2017-09-27
      • 2019-04-13
      相关资源
      最近更新 更多