Python刷新阿里云CDN缓存

需求说明

公司各项目有H5静态页面,需要在更新本地静态文件的时候及时刷新CDN缓存,让用户在最短的时间内访问到更新内容。

实现步骤

1、安装依赖包版本

  • Python CDN SDK模块包:目前使用版本为v20180510,建议您使用:pip install aliyun-python-sdk-cdn 命令安装。

  • Python 阿里云核心包:目前使用版本为 2.6.0 ,建议您使用:pip install aliyun-python-sdk-core 命令安装。

  • Windows/Linux系统安装Python 2.75版本及以上。

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python
from aliyunsdkcore import client
Client=client.AcsClient('AccessKey ID','AccessKeySecret','cn-hangzhou')
from aliyunsdkcdn.request.v20141111 import RefreshObjectCachesRequest
request = RefreshObjectCachesRequest.RefreshObjectCachesRequest()
request.set_accept_format('json')
request.set_ObjectPath('https://upload.feiersmart.com/')
request.set_ObjectType("Directory")
result=Client.do_action(request)
print result

注:

修改变量说明
AccessKey ID阿里云账户 AccessKey ID
AccessKeySecret阿里云账户 AccessKeySecret
https://upload.feiersmart.com/需要刷新缓存的域名

2、不需要安装依赖包版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#!/usr/bin/python
# -*- coding:utf-8 -*-

import sys,os
import urllib, urllib2
import base64
import hmac
import hashlib
from hashlib import sha1
import time
import uuid

class pushAliCdn:
def __init__(self):
self.cdn_server_address = 'http://cdn.aliyuncs.com'
self.access_key_id = 'AccessKey ID'
self.access_key_secret = 'AccessKeySecret'

def percent_encode(self, str):
res = urllib.quote(str.decode(sys.stdin.encoding).encode('utf8'), '')
res = res.replace('+', '%20')
res = res.replace('*', '%2A')
res = res.replace('%7E', '~')
return res

def compute_signature(self, parameters, access_key_secret):
sortedParameters = sorted(parameters.items(), key=lambda parameters: parameters[0])
canonicalizedQueryString = ''
for (k,v) in sortedParameters:
canonicalizedQueryString += '&' + self.percent_encode(k) + '=' + self.percent_encode(v)
stringToSign = 'GET&%2F&' + self.percent_encode(canonicalizedQueryString[1:])
h = hmac.new(access_key_secret + "&", stringToSign, sha1)
signature = base64.encodestring(h.digest()).strip()
return signature

def compose_url(self, user_params):
timestamp = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
parameters = { \
'Format' : 'JSON', \
'Version' : '2014-11-11', \
'AccessKeyId' : self.access_key_id, \
'SignatureVersion' : '1.0', \
'SignatureMethod' : 'HMAC-SHA1', \
'SignatureNonce' : str(uuid.uuid1()), \
'TimeStamp' : timestamp, \
}
for key in user_params.keys():
parameters[key] = user_params[key]
signature = self.compute_signature(parameters, self.access_key_secret)
parameters['Signature'] = signature
url = self.cdn_server_address + "/?" + urllib.urlencode(parameters)
return url

def make_request(self, user_params, quiet=False):
url = self.compose_url(user_params)
#print url
#刷新url
try:
req = urllib2.Request(url)
res_data = urllib2.urlopen(req)
res = res_data.read()
return res
except:
return user_params['ObjectPath'] + ' refresh failed!'

if __name__ == '__main__':
f = pushAliCdn()
params = {'Action': 'RefreshObjectCaches', 'ObjectPath': 'https://upload.feiersmart.com/', 'ObjectType': 'Directory'}
res = f.make_request(params)
print res

注:

修改变量说明
AccessKey ID阿里云账户 AccessKey ID
AccessKeySecret阿里云账户 AccessKeySecret
https://upload.feiersmart.com/需要刷新缓存的域名

3、集成到jenkins

集成到jenkins建议使用安装依赖包版本

3.1 新建刷新缓存的job

3.2 串连构建任务

在静态页面更新完后刷新CDN缓存

4、安全策略

阿里云限制RAM账户权限和IP地址

RAM访问控制 –> 权限管理 –> 权限策略管理 –> 创建权限策略

授权语句如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"cdn:Describe*",
"cdn:PushObjectCache",
"cdn:RefreshObjectCaches"
],
"Resource": [
"acs:cdn:*:*:*"
],
"Condition": {
"IpAddress": {
"acs:SourceIp": [
"37.7.61.18",
"17.93.212.167"
]
}
}
}
]
}

创建好后把该策略授权给刷新CDN缓存的用户或组

更多RAM鉴权请参考阿里云文档

-------------本文结束感谢您的阅读-------------