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

CDN:EdgeScript CLIを使用したスクリプトの管理

最終更新日:Mar 13, 2024

Alibaba Cloudは、オンプレミスで作成されたスクリプトをステージング環境と本番環境に公開できるようにするEdgeScript (ES) CLIを提供しています。 ES CLIを使用して、ステージング環境と本番環境でスクリプトを照会、変更、削除することもできます。 このトピックでは、ES CLIの使用方法について説明します。

ローカルCLIスクリプトファイルの作成

  1. cdn-apiなどのフォルダを作成します。

  2. フォルダーにaliyun.iniというテキストファイルを作成し、Alibaba Cloud RAMユーザーの認証情報を記録します。 次のコードは、ファイルの内容を説明します。

    [資格情報]
    accesskeyid = $accesskeyid
    accesskeysecret = $accesskeysecret 
  3. es CLIのPythonスクリプトコードを記録するために、フォルダ内にES. pyテキストファイルを作成します。 次のコードは、ファイルの内容を説明します。

    #!/usr/bin/python
    # -*-コーディング: utf-8 -*-
    
    インポートsys, os
    urllib, urllib2をインポート
    インポートbase64
    hmacのインポート
    hashlibのインポート
    hashlibからsha1をインポート
    インポート時間
    uuidのインポート
    jsonのインポート
    optparse importからOptionParser
    ConfigParserのインポート
    インポートトレースバック
    urllib2のインポート
    
    access_key_id = '';
    access_key_secret = '';
    cdn_server_address = 'https:// cdn.aliyuncs.com'
    CONFIGFILE = os.getcwd() + '/aliyun.ini'
    構成='資格'
    cmdlist = '''
    
       1. ESルールをシミュレートされた環境または本番環境に公開する
          . /es.py action=push_test_env domain=<domain> rule='{"pos":"<head | foot>","pri":"0-999","rule_path":"<the es code path>","enable":"<on | off>"}'
          . /es.py action=push_product_env domain=<domain> rule='{"pos":"<head | foot>","pri":"0-999","rule_path":"<the es code path>","enable":"<on | off>","configid":"<configid>"}'
    
       2. シミュレーション環境または本番環境でESルールを照会する
          . /es.pyアクション=query_test_envドメイン=<ドメイン>
          . /es.pyアクション=query_product_envドメイン=<ドメイン>
    
       3. シミュレーション環境または本番環境でESルールを削除する
          . /es.py action=del_test_env domain=<domain> configid=<configid>
          . /es.py action=del_product_env domain=<domain> configid=<configid>
    
       4. シミュレーション環境から運用環境にESルールを公開するか、またはシミュレーション環境でESルールをロールバックする
          . /es.pyアクション=publish_test_envドメイン=<ドメイン>
          . /es.pyアクション=rollback_test_envドメイン=<ドメイン>
    ''
    
    def percent_encode(str):
        res = urllib.quote(str.de code(sys.stdin.encoding).encode('utf8'), '')
        res = res.replace('+', '% 20')
        res = res.replace('*', '% 2A')
        res = res.replace('% 7E', ' ~ ')
        resを返す
    
    def compute_signature (パラメータ、access_key_secret):
        sortedParameters = sorted(parameters.items() 、key=lambda parameters: parameters[0])
    
        canonicalizedQueryString = ''
        sortedParametersの (k,v) について:
            canonicalizedQueryString += '&' + percent_encode(k) + '=' + percent_encode(v)
    
        stringToSign = 'GET&% 2F&'+ percent_encode(canonicalizedQueryString[1:])
    
        h = hmac.new(access_key_secret + "&", stringToSign, sha1)
        signature = base64.encodestring(h.digest()).strip()
        戻り署名
    
    def compose_url(user_params):
        timestamp = time.strftime("% Y-% m-% dT % H:% M:% SZ", time.gmtime())
    
        parameters = { \
            「フォーマット」: 「JSON」、\
            「バージョン」: 「2018-05-10」、\
            'AccessKeyId' : access_key_id、\
            'SignatureVersion' : '1.0 '、\
            'SignatureMethod' : 'HMAC-SHA1' 、\
            'SignatureNonce' : str(uuid.uuid1()) 、\
            「タイムスタンプ」: timestamp、\
        }
    
        user_params.keys() のキーの場合:
            parameters[key] = user_params[key]
    
        signature = compute_signature (パラメータ, access_key_secret)
        parameters['Signature'] = signature
        url = cdn_server_address + "/?" + urllib.urlencode (パラメータ)
        リターンurl
    
    def make_request(user_params、quiet=False):
        url = compose_url(user_params)
    
        試してみてください。
            req = urllib2.Request(url)
            r = urllib2.urlopen(req)
        urllib2.HTTPErrorを除いて、err:
            「レスポンスコード:\n =============== 」を印刷します
            プリントerr
            body=err.read()
            body_json = json.loads(body)
            body_str =json.dumps(body_json,indent=4)
            プリント "\nレスポンス情報:\n ================"
            プリントbody_str
            リターン
    
        if r.getcode() == 200:
            「レスポンスコード:\n ==================\ n200 OK」を印刷します
        プリント "\nレスポンス情報:\n ================"
        body=r.read()
        body_json = json.loads(body)
        body_str =json.dumps(body_json,indent=4)
        プリントbody_str
    
    def configure_accesskeypair(args、オプション):
        options.accesskeyidがNoneの場合、またはoptions.accesskeysecretがNoneの場合:
            print("config miss parameters, use -- id=[accesskeyid] -- secret=[accesskeysecret]")
            sys.exit(1)
        config = ConfigParser.RawConfigParser()
        config.add_section(CONFIGSECTION)
        config.set(CONFIGSECTION, 'accesskeyid', options.accesskeyid)
        config.set(CONFIGSECTION, 'accesskeysecret', options.accesskeysecret)
        cfgfile = open(CONFIGFILE, 'w + ')
        config.write(cfgfile)
        cfgfile.close()
    
    def setup_credentials():
        config = ConfigParser.ConfigParser()
        試してみてください。
            config.read(CONFIGFILE)
            グローバルaccess_key_id
            グローバルaccess_key_secret
            access_key_id = config.get(CONFIGSECTION, 'accesskeyid')
            access_key_secret = config.get(CONFIGSECTION, 'accesskeysecret')
        except ServerException, e:
            print traceback.format_exc()
            print("アクセスキーペアを取得できません。セットアップにはconfig -- id=[accesskeyid] -- secret=[accesskeysecret] を使用します")
            sys.exit (1)
    
    def parse_args(user_params):
        req_args = {}
    
        user_params['action'] == 'push_test_env 'またはuser_params['action'] == 'push_product_env' の場合:
            user_params.has_key('domain') またはuser_params.has_key('rule') 以外の場合:
                parser.print_help()
                sys.exit(0)
    
            data = []
            user_params['rule'] のルールの場合:
                rule_cfg = {
                    'functionId' : 180、
                    'functionName' : 'edge_function' 、
                    'functionArgs' : []
                }
                ルールのkの場合:
                    arg_cfg = {}
                    if k == 'configid':
                        rule_cfg['configId'] = int(rule[k])
                    elif k == 'rule_path':
                        試してみてください。
                            f = open(rule[k], "r")
                            code = f.read()
                        IOErrorを除いて:
                            「ioエラー」を印刷する
                            sys.exit(0)
                        else:
                            f.close()
                        arg_cfg['argName'] = 'rule'
                        arg_cfg['argValue'] = code
                        rule_cfg['functionArgs'].append(arg_cfg)
                    else:
                        arg_cfg['argName'] = k
                        arg_cfg['argValue'] = rule[k]
                        rule_cfg['functionArgs'].append(arg_cfg)
                data.append(rule_cfg)
            rule_str = json.dumps (データ)
            
            user_params['action'] == 'push_test_env 'の場合:
                req_args = {'Action':'SetCdnDomainStagingConfig', 'DomainName':user_params['domain'], 'Functions':rule_str}
            else:
                req_args = {'Action':'BatchSetCdnDomainConfig', 'DomainNames':user_params['domain'], 'Functions':rule_str}
    
        elif user_params['action'] == 'query_test_env ':
            user_params.has_key('domain') でない場合:
                parser.print_help()
                sys.exit(0)
            req_args = {'Action ':'DescribeCdnDomainStagingConfig', 'DomainName':user_params['domain'], 'FunctionNames':'edge_function'}
    
        elif user_params['action'] == 'query_product_env ':
            user_params.has_key('domain') でない場合:
                parser.print_help()
                sys.exit(0)
            req_args = {'Action':'DescribeCdnDomainConfigs', 'DomainName':user_params['domain'], 'FunctionNames':'edge_function'}
    
        elif user_params['action'] == 'del_test_env ':
            user_params.has_key('domain') またはuser_params.has_key('configid') でない場合:
                parser.print_help()
                sys.exit(0)
            req_args = {'Action ':'DeleteSpecificStagingConfig', 'DomainName':user_params['domain'], 'ConfigId':user_params['configid']}
    
        elif user_params['action'] == 'del_product_env ':
            user_params.has_key('domain') またはuser_params.has_key('configid') でない場合:
                parser.print_help()
                sys.exit(0)
            req_args = {'Action':'DeleteSpecificConfig', 'DomainName':user_params['domain'], 'ConfigId':user_params['configid']}
    
        elif user_params['action'] == 'publish_test_env ':
            user_params.has_key('domain') でない場合:
                parser.print_help()
                sys.exit(0)
            req_args = {'Action':'PublishStagingConfigToProduction', 'DomainName':user_params['domain'], 'FunctionName':'edge_function'}
    
        elif user_params['action'] == 'rollback_test_env ':
            user_params.has_key('domain') でない場合:
                parser.print_help()
                sys.exit(0)
            req_args = {'Action':'RollbackStagingConfig', 'DomainName':user_params['domain'], 'FunctionName':'edge_function'}
    
        else:
            parser.print_help()
            sys.exit(0)
    
        req_argsを返す
    
    if __name__ ='__main__':
        パーサー=OptionParser("% s Action=action Param1=Value1 Param2=Value2 % s\n" % (sys.argv[0], cmdlist))
        parser.add_option("-i", "-- id", dest="accesskeyid", help="アクセスキーidを指定")
        parser.add_option("-s", "-- secret", dest="accesskeysecret", help="アクセスキーの秘密を指定")
    
        (options, args) = parser.parse_args()
        len(args) < 1の場合:
            parser.print_help()
            sys.exit(0)
    
        if args[0] == 'help':
            parser.print_help()
            sys.exit(0)
        if args[0] ! ='config':
            setup_credentials()
        else: # configure id/secretコマンドです
            configure_accesskeypair(args、オプション)
            sys.exit(0)
    
        user_params = {}
        idx = 1
        if sys.argv[1].lower().startswith('action='):
            _, value = sys.argv[1].split('=')
            user_params['action'] =値
            idx = 2
        else:
            parser.print_help()
            sys.exit(0)
    
        sys.argv[idx:] のargの場合:
            試してみてください。
                key, value = arg.split('=', 1)
                if key == 'rule': # push_test_env / push_product_env
                    user_params.has_key('rule') でない場合:
                        user_params['rule'] = []
                    user_params['rule'].append(json.loads(value))
                else:
                    user_params[key.strip()] = value
            ValueErrorを除いて、e:
                プリント (e.read().strip())
                SystemExit(e) を上げる
    
        req_args = parse_args(user_params)
        make_request(req_args) 

ES CLIの使用

  1. AccessKeyペアを設定します。

    $python。/es.py config -- id=AK_ID -- secret=AK_SECRET
    $cat aliyun.ini
    
    [資格情報]
    accesskeyid = AccessKey ID
    accesskeysecret = AccessKey secret 

  2. スクリプトをステージング環境または運用環境に公開します。

    . /es.py action=push_test_env domain=<domain> rule='{"pos":"<head | foot>","pri":"0-999","rule_path":"<the es code path>","enable":"<on | off>"}'
    . /es.py action=push_product_env domain=<domain> rule='{"pos":"<head | foot>" 、"pri":"0-999" 、"rule_path":"<the es code path>" 、"enable":"<on | off>" 、"configid":"<configid>"}' 

    次の表に、スクリプトのフィールドを示します。

    フィールド

    必須

    説明

    enable

    スクリプトを有効にするか無効にするかを指定します。 有効な値:

    • on

    • オフ

    pos

    スクリプトが実行される位置。 有効な値:

    • ヘッド

    プリ

    スクリプトの優先度。 優先順位は、同じ位置で実行されるスクリプトのみに設定できます。 有効値: 0 ~ 999

    • 値0は、最も高い優先度を示す。

    • 値999は、最も低い優先度を示す。

    ルール

    スクリプトの内容。

    brk

    任意

    現在のスクリプトが実行されている場合、後続のスクリプトをスキップするかどうかを指定します。 有効な値:

    • on

    • オフ

    testip

    任意

    クライアントの IP アドレス。 デフォルトでは、このフィールドは空です。 クライアントIPアドレスを指定した場合、指定したIPアドレスから送信されたリクエストのみがスクリプトの実行をトリガーできます。

    オプション

    任意

    拡張子。 EdgeScriptは拡張機能をサポートしています。 このフィールドを _es_dbg=signatureに設定すると、レスポンスヘッダーのデバッグが有効になります。

    説明
    • ドメイン名の設定を作成すると、一意の設定IDが生成されます。 設定IDを指定して、ドメイン名の設定を更新または削除できます。 構成IDを生成、クエリ、および使用する方法については、「ConfigIdの使用方法に関する注意事項」をご参照ください。

    • スクリプトを作成するときに、構成IDを指定する必要はありません。

    • スクリプトを変更する場合は、構成IDを指定する必要があります。 クエリ操作を呼び出して、スクリプトの構成IDを取得できます。

    • 複数のスクリプトを指定できます。

  3. ステージング環境または運用環境でクエリスクリプトをします。

    . /es.pyアクション=query_test_envドメイン=<ドメイン>
    . /es.pyアクション=query_product_envドメイン=<ドメイン> 
  4. ステージング環境または運用環境からスクリプトを削除します。

    . /es.py action=del_test_env domain=<domain> configid=<configid>
    . /es.py action=del_product_env domain=<domain> configid=<configid> 
  5. ステージング環境から本番環境にスクリプトを発行するか、本番環境からステージング環境にスクリプトをロールバックします。

    . /es.pyアクション=publish_test_envドメイン=<ドメイン>
    . /es.pyアクション=rollback_test_envドメイン=<ドメイン> 

たとえば、すべてのm3u8リクエストをブロックするために使用されるM3U8. esスクリプトを作成、保存、テスト、および公開できます。 詳細については、「ES CLIを使用してスクリプトを管理する方法の例」をご参照ください。

リクエストヘッダーのデバッグ

  1. デバッグを実行します。

    デバッグを実行するには、WebIDEをサポートするAlibaba Cloud CDNコンソールで _es_dbgパラメーターを設定するか、次のコマンドを実行します。

    . /es.py action=push_test_env domain=<domain> rule='{"pos":"<head | foot>" 、"pri":"0-999" 、"rule_path":"<the es code path>" 、"enable":"<on | off>" 、"configid":"<configid>" 、"オプション" "_es_dbg=123"}'
  2. デバッグ結果を確認します。

    _es_dbgパラメーターはリクエストヘッダーに含まれ、値はスクリプトのオプション拡張で指定した _es_dbgパラメーターの値に設定されます。 デバッグ結果を表示するには、レスポンスヘッダーに含まれる次の情報を確認します。

    TRACE情報: X-DEBUG-ES-TRACE-RULE-{スクリプトID} スクリプトの制御フローを確認してください。 制御フローは _Row number_Function name (input parameter): 戻り値 {_Execution duration} 形式です。