すべてのプロダクト
Search
ドキュメントセンター

CDN:スクリプトを実行してコンテンツを更新およびプリフェッチする

最終更新日:Jan 24, 2024

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( &#039;JSON&#039;)
                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] はやっています......
...