我刚刚在Amazon S3上部署了一个静态网站,目前可在此处查看:http://www.rdegges.com.s3-website-us-east-1.amazonaws.com/
如果您点击任何文章链接,您会发现以下错误:
S3抱怨该文件不存在。现在,这就是奇怪的 - 我在我的域名上使用CloudFront。因此,当您单击该文章链接时,它会将请求发送到CloudFront,然后尝试从S3存储桶中提取文件。
但是,如果您直接从S3访问相同的网址,例如:http://www.rdegges.com.s3-website-us-east-1.amazonaws.com/2015/building-a-heroku-addon-planning/该页面将加载正常。
这里似乎有些东西在翻译中丢失了。
有人建议我可以采取哪些措施来修复我的设置?
答案 0 :(得分:69)
我会指出,并且说明指定的密钥不存在技术上,因此错误消息在技术上是准确的,但并不能说明整个故事。这应该是一个简单的解决方法。
S3存储桶有两个端点,“REST”和“网站”。它们有两个不同的功能集。网站端点提供了索引文档的神奇解决方案(例如index.html,它似乎是您提供的示例中实际应该返回到浏览器的内容),而REST端点则没有。
在用于网站托管的存储桶前配置CloudFront时,通常不希望通过从下拉列表中选择存储桶名称将源配置为“S3”源。相反,您希望将其配置为“自定义”源,并使用S3控制台中提供的网站端点主机名(例如example-bucket.s3-website-us-east-1...
),否则,CloudFront假定您希望它使用REST端点bucket(允许身份验证和私有内容,网站端点不支持)。
<击> 重要强> 撞击>
不要从列表中选择存储桶的名称,例如example.com.s3.amazonaws.com。<击> http://docs.aws.amazon.com/gettingstarted/latest/swh/getting-started-create-cfdist.html 击>
自从这个问题最初被回答以来,文档被重构了,所以上面显示的消息现在出现在一页之后,并且已被重新编写,但要点是相同的。 “桶的名称”似乎是指下拉列表中显示的选项,这不是您想要的。
注意强>
请务必指定静态网站托管端点,而不是桶的名称。
http://docs.aws.amazon.com/AmazonS3/latest/dev/website-hosting-cloudfront-walkthrough.html
您正在使用存储桶的REST端点的提示是因为如果您使用网站端点,则错误消息将不是XML格式。
如上所述为CloudFront分配创建新的来源,然后更改行为以将请求发送到新来源,然后发送*
的CloudFront缓存失效请求,您应该设置。
另见:
http://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteEndpoints.html#WebsiteRestEndpointDiff
¹两个端点。从技术上讲,有两个以上,因为所有存储桶至少有两个REST端点主机名...但是端点有两个类型。存储桶还具有传输加速端点,该端点使用AWS边缘网络进行更快/更优化的传输,尤其是距离配置存储区域较远的地理位置。如果您激活它,它看起来像https://example-bucket.s3-accelerate.amazonaws.com
,并且因为您使用更多AWS网络而不是公共Internet而需要额外的使用费...但是,这是端点部署的不同之处,不是端点的行为。传输加速端点仍然是REST端点,因此就像其他REST端点一样,它没有网站托管功能。您不希望将CloudFront配置为使用加速端点,因为这不会带来任何改进(CloudFront已经使用了边缘网络),但您仍然需要支付额外的加速费用。
答案 1 :(得分:20)
遇到同样的问题以及我如何解决这个问题是在CloudFront Origin Settings 将 Origin Domain Name 设置为<website bucket>.s3-website-us-west-2.amazonaws.com
在CloudFront 生成设置中,请确保index.html
为默认根对象。
在S3中,确保选择使用此存储分区托管网站并将index.html
设置为索引文档。
答案 2 :(得分:0)
有关如何use CloudFront to serve a static website hosted on S3 over https的信息,请参阅AWS文档。
为方便起见(或万一链接出现问题),在下面抄录内容。
在存储桶上使用Amazon S3 console至create a bucket and to enable static website hosting。
在“ 静态网站托管”对话框中,复制存储桶的端点,而无需前导 http:// 。格式类似于 bucketname.s3-website-region.amazonaws.com 。您需要采用这种格式的端点才能进行后续步骤。
创建一个CloudFront web distribution。确保配置以下内容:
如果您不想为网站使用SSL(HTTPS),请继续执行下一步。如果要对网站使用SSL,则可以选择请求或使用ACM导入证书来请求证书。有关更多信息,请参见Using Alternate Domain Names and HTTPS。
选择创建分发版本。
更新您域的DNS记录,以将您网站的CNAME指向CloudFront发行版本的域名。您可以在CloudFront console中以类似于 d1234abcd.cloudfront.net 的格式找到您的发行版的域名。
请等待您的DNS更改传播,并等待以前的DNS条目到期。
答案 3 :(得分:0)
我也有类似的问题 我已经按照以下步骤解决了这个问题
STEPS:
->go to CloudFront Distributions
->click the ID
->after Clicking Id you will find different categories like General, Origins and Origin Groups .
->Click the Origins and Origin Groups
->Click the checkbox of your s3 bucket and click edit
->under grand read Permissions on Bucket click "Yes, Update bucket policy"
这一步解决了我的问题。
答案 4 :(得分:0)
我正面临着同样的问题,我是如何解决的,下面是步骤
转到 Amazon S3 ,然后转到存储桶目录
转到“权限”标签->“存储桶策略”->“编辑并保存”
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicRead",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion"
],
"Resource": "arn:aws:s3:::your-bucket-name/*"
}
]
}
注意:更改此行"Resource": "arn:aws:s3:::your-bucket-name/*"
例如:"Resource": "arn:aws:s3:::ng-ci-cd-aws-demo/*"
参考:https://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html
答案 5 :(得分:0)
要使s3网站与Cloudfront一起使用,有一些要求:
https://aws.amazon.com/premiumsupport/knowledge-center/s3-website-cloudfront-error-403/
我遇到的主要问题是,有两种类型的s3存储桶网址:
REST端点格式:https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro
https://bucket-name.s3.Region.amazonaws.com
网站端点格式:https://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteEndpoints.html
http://bucket-name.s3-website-Region.amazonaws.com
http://bucket-name.s3-website.Region.amazonaws.com
就我而言,我需要使用网站网址而不是REST网址:
使用网站url将允许您使用S3的网站托管功能,例如索引/错误文档和重定向规则!
答案 6 :(得分:0)
您应按照以下步骤操作。
要使用CloudFront控制台更新存储桶策略,请执行以下步骤:
year
如果配置了OAI,则OAI必须包含在S3存储桶策略中 如果您在CloudFront发行版中添加了OAI,则还必须在S3存储桶策略中包括OAI的allow语句。
要验证存储桶策略是否允许OAI,请在Amazon S3控制台中打开S3存储桶。然后,选择“权限”选项卡并查看存储桶策略。以下是OAI的allow语句示例:
1. Open the CloudFront console and choose your distribution.
2. Choose the Origins and Origin Groups tab.
3. Select the S3 origin and choose Edit.
4. For Restrict Bucket Access, choose Yes.
5. For Origin Access Identity, choose the existing identity or create a new one.
6. For Grant Read Permissions on Bucket, choose Yes, Update Bucket Policy.
7. Choose Yes, Edit.
参考: https://aws.amazon.com/tr/premiumsupport/knowledge-center/s3-rest-api-cloudfront-error-403/
答案 7 :(得分:0)
您是否在 S3 上托管 React 站点?可能使用 React Router?
注意:我的 S3 Bucket 已禁止公开访问,我不想将其公开。另外,虽然我遇到的问题与上面的问题相同,但我的解决方案却有所不同。
如果您和我一样,不想希望将您的 S3 端点设为公开,并且在 React Router 中遇到此问题,其中带有路由的直接 URL 在 CloudFront 上返回 403 Forbidden,请继续阅读:
发生这种情况是因为 CloudFront 期望 S3 存储桶包含您的 URL 应该指向的文件。
例如,如果您有一个静态站点“example.com”和一个路由“/stack”,CloudFront 将尝试在您的 S3 存储桶中查找“stack”文件。这显然不存在,CloudFront 会返回错误。
解决此问题的最佳方法是在 CloudFront 中设置自定义错误。自定义错误响应可以指向状态为“200 OK”的“index.html”页面。这将解决错误,将用户指向正确的文件,同时保留原始 URL (example.com/stack),然后由 React Router 获取。
答案 8 :(得分:-1)
当我尝试在客户的route53重定向中包含存储桶名称时,我遇到了这个问题,以便更容易实现:
https://0832234.signin.aws.amazon.com/console/s3/?bucket=clientbucket.com
点击“所有存储桶”并返回客户端存储桶/或从网址中删除存储桶就可以了,我现在可以下载并打开文件了。