Alibaba Cloudは、オンプレミスで作成されたスクリプトをステージング環境と本番環境に公開できるようにするEdgeScript (ES) CLIを提供しています。 ES CLIを使用して、ステージング環境と本番環境でスクリプトを照会、変更、削除することもできます。 このトピックでは、ES CLIの使用方法について説明します。
ローカルCLIスクリプトファイルの作成
cdn-api
などのフォルダを作成します。フォルダーに
aliyun.ini
というテキストファイルを作成し、Alibaba Cloud RAMユーザーの認証情報を記録します。 次のコードは、ファイルの内容を説明します。[資格情報] accesskeyid = $accesskeyid accesskeysecret = $accesskeysecret
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の使用
AccessKeyペアを設定します。
$python。/es.py config -- id=AK_ID -- secret=AK_SECRET $cat aliyun.ini [資格情報] accesskeyid = AccessKey ID accesskeysecret = AccessKey secret
スクリプトをステージング環境または運用環境に公開します。
. /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を取得できます。
複数のスクリプトを指定できます。
ステージング環境または運用環境でクエリスクリプトをします。
. /es.pyアクション=query_test_envドメイン=<ドメイン> . /es.pyアクション=query_product_envドメイン=<ドメイン>
ステージング環境または運用環境からスクリプトを削除します。
. /es.py action=del_test_env domain=<domain> configid=<configid> . /es.py action=del_product_env domain=<domain> configid=<configid>
ステージング環境から本番環境にスクリプトを発行するか、本番環境からステージング環境にスクリプトをロールバックします。
. /es.pyアクション=publish_test_envドメイン=<ドメイン> . /es.pyアクション=rollback_test_envドメイン=<ドメイン>
たとえば、すべてのm3u8リクエストをブロックするために使用されるM3U8. esスクリプトを作成、保存、テスト、および公開できます。 詳細については、「ES CLIを使用してスクリプトを管理する方法の例」をご参照ください。
リクエストヘッダーのデバッグ
デバッグを実行します。
デバッグを実行するには、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"}'
デバッグ結果を確認します。
_es_dbg
パラメーターはリクエストヘッダーに含まれ、値はスクリプトのオプション拡張で指定した_es_dbg
パラメーターの値に設定されます。 デバッグ結果を表示するには、レスポンスヘッダーに含まれる次の情報を確認します。TRACE情報:
X-DEBUG-ES-TRACE-RULE-{スクリプトID}
スクリプトの制御フローを確認してください。 制御フローは_Row number_Function name (input parameter): 戻り値 {_Execution duration}
形式です。