分类目录归档:CloudFront

几个第三方清CloudFront缓存工具

除了web console上的清缓存的页面,我们也可以给非AWS管理员使用一些第三方的清缓存的工具
• CloudBuddy Personal – http://m1.mycloudbuddy.com/index.html
• CloudBerry Explorer – http://cloudberrylab.com
• Ylastic – http://ylastic.com
• Cyberduck – http://cyberduck.ch
• Bucket Explorer – http://www.bucketexplorer.com
• CloudFront Invalidator – http://www.swook.net/p/cloudfront-invalidator.html
• CDN Planet CloudFront Purge Tool – http://www.cdnplanet.com/tools/cloudfront-purge-tool/
CloudBerry用过S3资源管理上传下载非常方便,也可以用来管理CF资源,但是免费版,清缓存,只能一次一个,不能针对目录
Ylastic是自己开发了个AWS资源管理和真是的网站,收费的,没体验过
Cyberduck大黄鸭是个客户端的工具,跟CloudBerry类似,但是不如CB好用,也是一次清一个,不能清目录
CloudFront Invalidator是个第三方版的web版的清缓存的工具,在线使用,跟web console一样,一行一个对象,可以写多行
CDN Planet CloudFront Purge Tool做成了chrome扩展,可以清多个CDN的,也是一个对象一行
Bucket Explorer是个收费的客户端工具,也是一个对象一行,写目录也不报错,不知有无效果

或者自己写个脚本批量清缓存也行,每次请求只能最多1000个对象,再多就需要用多个请求来处理,python示例如下

import boto

distribution_id = 'xxxxxxxxxxxx'
paths = ['/path/7eleven.png', '/path/alipay.png', '/path/Braintree.png']

c = boto.connect_cloudfront()
inval_req = c.create_invalidation_request(distribution_id, paths)
print inval_req.paths
invals = c.get_invalidation_requests(distribution_id)
for inval in invals:
    print 'Object: %s, ID: %s, Status: %s' % (inval, inval.id, inval.status)

或者把对象写在文件中,一行一个,用python load进paths这个list中处理:

import sys,os

input_fle = os.sys.path[0] + os.sep + 'purge-object.txt'
f = open(input_fle,'r')
paths = []
for line in f:
    line = line.strip()
    paths.append(line)
print paths

在coudfront中使用自己的SSL证书

在coudfront中使用自己的SSL证书

使用cloudfront的时候你可以选择使用cloudfront服务提供给你的ssl证书来实现https访问你的资源,但这样也仅限用https://xxxx.cloudfront.net/xx.jpg这样的形式。
如果你将你的子域名CNAME到这个cloudfront域名上之后,你再通过https://your-domain-name/xx.jpg,浏览器会提示网页资源不安全,这时候就得使用你自己域名的SSL证书。

    第一步,上传你的cf证书

如果用web console的话,如果你是IAM用户,你可能找不到上传cf证书的位置,切换成root账户,点开右上角的下拉菜单中的Security Credential,你就会看到上传cf证书的位置,此处还有x.509证书的位置
上传的时候,直接选择你的public key,但是我试了几遍都报错说无法上传,证书无效。放弃。用命令行上传。
我用的命令如下:

aws iam upload-server-certificate \
    --server-certificate-name wall-et.net \
    --certificate-body file://wall-et.net.pem \
    --private-key file://wall-et.net.key \
    --certificate-chain file://wall-et.net.chains.pem \
    --path /cloudfront/

报错了

A client error (MalformedCertificate) occurred when calling the 
UploadServerCertificate operation: Unable to validate certificate 
chain. The certificate chain must start with the immediate signing 
certificate, followed by any intermediaries in order. 
The index within the chain of the invalid certificate is: 2

考虑到这三个key文件在上传ELB的SSL证书的时候是可用的,又考虑到ELB出的certificate chain是可选项,推断这里也是可选项,于是就去掉

aws iam upload-server-certificate \
    --server-certificate-name wall-et.net \
    --certificate-body file://wall-et.net.pem \
    --private-key file://wall-et.net.key \
    --path /cloudfront/
    第二步,在CF distribution中修改设置

在SSL Certificate那里选择 Custom SSL Certificate(stored in AWS IAM),然后从后面的下拉菜单中选择就好,选择使用自定义证书之后,会让从两种Custom SSL Client Support中选择
All Clients,这个选项支持所有客户端,包括不支持Server Name Indication(SNI)的旧客户端,这个是收费的,不过也不太贵,几百刀每月的数量级,并且需要在线填写申请表。他会为cf边缘节点分配专用IP。

“专用 IP 自定义 SSL 分配专用 IP 地址来服务于每个 CloudFront 节点处的 SSL 内容。因为 IP 地址与 SSL 证书之间是一对一映射,所以专用 IP 自定义 SSL 使用的是不支持 SNI 的浏览器和其他客户端。由于当前的 IP 地址成本,专用 IP 自定义 SSL 的费用是每月 600 USD,按比例分配到每个小时。”

Only Clients that support SNI,这个就不支持比较老的客户端了,具体的见文章后面的FAQ。为了省点预算,我选的这种。
完成配置之后,大概等了那么3分钟左右就生效了。

FAQs:
问:什么是服务器名称指示SNI?
服务器名称指示 (SNI) 是传输层安全性 (TLS) 协议的延伸。该机制识别相关 SSL 请求相关的域(服务器名称)以便在 SSL 握手时使用适当的证书。这允许单个 IP 地址用于多个服务器。SNI 要求浏览器支持添加服务器名称,尽管大部分现代浏览器支持,但是还有一些老式浏览器不能支持。

问:哪些浏览器支持SNI?
SNI 自定义 SSL 可使用大部分现代浏览器,包括 Chrome V 6 和更高版本(运行于 Windows XP 和更高版本或 OS X 10.5.7 和更高版本上之上)、Safari V 3 和更高版本(运行于 Windows Vista 和更高版本或 Mac OS X 10.5.6. 和更高版本之上)、Firefox 2.0 和更高版本,以及 Internet Explorer 7 和更高版本(运行于 Windows Vista 和更高版本之上)。