Ver Fonte

add dns_alb_weight

xuekailun há 3 meses atrás
pai
commit
007e7df58c
3 ficheiros alterados com 251 adições e 0 exclusões
  1. 38 0
      dns/conf.py
  2. 68 0
      dns/dns_weight.py
  3. 145 0
      dns/utils.py

+ 38 - 0
dns/conf.py

@@ -0,0 +1,38 @@
+from datetime import datetime, timedelta
+
+
+
+metrics_client={
+    'access_key_id': 'dfghj',
+    'access_key_secret': 'dtfyvgubh',
+    'endpoint': 'metrics.cn-hangzhou.aliyuncs.com'
+}
+
+dns_client={
+    'access_key_id': 'dfghj',
+    'access_key_secret': 'dtfyvgubh',
+    'endpoint': 'alidns.cn-hangzhou.aliyuncs.com'
+}
+
+
+# 监控结束时间
+end_time = datetime.now()
+# 监控开始时间
+start_time = end_time - timedelta(minutes=1)
+
+# 云产品的数据命名空间 共享带宽
+namespace = 'acs_bandwidth_package'
+# 云产品的监控项名称 入流量
+metric_name = 'net_rx.rate'
+# 监控数据的统计周期 秒
+period = '60'
+# 指定资源的监控维度 共享带宽
+dimensions = '[{"instanceId":"cbwp-bp1s7rhtef9o6ajiaktrr"}'
+
+# 设置请求和接收消息的语言类型
+lang = 'en',
+# 解析记录的ID 主域名
+domain_name = 'piaoquantv.com'
+
+# backup_alb ip
+backup_alb_ip_list=["47.96.130.90", "47.96.81.165"]

+ 68 - 0
dns/dns_weight.py

@@ -0,0 +1,68 @@
+# -*- coding: utf-8 -*-
+# This file is auto-generated, don't edit it. Thanks.
+import os
+import sys
+import json
+
+from typing import List
+from http.client import responses
+
+from alibabacloud_alidns20150109.client import Client as Alidns20150109Client
+from alibabacloud_tea_openapi import models as open_api_models
+from alibabacloud_alidns20150109 import models as alidns_20150109_models
+from alibabacloud_tea_util import models as util_models
+from alibabacloud_tea_util.client import Client as UtilClient
+from alibabacloud_cms20190101.client import Client as Cms20190101Client
+from alibabacloud_tea_openapi import models as open_api_models
+from alibabacloud_cms20190101 import models as cms_20190101_models
+from alibabacloud_tea_util import models as util_models
+from alibabacloud_tea_util.client import Client as UtilClient
+
+import conf
+import utils
+
+def main():
+    try:
+        # 云监控客户端
+        metrics_client = utils.client(access_key_id=conf.metrics_client['access_key_secret'],
+                                      access_key_secret=conf.metrics_client['access_key_secret'],
+                                      endpoint=conf.metrics_client['endpoint']
+                                      )
+        # DNS客户端
+        dns_client = utils.client(access_key_id=conf.dns_client['access_key_secret'],
+                                  access_key_secret=conf.dns_client['access_key_secret'],
+                                  endpoint=conf.dns_client['endpoint']
+                                  )
+        # 获取共享带宽流量 metric_name 入网流量
+        bandwidth = utils.DescribeMetricList(metrics_client=metrics_client,
+                                       namespace=conf.namespace,
+                                       metric_name=conf.metric_name,
+                                       period=conf.period,
+                                       dimensions=conf.dimensions,
+                                       start_time=conf.start_time,
+                                       end_time=conf.end_time)
+        # 获取所有dns解析RecordId
+        # {'Value': '', 'RecordId': ''}
+        record_list = utils.DescribeDomainRecords(dns_client=dns_client,
+                                             lang=conf.lang,
+                                             domain_name=conf.domain_name)
+        # 获取backup_alb RecordId
+        matched_record_ids = [
+            record['RecordId']
+            for record in record_list
+            if record['Value'] in conf.backup_alb_ip_list
+        ]
+
+        # 计算权重比
+        backup_weight = utils.update_dns_weights(bandwidth)
+        for record in matched_record_ids:
+            # 修改backup权重
+            utils.update_dnsslbweight(dns_client=dns_client,
+                                      lang=conf.lang,
+                                      record=record,
+                                      backup_weight=backup_weight)
+    except Exception as e:
+        exit(e)
+
+if __name__ == '__main__':
+    main()

+ 145 - 0
dns/utils.py

