【问题标题】:CloudFront responds with 403 Forbidden instead of triggering LambdaCloudFront 响应 403 Forbidden 而不是触发 Lambda
【发布时间】:2017-08-20 01:20:15
【问题描述】:

这是调整图像大小并通过 AWS CloudFront 提供图像的 CDN 架构:

如果在 S3 存储桶中找不到图像,它会发出 307 临时重定向(而不是 404)以通过 API 网关访问 Lambda。 Lambda 调整图像大小(基于 S3 存储桶中的原始图像)并将其上传到 S3 存储桶中。浏览器再次永久重定向到带有新生成图像的 S3 存储桶。

当我想通过 CloudFront 访问同一图像时,我收到 403 Forbidden 错误。它来自 S3 或 CloudFront。如状态所示,这可能与访问权限有关。

为什么将 CloudFront 添加到工作请求链中会导致 403 错误?

什么有效:

https://{bucket}.s3-website-{region}.amazonaws.com/100x100/image.jpg

HTTP/1.1 307 Temporary Redirect
x-amz-id-2: xxxx
x-amz-request-id: xxxx
Date: Sat, 19 Aug 2017 15:37:12 GMT
Location: https://{gateway}.execute-api.{region}.amazonaws.com/prod/resize?key=100x100/image.jpg
Content-Length: 0
Server: AmazonS3

https://{gateway}.execute-api.{region}.amazonaws.com/prod/resize?key=100x100/image.jpg

HTTP/1.1 301 Moved Permanently
Content-Type: application/json
Content-Length: 0
Connection: keep-alive
Date: Sat, 19 Aug 2017 15:37:16 GMT
x-amzn-RequestId: xxxx
location: http://{bucket}.s3-website-eu-west-1.amazonaws.com/100x100/image.jpg
X-Amzn-Trace-Id: xxxx
X-Cache: Miss from cloudfront
Via: 1.1 {distribution}.cloudfront.net (CloudFront)
X-Amz-Cf-Id: xxxx

http://{bucket}.s3-website-{region}.amazonaws.com/100x100/image.jpg

HTTP/1.1 200 OK
x-amz-id-2: xxxx
x-amz-request-id: xxxx
Date: Sat, 19 Aug 2017 15:37:18 GMT
Last-Modified: Sat, 19 Aug 2017 15:37:17 GMT
x-amz-version-id: null
ETag: xxxx
Content-Type: image/png
Content-Length: 20495
Server: AmazonS3

什么不起作用:

https://{distribution}.cloudfront.net/100x100/image.jpg

HTTP/1.1 403 Forbidden
Content-Type: application/xml
Transfer-Encoding: chunked
Connection: keep-alive
Date: Sat, 19 Aug 2017 15:38:24 GMT
Server: AmazonS3
X-Cache: Error from cloudfront
Via: 1.1 {distribution}.cloudfront.net (CloudFront)
X-Amz-Cf-Id: xxxx

我已将 S3 存储桶作为源添加到 CloudFront

【问题讨论】:

  • 您是从 CloudFront 获得 S3 存储桶中所有对象的 403 还是仅获得一些(例如调整大小的图像)?
  • 只针对需要调整大小的图片。生成它们后(例如,直接调用 https://{bucket}.s3-website-{region}.amazonaws.com/100x100/image.jpg),URL https://{distribution}.cloudfront.net /100x100/image.jpg 开始工作。

标签: amazon-web-services caching amazon-s3 aws-lambda amazon-cloudfront


【解决方案1】:

错误是由于使用 REST 端点(例如 s3.amazonaws.com)来实现类似网站的功能(重定向、html 错误消息和索引文档)。这些功能仅由网站端点提供(例如 bucketname.s3-website-us-east-1.amazonaws.com)。

http://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteEndpoints.html

这让我很困惑,因为在创建 CloudFront 分配时,REST 端点是通过控制台中的自动完成提供的。必须手动输入正确的端点。

【讨论】:

  • 此解决方案还有第二个潜在的命中和未命中问题,您应该注意... S3 中的 非常 新对象仍可能触发丢失的对象重定向,因为如果在上传对象之前请求对象,则上传新对象的即时一致性不可用。我一直在努力寻求一种解决方案,该解决方案不仅考虑到这一点,而且还可以在一些额外的限制条件下工作,例如避免浏览器需要向多个域名发出请求(例如,API 网关位于原始 CloudFront 发行版的后面)不同的路径)。
  • 可能有更好的解决方案,但这足以满足我的要求。重定向错误消失了,如果一致性检查不可用,我看不到负面。可能是,但不是在我的环境中。
  • 很好,为您的问题和您自己的解决方案 +1。我只是想告诉你一些需要注意的事情。在我的环境中,图像来源是第三方,与我有合同安排的贸易伙伴,我不想重复获取和调整同一个图像的大小以避免给他们造成任何过载问题,所以偶尔会出现“它已经在几秒钟前的 S3 但我们不必要地重复了获取和调整大小的过程,因为存储桶索引尚未合并”更令人担忧。
【解决方案2】:

CloudFront 还缓存来自 S3 的 40x 50x 状态代码(文档:http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/HTTPStatusCodes.html#HTTPStatusCodes-cached-errors)。

您应该使调整大小的 img 路径的 Cloudfront 缓存无效。您可以通过从您的 Lambda 函数调用 CreateInvalidation API 来实现。

文档:

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Invalidation.html#invalidating-objects-api

【讨论】:

  • 但首先问题是要找出 403 的来源。根据日志,https://{distribution}.cloudfront.net/100x100/image.jpg 甚至没有触发 Lambda 函数。因此,不会调整图像大小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 2020-12-08
  • 2023-02-24
  • 2020-12-30
  • 2011-06-12
  • 1970-01-01
相关资源
最近更新 更多