我正在尝试建立一个简单的基于 Amazon AWS S3 的网站,如下所述这里。
我已经设置了 S3 存储桶(simples3websitetest.com),并赋予了它(希望)正确的权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AddPerm",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::simples3websitetest.com/*"
]
}
]
}
我上传了 index.html,设置了网站访问,可以通过以下方式访问http://simples3websitetest.com.s3-website-us-west-2.amazonaws.com/index.html
到目前为止一切顺利,现在我想设置 Amazon Route53 访问,但我遇到了困难。
我已经在我拥有的域(resourcesbox.net)上设置了一个托管区域,然后单击“创建记录集”,然后进入“设置别名”步骤,但是当我尝试设置别名目标时,S3 网站端点下出现“没有可用目标”。
我错过了什么??
答案1
您创建的 A 记录别名必须与存储桶的名称相同,因为 S3 中存储桶的虚拟托管要求Host:
浏览器发送的标头与存储桶名称匹配。实际上没有其他可行的方法可以实现存储桶的虚拟托管...存储桶必须通过某种机制来识别,而这种机制就是 http 标头。
为了在“example.com”域内创建存储桶的别名,存储桶名称还必须是您可以在该域内合法声明的主机名……例如,Route 53 A 记录“testbucket.example.com”可以仅有的将其别名为“testbucket.example.com”的存储桶...并且没有其他存储桶。
在您的问题中,您打破了这个限制......但您只能在“simples3websitetest.com”域内(和顶点)为名为“simples3websitetest.com”的存储桶创建一个别名。
这是设计使然,并非 Route 53 或 S3 的局限性。它们只是阻止您做一些不可能成功的事情。Web 服务器不知道任何别名或 CNAME 或 DNS 中所做的任何其他操作 - 它们只接收浏览器认为它正在尝试连接的原始主机名,在浏览器发送的 http 标头中...并且 S3 使用此信息来识别虚拟托管请求适用的存储桶的名称。
Amazon S3 要求您为存储桶指定与域名相同的名称。这样,当用户从您的网站请求内容时,Amazon S3 才能正确解析 Web 浏览器发送的主机标头。因此,我们建议您在支付注册域名费用之前,在 Amazon S3 中为您的网站创建存储桶。
但请注意,此限制仅当您未在存储桶前使用 CloudFront 时才适用。
使用 CloudFront,灵活性更高,因为Host:
在请求传递到 S3 之前,可以重写标头(由 CloudFront 本身重写)。您可以在 CloudFront 分发中配置“原始主机”,其中your-bucket.s3-website-xx-yyyy-n.amazonaws.com
xx-yyyy-n 是创建存储桶的 S3 AWS 区域。此端点显示在每个存储桶的 S3 控制台中。
答案2
假设您有一个托管区域 abc.com。并且您创建了一个存储桶 abc.com(它不会显示在路由别名列表中)——您可能认为是名称后面的 .——您不能用它来命名存储桶
也试试这个。因为我第一次用正确的名称创建存储桶时仍然没有成功。相信我,我有强迫症,所以我没有漏掉一个句号或逗号。
- 创建另一个同名的托管区域 abc.com
- 现在您将看到 2 个相同的托管区域 (abc.com. 和 abc.com.)
- 删除新的
- 返回旧托管区域 abc.com
- 您可能能够看到 s3 端点出现 - 这可能是 Route53 中的一个问题
这对我很有用,我尝试了几乎所有的方法 - 我看到的一些建议是注销并登录以清除某种缓存 - 不确定