@@ -0,0 +1,145 @@
+# -*- coding: utf-8 -*-
+import os
+import sys
+import json
+from http.client import responses
+
+import conf
+
+from typing import List
+
+from alibabacloud_alidns20150109.client import Client as Alidns20150109Client
+from alibabacloud_tea_openapi import models as open_api_models
+from alibabacloud_alidns20150109 import models as alidns_20150109_models
+from alibabacloud_tea_util import models as util_models
+from alibabacloud_tea_util.client import Client as UtilClient
+from alibabacloud_cms20190101.client import Client as Cms20190101Client
+from alibabacloud_tea_openapi import models as open_api_models
+from alibabacloud_cms20190101 import models as cms_20190101_models
+from alibabacloud_tea_util import models as util_models
+from alibabacloud_tea_util.client import Client as UtilClient
+
+
+def update_dns_weights(bandwidth):
+    if bandwidth > 1800:
+        alb_weight = round(1800 / bandwidth * 100)
+        backup_weight = (100 - alb_weight) // 2
+        print(f"alb_weight: {alb_weight}, backup_weight: {backup_weight}")
+        return backup_weight
+    else:
+        alb_weight = 0
+        backup_weight = 0
+        print(f"alb_weight: {alb_weight}, backup_weight: {backup_weight}")
+        return backup_weight
+
+
+
+def client(access_key_id, access_key_secret, endpoint) -> Cms20190101Client:
+    """
+    使用AK&SK初始化账号Client
+    @return: Client
+    @throws Exception
+    """
+    # 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
+    # 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378659.html。
+    config = open_api_models.Config(
+        # 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。,
+        access_key_id=os.environ[access_key_id],
+        # 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。,
+        access_key_secret=os.environ[access_key_secret]
+    )
+    # Endpoint 请参考 https://api.aliyun.com/product/Cms
+    config.endpoint = endpoint
+    return Cms20190101Client(config)
+
+
+def DescribeMetricList(metrics_client, namespace, metric_name, period, dimensions, start_time, end_time):
+    metrics_client()
+    describe_metric_list_request = cms_20190101_models.DescribeMetricListRequest(
+        namespace=namespace,
+        metric_name=metric_name,
+        period=period,
+        dimensions=dimensions,
+        start_time=start_time,
+        end_time=end_time
+    )
+    runtime = util_models.RuntimeOptions()
+    try:
+        # 复制代码运行请自行打印 API 的返回值
+        response = metrics_client.describe_metric_list_with_options(describe_metric_list_request, runtime)
+        datapoints = json.loads(response["Datapoints"])
+        if datapoints:
+            value_in_bits = datapoints[0]["Value"]
+            value_in_megabits = value_in_bits / 1000000
+            print(f"Value in Megabits: {value_in_megabits:.2f} Mb")
+            return value_in_megabits
+    except Exception as error:
+        exit(error)
+
+
+def get_records(response):
+    # 提取longvideoapi的Value和RecordId
+    # longvideoapi_records = [
+    records = [
+        {
+            "Value": record["Value"],
+            "RecordId": record["RecordId"]
+        }
+        for record in response["DomainRecords"]["Record"]
+        if record["RR"] == "longvideoapi"
+    ]
+    return records
+
+
+def DescribeDomainRecords(dns_client, lang, domain_name):
+    dns_client()
+    describe_domain_records_request = alidns_20150109_models.DescribeDomainRecordsRequest(
+        lang=lang,
+        domain_name=domain_name,
+        page_size=500,
+        page_number=1
+    )
+    runtime = util_models.RuntimeOptions()
+    try:
+        # 复制代码运行请自行打印 API 的返回值
+        response=dns_client.describe_domain_records_with_options(describe_domain_records_request, runtime)
+        # record_id = response["DomainRecords"]["Record"][0]["RecordId"]
+        # print(f"RecordId: {record_id}")
+        # return record_id
+        # longvideoapi_records = [
+        #     {
+        #         "Value": record["Value"],
+        #         "RecordId": record["RecordId"]
+        #     }
+        #     for record in response["DomainRecords"]["Record"]
+        #     if record["RR"] == "longvideoapi"
+        # ]
+        #
+        # # 打印结果
+        # for record in longvideoapi_records:
+        #     print(f"Value: {record['Value']}, RecordId: {record['RecordId']}")
+        # 调用函数并获取结果
+        result = get_records(response)
+        # 打印结果
+        for record in result:
+            print(record)
+    except Exception as error:
+        exit(error)
+
+
+
+def update_dnsslbweight(dns_client, lang, record, backup_weight):
+    dns_client()
+    update_dnsslbweight_request = alidns_20150109_models.UpdateDNSSLBWeightRequest(
+        lang=lang,
+        record_id=record,
+        weight=backup_weight
+    )
+    runtime = util_models.RuntimeOptions()
+    try:
+        # 复制代码运行请自行打印 API 的返回值
+        dns_client.update_dnsslbweight_with_options(update_dnsslbweight_request, runtime)
+    except Exception as error:
+        exit(error)
+
+