S3 支持的 CloudFront 和签名 URL

S3-backed CloudFront and signed URLs

最初我设置了一个 S3 存储桶 "bucket.mydomain.com" 并在我的 DNS 中使用了 CNAME,这样我就可以从那里提取文件,就好像它是一个子域一样。这适用于 http:

bucket.mydomain.com/image.jpg

或像这样的 https:

s3.amazonaws.com/bucket.mydomain.com/image.jpg

此存储桶中的一些文件可以 public 访问,但有些文件可以 "authenticated read" 访问,因此我必须生成一个已签名的 URL 并过期才能使它们成为 [=27] =].

我希望能够在 URL 中使用不带亚马逊名称的 https,因此我设置了一个以 S3 存储桶为源的 CloudFront 分配。现在我可以像这样使用 https:

bucket.mydomain.com/image.jpg

我现在遇到的问题是,似乎我存储桶中的所有文件都必须 public 读取,或者它们都必须经过身份验证才能读取。

如何强制将已签名的 URL 用于某些文件,但让其他文件 public 读取?

it seems either all my files in the bucket have to be public read, or they all have to be authenticated read

这在某种程度上是正确的,至少在简单的配置中是这样。

CloudFront 有一个称为源访问身份 (OAI) 的功能,允许它对发送到您的存储桶的请求进行身份验证。

CloudFront 还支持使用 CloudFront 签名 URLs(和签名 cookie)控制查看者对您的资源的访问。

但这两个功能是相互独立的。

如果配置了OAI,无论对象是私有的还是public.

,它总是向存储桶发送认证信息。

同样,如果您为缓存行为启用 Restrict Viewer Access,CloudFront 将始终要求对查看器请求进行签名,无论对象是私有对象还是 public(在存储桶中),因为CloudFront 不知道。

有几个选项。

如果您的内容在逻辑上按路径分隔,解决方案很简单:创建多个缓存行为,并使用要匹配的路径模式,如 /public/*/private/* 并为它们配置单独的、适当的限制查看者访问设置。对象是否在存储桶中 public 并不重要,因为如果缓存行为不 "Restrict Viewer Access." 默认情况下,您可以创建 25 个独特的缓存行为路径模式。

如果这不是解决方案,您可以创建两个 CloudFront 分配。一个是没有 OAI 并且没有启用限制查看者访问。此发行版只能获取 public 个对象。第二个发行版将有一个 OAI,并且需要签名的 URLs。您可以将它用于私有对象(它也适用于 public 对象——但它们仍然需要签名的 URLs)。这里不会有价格差异,但您可能需要应对跨源问题。

或者,您可以修改您的应用程序以在呈现 HTML 时为其他 public 内容签署所有 URL(或 API 响应,或任何上下文用于您的链接)。

或者,根据您平台的架构,可能还有其他更复杂的方法可能有意义,具体取决于 public 和私有的组合以及您是否愿意在边缘添加一些智能Lambda@Edge 触发器,它可以执行诸如 inspect/modify 动态请求、查询外部逻辑和数据源(例如在 DynamoDB 中查找会话 cookie)、拦截错误和生成重定向等操作。

迈克尔的描述很好。亚马逊还表示(link 下面)"Signature Version 2 is being deprecated, and the final support for Signature Version 2 will end on June 24, 2019."

https://docs.aws.amazon.com/AmazonS3/latest/dev/auth-request-sig-v2.html