Alibaba Cloud CDNは、オリジンサーバーからファイルやディレクトリなどのコンテンツを自動的に更新およびプリフェッチするために使用できるスクリプトを提供しています。 このトピックでは、スクリプトの機能と使用方法について説明します。 次の例は、スクリプトを使用してコンテンツを自動的に更新およびプリフェッチする方法を示しています。 この例では、Windowsオペレーティングシステムが使用されています。
概要
スクリプトを使用して、オリジンサーバーからコンテンツをバッチで自動的に更新またはプリフェッチできます。 手動操作と比較して、スクリプトはプロセスを大幅に簡素化します。
更新またはプリフェッチするURLを含むファイルを指定した後、スクリプトは同時更新またはプリフェッチタスクの数に基づいてファイルを分割します。 次いで、URLは、バッチでリフレッシュまたはプリフェッチされる。 スクリプトは、リフレッシュまたはプリフェッチタスクが完了したかどうかを自動的に検出します。 次のリフレッシュまたはプリフェッチタスクは、現在のタスクが終了するまで開始されません。
次のシナリオでは、スクリプトを使用することを推奨します。
開発者がいないため、リフレッシュおよびプリフェッチ操作は手動で実行されます。 運用とメンテナンス (O&M) のコストは高くなります。
リフレッシュまたはプリフェッチするURLの数が多い。 バッチタスクは効率を低下させます。
リフレッシュタスクとプリフェッチタスクが期待どおりに実行されるかどうかは、手動でチェックする必要があります。
使用上の注意
スクリプトを実行してコンテンツを自動的に更新またはプリフェッチする前に、次の環境がオンプレミスマシンに展開されていることを確認してください。
Alibaba Cloud CDN SDK for Pythonモジュールライブラリ: 現在のバージョンは20180510です。 pip install aliyun-python-sdk-cdnコマンドを実行してライブラリをインストールすることを推奨します。
Alibaba Cloud SDK for Pythonコアライブラリ: 現在のバージョンは2.6.0です。 pip install aliyun-python-sdk-coreコマンドを実行してライブラリをインストールすることを推奨します。
WindowsおよびLinuxオペレーティングシステムでは、Python 3を使用し、ロギングモジュールをインストールする必要があります。
次のコードをRefresh.pyスクリプトとして保存します。
#!/usr/bin/env python3 # コーディング=utf-8 # __author__ = 'hanli.zyb' # __date__ = '2021-04-23' ''チェックパッケージ'' トライ: os、re、sys、getopt、time、json、ロギングをインポートする from aliyunsdkcore.client import AcsClient from aliyunsdkcore.acs_exception.exceptions import ClientException from aliyunsdkcore.acs_exception.exceptions import ServerException からaliyunsdkcdn.request.v20180510.RefreshObjectCachesRequestインポートRefreshObjectCachesRequest からaliyunsdkcdn.request.v20180510.PushObjectCacheRequestのインポートPushObjectCacheRequest からaliyunsdkcdn.request.v20180510.DescribeRefreshTasksRequestのインポートDescribeRefreshTasksRequest aliyunsdkcdn.request.v20180510.DescribeRefreshQuotaRequestのインポートDescribeRefreshQuotaRequestから を除く: sys.exit("[エラー] pipをインストールしてくださいaliyun-python-sdk-cdnとaliyun-python-sdk-coreとロギング、今すぐインストールしてください ......") logging.basicConfig(level=logging.DEBUG、filename='./RefreshAndPredload.log') クラスEnvariable (オブジェクト): LISTS = [] REGION = 'cn-zhangzhou' AK=なし SK=なし FD=なし CLI=なし TASK_TYPE=なし TASK_AREA=なし TASK_OTYPE=なし def set_ak(ak): Envariable.AK = ak def get_ak(): Envariable.AKを返します def set_sk(sk): Envariable.SK = sk def get_sk(): Envariable.SKを返します def set_fd(fd): Envariable.FD = fd def get_fd(): Envariable.FDを返します def set_task_type(task_type): Envariable.TASK_TYPE = task_type def get_task_type(): 戻り値Envariable.TASK_TYPE def set_task_area(task_area): Envariable.TASK_AREA = task_area def get_task_area(): return Envariable.TASK_AREA def set_task_otype(task_otype): Envariable.TASK_OTYPE = task_otype def get_task_otype(): return Envariable.TASK_OTYPE def set_acs_client(): Envariable.CLI = AcsClient(Envariable.get_ak(), Envariable.get_sk(), Envariable.REGION) def get_acs_client(): Envariable.CLIを返します クラスInitHandler (オブジェクト): def __init__(self、ak、sk、region): 試してみてください。 self.client = AcsClient(self,Envariable.get_ak(),Envariable.get_sk(),Envariable.REGION) except Exception: logging.info("[error]: 初期AcsClientに失敗しました") とexit (1) クラスBaseCheck (オブジェクト): def __init__(self): self.invalidurl = '' self.lines = 0 self. urlist=Envariable.get_fd() def printQuota(self): 試してみてください。 Envariable.get_acs_client() の場合: client = Envariable.get_acs_client() else: Envariable.set_acs_client() client = Envariable.get_acs_client() quotas = DescribeRefreshQuotaRequest() quotaResp = json.loads(Envariable.get_acs_client().do_action_with_exception (クォータ)) Eなどの例外を除いて: logging.info("\n [エラー]: 初期AcsClient failed\n") およびsys.exit (1) if Envariable.TASK_TYPE: if Envariable.TASK_TYPE == 'push': if self.lines > int(quotaResp['PreloadRemain']): sys.exit("\n [エラー]:PreloadRemainが十分ではありません {0}".format(quotaResp['PreloadRemain']))) Trueを返す if Envariable.TASK_TYPE == 'clear': Envariable.get_task_otype() == 'File' およびself.lines > int(quotaResp['UrlRemain']) の場合: sys.exit("\n [エラー]:UrlRemainが十分ではありません {0}".format(quotaResp['UrlRemain']))) elif Envariable.get_task_otype() == 'Directory' およびself.lines > int(quotaResp['DirRemain']): sys.exit("\n [エラー]:DirRemainが十分ではありません {0}".format(quotaResp['DirRemain']))) else: Trueを返す def urlFormat (自己): fとしてopen(self. urlist, "r") を持つ: f.readlines() のラインのための: self.lines += 1 if not re.match(r' ^((https)|(http))',line): self.invalidurl = line + '\n' + self.invalidurl if self.invalidurl! ='': sys.exit("\n [エラー]: URL形式は違法です \n{0}".format(self.invalidurl)) 真を返す クラスdoTask (オブジェクト): def urlencode_pl(inputs_str): len_str = len(inputs_str) str == "" またはlen_str <= 0の場合: return "" index_j = 0 index_i = 0 result_end = "" 範囲 (0, len_str) のindex_iの場合: index_sb = index_i + 1 chs = inputs_str[index_i:index_sb] if (chs >= 'A' およびchs <= 'Z') または (chs >= 'a' およびchs <= 'z') または (chs >= '0' およびchs <= '9') または ( chs == ":") または (chs == "/"): if result_end == "" ": result_end = chs else: result_end += chs elif chs == '': result_end += '+' elif chs == '.' またはchs == '-' またはchs == '_' またはchs == '*': result_end += chs else: result_end = '% s %%% 02X' % (result_end, ord(chs)) return result_end def doProd (自己): gop = 100 mins = 1 maxs = gop fとしてopen(Envariable.get_fd() 、"r") を持つ: f.readlines() のラインのための: if mins! =maxs: line = line.strip("\n") + "\n" else: line = line.strip("\n") line = line.strip() line = doTask.urlencode_pl (ライン) + "\n" Envariable.LISTS.append(line) mins >= maxsの場合: yield Envariable.LISTS mins = maxs maxs = gop + maxs - 1 else: mins += 1 len(Envariable.LISTS) > 0の場合: Envariable.LISTSを生成します def doRefresh (リスト): 試してみてください。 Envariable.get_acs_client() の場合: client = Envariable.get_acs_client() else: Envariable.set_acs_client() client = Envariable.get_acs_client() Envariable.get_task_type() == 'clear' の場合: taskID = 'RefreshTaskId' request = RefreshObjectCachesRequest() if Envariable.get_task_otype(): request.set_ObjectType(Envariable.get_task_otype()) elif Envariable.get_task_type() == 'push': taskID = 'PushTaskId' request = PushObjectCacheRequest() if Envariable.get_task_area(): request.set_Area(Envariable.get_task_area()) taskreq = DescribeRefreshTasksRequest() リクエスト .set_accept_format( 'JSON') request.set_ObjectPath (リスト) response = json.loads(client.do_action_with_exception (リクエスト)) print(response) timeout = 0 while True: count = 0 taskreq.set_accept_format('json') taskreq.set_TaskId(int(response[taskID])) taskresp = json.loads(client.do_action_with_exception(taskreq)) print("[" + response[taskID] + "]" + "is doing... ...") taskresp['Tasks']['CDNTask'] のtについて: if t['Status'] ! ='Complete': カウント += 1 count === 0の場合: logging.info("[" + response[taskID] + "]" + "is finish") break elif timeout > 5: logging.info("[" + response[taskID] + "]" + "timeout") break else: timeout += 1 time.sleep(5) continue Eなどの例外を除いて: logging.info("\n [エラー]:% s" 、e) とsys.exit (1) クラスRefresh (オブジェクト): defメイン (自己、argv): len(argv) < 1の場合: sys.exit("\n[usage]: " + sys.argv[0] + " -h") 試してみてください。 opts, args = getopt.getopt(argv, "hi:k:n:r:t:a:o:") Eなどの例外を除いて: sys.exit("\n[usage]: " + sys.argv[0] + " -h") opt, arg in opts: opt == '-h' の場合: self.helps() sys.exit() elif opt == '-i': Envariable.set_ak(arg) elif opt == '-k': Envariable.set_sk(arg) elif opt == '-r': Envariable.set_fd(arg) elif opt == '-t': Envariable.set_task_type(arg) elif opt == '-a': Envariable.set_task_area(arg) elif opt == '-o': Envariable.set_task_otype(arg) elif opt == '-q': Envariable.set_task_id(arg) else: sys.exit("\n[usage]: " + sys.argv[0] + " -h \n") 試してみてください。 そうでない場合 (Envariable.get_ak() およびEnvariable.get_sk() およびEnvariable.get_fd() およびEnvariable.get_task_type()): sys.exit("\n [エラー]: パラメーター '-i', '-k', '-r', '-t'\n" によって行う必要があります) そうでない場合 (Envariable.get_task_type() in ("push", "clear")): sys.exit("\n[error]: taskTypeエラー、'push' または 'clear'\n" の '-t' オプション) Envariable.get_task_area() およびEnvariable.get_task_otype() の場合: sys.exit("\n [エラー]: -aと-oは同時に存在できません \n") if Envariable.get_task_area(): ("国内" 、"海外") のEnvariable.get_task_area() でない場合: sys.exit("\n[error]: Area value Error、'domestic 'または 'overseas'\n" の'-a' オプション) if Envariable.get_task_otype(): if not Envariable.get_task_otype() in ("File", "Directory"): sys.exit("\n[error]: ObjectType値エラー、「ファイル」または「ディレクトリ」のオプション) Envariable.get_task_type() == 'push' の場合: sys.exit("\n [エラー]: -tはクリアで、'push' -a use together\n" でなければなりません) Eなどの例外を除いて: logging.info("\n[error]: パラメーター {0} error\n".format(str(e))) とsys.exit (1) handler = BaseCheck() handler.urlFormat() およびhandler.printQuota(): doTask.doProd(Envariable.get_fd()) のg用: Envariable.LISTS = [] doTask.doRefresh(''.join(g)) time.sleep(1) def helps(self): print("\nscriptオプションの説明: \ \n\t -i <AccessKey> Alibaba Cloudへのログインに使用されるAccessKey ID。 Alibaba Cloud管理コンソールでAccessKeyペアを表示できます。 \ \n\t -k <AccessKeySecret> Alibaba Cloudへのログインに使用されるAccessKeyシークレット。 Alibaba Cloud管理コンソールでAccessKeyシークレットを表示できます。 \ \n\t -r <filename> ファイルパスとファイル名。 スクリプトが実行されると、スクリプトはファイル内のURLを読み取ります。 各行に含まれるURLは1つだけです。 特殊文字を含むURLをエンコードします。 エンコードされたURLはhttpまたはhttpsで始まる必要があります。 \ \n\t -t <taskType> タスクのタイプ。 値をclearに設定して、更新タスクを作成します。 値をpushに設定して、プリフェッチタスクを作成します。 \ \n\t -a [文字列, <国内 | 海外> オプション] 。 コンテンツがプリフェッチされるリージョン。 デフォルト値は海外です。 \ 国内の中国本土のみ。 \ 海外グローバル (中国本土を除く) \ \n\t -o [String,<ファイル | ディレクトリ>] オプション。 更新するリソースのタイプ。 \ ファイルファイル (デフォルト値) 。 \ ディレクトリディレクトリ ") if __name__ ='__main__': fun = Refresh() fun.main(sys.argv[1:])
Pythonをインストールしたら、Windowsコマンドプロンプトでpython $scripte -hコマンドを実行できます。
スクリプトオプションの説明:
-i <AccessKey> // Alibaba Cloudへのログインに使用されるAccessKey ID。 Alibaba Cloud管理コンソールでAccessKeyペアを表示できます。
-i <AccessKey> // Alibaba Cloudへのログインに使用されるAccessKeyシークレット。 Alibaba Cloud管理コンソールでAccessKeyペアを表示できます。
-r <filename> // ファイルパスとファイル名。 スクリプトが実行されると、スクリプトはファイル内のURLを読み取ります。 各行に含まれるURLは1つだけです。 特殊文字を含むURLをエンコードします。 エンコードされたURLはhttpまたはhttpsで始まる必要があります。
-t <taskType> // タスクのタイプ。 値をclearに設定して、更新タスクを作成します。 値をpushに設定して、プリフェッチタスクを作成します。
-a [String,<国内 | 海外> // オプション。 コンテンツがプリフェッチされる領域。 デフォルト値は海外です。
国内 // 中国本土のみ。
海外 // グローバル (中国本土を除く) 。
-o [String,<ファイル | ディレクトリ>] オプション。 更新するリソースのタイプ。
ファイル // ファイル (デフォルト値) 。
ディレクトリ // ディレクトリ。
サンプルスクリプト
Windowsコマンドプロンプトで、python Refresh.py -i your AccessKey ID -k your AccessKey secret -r the file names -t clearコマンドを実行します。 例:
python Refresh.py -i yourAccessKey -k yourAccessKeySecret -r /root/test/test.lst -t clear
{u'RefreshTaskId': u'8211135448', u'RequestId': u'093602B9-6192-4137-8CCA-0D8C85729DF6 '}
[8211135448] はやっています......
[8211135448] はやっています......
[8211135448] はやっています......
[8211135448] はやっています......
[8211135448] はやっています......
...
{u'RefreshTaskId': u'8211136701', u'RequestId': u'C1896DDD-003B-41F9-B481-93BC509ED5A3 '}
[8211136701] はやっています......
[8211136701] はやっています......
...