查看原文
其他

大咖专栏 | CloudFront常见错误配置及解决方法

2016-10-25 AWS

大咖专栏
大咖专栏是亚马逊AWS官方微信新开设的栏目。本专栏主要刊登亚马逊AWS诸位大咖讲师亲自撰写的Blog,内容涉猎广泛,话题讨论前沿,且与实战紧密相连。我们非常欢迎小伙伴们在评论区留言,与大咖互动交流!
今天为大家撰文的大咖,是亚马逊AWS解决方案架构师——韩小勇老师
韩小勇亚马逊AWS解决方案架构师AWS解决方案架构师,负责基于AWS的云计算方案架构咨询和设计,实施和推广。他在加入AWS之前,从事电信核心网系统上云的方案设计及标准化推广 。
很多的用户在最初使用CloudFront做Web类内容分发的时候遇到无法调通的情况,本文总结了用户在配置过程中遇到的常见错误,内容涵盖了大部分用户遇到的情况。
1 错误一  源访问权限未放开这种错误常见于用S3做源的情况,引起这种错误的原因是S3的访问控制没有对CloudFront开放。从浏览器中返回的错误通常类似于下图:
更具体些,可分为以下两个场景
场景一CloudFront使用了Restrict Bucket Access
在创建Distribution的时候选择了Restrict Bucket Access为Yes,但Grant Read Permissions on Bucket,选择的是“No, I Will Update Permissions”,而用户事后却没有在S3的桶里更新Policy。如下图所示。

解决方法
方法1:在S3中增加桶的策略,使该桶允许该CloudFront访问,以下是Policy示例,其中标黄部分需要替换成用户自己的信息。
{           "Version": "2008-10-17",           "Id": "PolicyForCloudFrontPrivateContent",           "Statement": [                     {                                "Sid": "1",                                "Effect": "Allow",                                "Principal": {                                          "AWS": "arn:aws:iam::CloudFront:user/CloudFront Origin Access Identity E344H6KAFBMK0I"                                },                                "Action": "s3:GetObject",                                "Resource": "arn:aws:s3:::elastictcoutputthumb/*"                     }           ]}
方法2:重新创建Distribution,新建的Distribution中Grant Read Permissions on Bucket选择Yes,Update Bucket Policy,这样当Distribution创建完成后,S3桶的Policy会被自动更新。
场景二普通的S3回源
CloudFront并未使用Restrict Bucket Access,这种情况下如果S3中的对象没有设置成可被公共访问,也会出现Access Denied的错误。
解决方法
可以通过设置S3桶的Bucket Policy或者设置S3中对象的Object ACL来实现。例如,通过AWS控制台设置存储桶的Bucket Policy:
通过AWS控制台设置S3对象的Object ACL:
注:如果想了解S3访问控制的详细内容,请参考:http://docs.aws.amazon.com/AmazonS3/latest/dev/s3-access-control.html
2 错误二 使用自定义域名但未在 CloudFront中配置用户有时不直接使用CloudFront的Distribution产生的域名,而是使用了自定义的域名并用CNAME的方式指到CloudFront的域名,例如使用cdn.mydomain.com CNAME到d1cbzf61pdxxxx.CloudFront.net。此外,如果使用Route53作为DNS,也可以不采用CNAME的方式,而是采用Alias的方式。
CloudFront规定当使用自定义域名并配置该域名使用CNAME或Alias的方式指向CloudFront Distribution的域名的时候,需要在CloudFront相应的Distribution中提供该自定义的域名,如果使用了多个自定义的域名,则提供多个自定义的域名。如果没有提供,就会出现类似下图的错误:

解决方法
可以通过AWS控制台,对Distribution中的Alternate Domain Names(CNAMEs)进行设置:
3 错误三 访问路径错误配置完CloudFront的Behavior后,用户有时不能给出正确的URL来访问想要的资源。出现访问错误,如果是回源S3,返回的错误通常如下:
如果是回源的自定义网站,返回的错误根据网站的不同而不同,例如:返回“找不到相应的页面”等错误。
解决方法
避免这种错误很简单,了解CloudFront Behavior的URL与所访问的源站资源的对应方法,即可判别自己的URL是否正确。以下举例说明:
某Behavior如下,该Behavior对应的Origin ID是S3-hxybucket/Picture:
进入到Origin查看,可知Origin Domain Name and Path是hxybucket.s3.amazonaws.com/Picture
如果通过d1cbzf61pdxxxx.CloudFront.net/dog.jpg访问的话,对应的源站资源是hxybucket.s3.amazonaws.com/Picture/dog.jpg
如果通过d1cbzf61pdxxxx.CloudFront.net/jpg/dog.jpg访问的话,对应的源站资源是hxybucket.s3.amazonaws.com/Picture/jpg/dog.jpg
即:将CloudFront域名后面的路径追加到Origin Domain Name and Path(注意,除了Domain Name之外,还有Path)所对应的路径后面,就是对应到源站的资源,用户通过该路径即可判断所使用的URL是否正确。
4 错误四 HTTP Method设置不当在创建Behavior的时候,Allowed HTTP Methods选项的默认值是GET和HEAD,有时用户会使用其他的HTTP Method,例如POST,此时如果还是用默认值,就会出错,返回的错误通常如下:
“This distribution is not configured to allow the HTTP request method that was used for this request. The distribution supports only cachable requests.”

解决方法
办法很简单,在Behavior中重新设定一下Allowed HTTP Methods选项,使其包含所用的HTTP Method。
5 错误五 设置了Restrict Viewer Access却没有使用Signed URL或Signed Cookie在创建Behavior的时候,Restrict Viewer Access (Use Signed URLs or Signed Cookies)选项的默认值是No,如果用户改成了Yes,此时该Behavior对应的资源必须使用Signed URL或者Signed Cookie的方式访问,如果使用普通的URL访问,返回的错误通常如下:

解决方法
方法1:使用Signed Url或Signed Cookie进行访问,具体参考:http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html
方法2:将Restrict Viewer Access(Use Signed URLs or Signed Cookies)的值改为No。如图:
6 错误六 Object Caching设置不当虽然能够访问到源,但有时用户会反映使用了CloudFront并没有加速访问,有时甚至效果还不如未使用CloudFront时。这很可能是由于Object Caching设置不当造成的。

解决方法
Object Caching有两个选项,分别是Use Origin Cache Headers和Customize。默认选项是前者。但是,当默认选择了Use Origin Cache Headers,而源的HTTP header中却没有Cache-control的头,那返回值就不被缓存了。 因此,用户需谨慎选择,当源的返回内容中没有Cache-control头的情况下,选择Customize,Customize中的Default值将会成为TTL时间(时间单位是秒)。
另外,如果源的返回值中存在Cache-control,而Object Caching又选择了Customize,这种情况下返回的内容肯定会在CloudFront边缘节点中被缓存。但CloudFront会使用哪个值作为TTL呢? 这个在CloudFront文档中有详细的描述,阅读文档请扫描/长按识别下方二维码:
点击“阅读原文”了解更多AWS官方Blog内容


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存