托管静态网站时,为什么Amazon S3存储桶名称必须与网站名称相同

时间:2014-09-17 06:39:49

标签: amazon-s3 bucket

我想在S3上托管静态网站,即.. abcd.com。它需要一个与#34; abcd.com相同的桶名称"

然后我发现abcd.com被其他人占用了。

这就是我的问题,为什么存储桶名称必须与网站名称相同。因为路由53将网站映射到桶端点,所以没有必要进行此限制。

这有什么理由吗?

3 个答案:

答案 0 :(得分:5)

简短的回答是,“这就是亚马逊设计它的方式。”

如果存储桶名称与域名不同,S3将如何知道用于为给定域提供请求的存储桶?

您不能说“Route 53”,因为S3是在Route 53之前创建的,即使您没有将Route 53用于DNS,S3中的网站托管也是如此。

同样,它不能是存储桶上的配置选项,因为这只会产生一系列新问题 - 如果域的前任所有者仍然使用您的域配置了其存储桶,那么您确实和你一样的问题,现在。

您仍然可以在S3上托管您的站点,但是如果桶名不匹配,则需要在同一区域的EC2中使用反向代理服务器,以在每个请求中重写主机头以匹配存储桶名称,或者,可以使用CloudFront来实现类似的目的,因为存储桶名称不需要匹配 - CloudFront也会重写Host标头。

答案 1 :(得分:2)

有一个很简单的原因:当Amazon从您的浏览器收到请求时,可用的主要信息是URL中的域,还不足以弄清楚它。

假设您的站点为example.com,但是使用了存储桶名称,因此您将存储桶设为my-example。然后,您将获得一个类似于http://my-example.s3-website.us-east-1.amazonaws.com/的URL。这将在您的浏览器中正常工作,因为它可以解析到某些AWS Web服务器,该服务器查看Host HTTP header,提取存储桶名称,并获取存储桶内容。

现在,假设您向Route53添加了一些内容以使example.com工作。您可以添加A记录,使您的浏览器将example.com直接转换为某些AWS S3 Web服务器的IP地址。或者,您可以输入一个CNAME,它从example.com指向完整的my-example主机名。无论哪种方式,您的浏览器都将查找IP地址,联系Amazon网络服务器,并发送一个Host标头,上面写着example.com。因此,如果这不是存储桶名称,它就不知道该怎么办。

诚然,它可以走得更远。毕竟,当您设置用于服务网站的存储桶时,请告诉它的主机名。因此,乍一想,如果也使用它,那似乎很好。但是,那也不能真正解决您的问题,因为设置example.com存储桶的人都可以将其设置为托管。

解决此问题的最佳方法似乎是Cloudfront,它可以将域名与任意存储桶相关联。

答案 2 :(得分:2)

我认为AWS就是这样设计的,就是这样:Check this

我已经完成了我公司网站的工作,效果很好!

创建一个S3存储桶并将其配置为托管网站

Amazon S3允许您从以下位置存储和检索数据: 互联网。要整理数据,请创建存储分区并上传 使用AWS管理控制台将数据存储到存储桶中。您可以使用 S3将一个静态网站托管在存储桶中。以下步骤 介绍了如何创建存储桶并将其配置为用于网站托管。

要创建S3存储桶并将其配置为托管网站

  • 通过https://console.aws.amazon.com/s3/打开Amazon S3控制台。
  • 选择创建存储桶。
  • 输入以下值:
    • 存储桶名称-输入您的域的名称,例如example.com。
    • 地区-选择最接近您大多数用户的地区。
      • 记下您选择的区域;您稍后将需要此信息。
        • 选择下一步。
        • 在“配置选项”页面上,选择“下一步”以接受默认值。
        • 在“设置权限”页面上,取消选中“阻止所有公共访问”复选框,然后选择“下一步”。

注意 控制台显示有关对存储桶进行公共访问的消息。在此过程的后面,您将添加一个存储桶策略,以限制对该存储桶的访问。

  • 在“评论”页面上,选择“创建存储桶”。
  • 在S3存储桶列表中,选择刚创建的存储桶的名称。
  • 选择“属性”标签。
  • 选择静态网站托管。
  • 选择使用此存储桶来托管网站。
  • 对于索引文档,输入包含您网站主页的文件的名称。

注意 您将创建一个HTML文件,并将其上传到存储桶中。

  • 选择保存。
  • 选择“权限”标签。
  • 选择存储桶策略。

复制以下存储桶策略并将其粘贴到文本编辑器中。此策略授予互联网("Principal":"*")上每个人的权限,以获取与您的域名("Action":["s3:GetObject"])关联的S3存储桶中的文件("arn:aws:s3:::your-domain-name/*")

{
   "Version":"2012-10-17",
   "Statement":[{
      "Sid":"AddPerm",
      "Effect":"Allow",
      "Principal":"*",
      "Action":[
         "s3:GetObject"
      ],
      "Resource":[
         "arn:aws:s3:::your-domain-name/*"
      ]
    }]
}
  • 在存储桶策略中,将值your-domain-name替换为您的域名称,例如example.com。此值必须与存储桶的名称匹配。
  • 选择保存。

创建另一个S3存储桶用于www。您的域名

在上述过程中,您为域名创建了一个存储桶,例如example.com。这样,您的用户可以使用您的域名(例如example.com)访问您的网站。

如果您还希望用户能够使用www.your-domain-name(例如www.example.com)访问示例网站,则可以创建第二个S3存储桶。然后,您将第二个存储桶配置为将流量路由到第一个存储桶。

注意 网站通常会将您的域名重定向到www。您的域名,例如,从example.com重定向到www.example.com。由于S3的工作方式,您必须以相反的方向设置重定向,从www.example.com到example.com。

要为www。您的域名创建S3存储桶

  • 选择创建存储桶。
  • 输入以下值:
    • 存储桶名称-输入www.your-domain-name。例如,如果您注册了域名example.com,请输入www.example.com。
    • 区域-选择您在其中创建第一个存储桶的区域。
  • 选择下一步。
  • 在“配置选项”页面上,选择“下一步”以接受默认值。
  • 在“设置权限”页面上,选择“下一步”以接受默认值。
  • 在“评论”页面上,选择“创建存储桶”。
  • 在S3存储桶列表中,选择刚创建的存储桶的名称。
  • 选择“属性”标签。
  • 选择静态网站托管。
  • 选择重定向请求。
    • 输入以下值:
      • 目标存储桶或域
      • 输入要将请求重定向到的存储桶的名称。这是您在创建S3存储桶并将其配置为托管网站的过程中创建的存储桶的名称。
      • 协议-输入http。您正在将请求重定向到配置为网站终端节点的S3存储桶,并且Amazon S3不支持网站终端节点的HTTPS连接。
  • 选择保存。