如何为我的 AWS S3 存储桶分配子域?

How can I assign a subdomain to my AWS S3 Bucket?

我的 AWS 存储桶中有一个文件:https://s3.amazonaws.com/static.my-company.com/media/my-file.jpg

目前我正在我的 index.html 文件 www.my-company.com 中访问该文件。我将 my-company.com 作为 AWS Route 53 中的托管区域。

但在 index.html 中,我不希望此资产位于 AWS 存储桶中这一点很明显。我希望它看起来好像托管在我自己域的服务器上。因此,我希望它的地址不是 https://s3.amazonaws.com/static.my-company.com/media/my-file.jpg,而是 https://static.my-company.com/media/my-file.jpg。我该怎么做?

我尝试在 Route 53 中插入​​一个 CNAME 记录,它将 static.my-company.com 指向 s3.amazonaws.com/static.my-company.com。但这没有用。这就是 Jay Godse 推荐的 here

您需要将您的 S3 存储桶设置为 静态网站(S3 中的一个选项可以这样设置您的存储桶)。然后域名将更改为类似 http://static.my-company.com.s3-website-us-east-1.amazonaws.com. 的内容,这就是您要在 Route 53 中将 CNAME 记录设置为的内容。

请注意,您不能像当前那样将 CNAME 记录设置到目录,它必须是可解析的域。

So instead of https://s3.amazonaws.com/static.my-company.com/media/my-file.jpg, I want it to be addressed as https://static.my-company.com/media/my-file.jpg. How can I do that?

这里有三个不同的问题。

如果您为您的存储桶启用网站托管功能,正如@Deif 在此处的另一个答案中所说明的那样,您可以使用别名或 CNAME 将 Route 53 中的主机名指向存储桶的网站端点并且它可以工作。但是不支持HTTPS。

HTTPS 要求 Web 服务器使用 SSL (TLS) 证书向浏览器标识自己,该证书包含与浏览器地址框中的主机名匹配的主机名。 REST 端点上的 S3 证书匹配 s3.amazonaws.com 的各种排列——它们与您的域不匹配。

所以你需要一个SSL证书。如果您已有一个,请将其上传到 us-east-1 区域的 Amazon Certificate Manager (ACM)。¹如果没有,ACM 可以免费为您创建一个。

接下来,创建一个新的 CloudFront 分配,使用您的子域作为备用域名,使用上面的 ACM 证书,并使用您的网站端点主机名作为源服务器。

然后,将您在 Route 53 中的子域指向 CloudFront 分配。

现在,https://subdomain.example.com/pics/funny/cat.jpg 转到提供 SSL 的 CloudFront 并从适当的存储桶中获取内容。

为什么需要 CloudFront?这是使用 S3 启用 SSL 的自定义域名的官方解决方案。 S3 本身不支持该功能。使用 CloudFront 会产生相应的成本,但它会显着降低 S3 本身的成本。当通过 CloudFront 进行下载时,S3 对用于下载的带宽收取 0 美元,而 CloudFront 则对带宽收费。在许多情况下,CloudFront 的带宽价格较低(大概是因为 CloudFront 可以水平扩展以缓解拥塞,而 S3 只能垂直扩展——它的位置受设计限制)。


¹ 在 ACM 中,us-east-1 区域始终用于我在此处描述的设置,无论存储桶位置如何,因为 CloudFront 由 us-east-1 管理,我们需要此证书来CloudFront 可以访问。

2019 年更新:AWS 子域托管在 S3

以下步骤对我有用,可以让子域在 AWS S3 托管的静态网站上运行:

  1. 创建一个包含子域名的存储桶。在下面的示例中,它将是 www.subtest.mysite.com

注意:确保在存储桶的 'Permission' 选项卡上设置以下内容:

1.Block public 访问(桶设置) 2.Access 控制列表 3.Bucket 政策 适当设置以确保存储桶为 public。 (假设您已经为您的根域存储桶执行了此操作,这些设置可以镜像到此子域存储桶中)

  1. 上传存储桶中的index.html文件

  1. 通过您的域提供商创建 CNAME 记录