Beispiel #1
0
class aliApiTools():
    def __init__(self, ali_key, ali_secret):
        self.ali_key = ali_key
        self.ali_secret = ali_secret
        self.client = AcsClient(
            self.ali_key,
            self.ali_secret,
        )

    def getAliRedisInstanceid(self, regionids):
        for regionid in regionids:
            self.client.set_region_id(regionid)
            # 设置初始页码
            pageNumber = 1

            request = DescribeInstancesRequest.DescribeInstancesRequest()
            request.set_accept_format('json')
            request.set_PageSize(10)
            request.set_PageNumber(pageNumber)

            # 发起API请求并显示返回值
            response = self.client.do_action_with_exception(request)
            response_dict = json.loads(response)

            # 生成生成器
            while response_dict['Instances']['KVStoreInstance']:
                yield response_dict['Instances']['KVStoreInstance']
                pageNumber += 1
                request.set_PageNumber(pageNumber)
                response = self.client.do_action_with_exception(request)
                response_dict = json.loads(response)
 def test_acs_client(self):
     with self.assertRaises(ClientException) as ex:
         AcsClient()
     self.assertEqual(ex.exception.error_code, "SDK.InvalidCredential")
     self.assertEqual(
         ex.exception.message,
         "Need a ak&secret pair or public_key_id&private_key pair to auth.")
     client = AcsClient(ak="access_key_id", secret="access_key_secret")
     self.assertEqual(client.get_access_key(), "access_key_id")
     self.assertEqual(client.get_access_secret(), "access_key_secret")
     # region id
     self.assertEqual(client.get_region_id(), "cn-hangzhou")
     client.set_region_id('cn-shanghai')
     self.assertEqual(client.get_region_id(), "cn-shanghai")
     # auto retry
     self.assertTrue(client.is_auto_retry())
     client.set_auto_retry(False)
     self.assertFalse(client.is_auto_retry())
     # max retry num
     self.assertEqual(client.get_max_retry_num(), None)
     client.set_max_retry_num(10)
     self.assertEqual(client.get_max_retry_num(), 10)
     # user agent
     self.assertEqual(client.get_user_agent(), None)
     client.set_user_agent('new-user-agent')
     self.assertEqual(client.get_user_agent(), "new-user-agent")
     # port
     self.assertEqual(client.get_port(), 80)
     self.assertIsNone(client.get_location_service())
class ecsBandMonitor(object):

    def __init__(self, ali_key, ali_secret, region_id):
        self.ali_key = ali_key
        self.ali_secret = ali_secret
        self.client = AcsClient(
            self.ali_key,
            self.ali_secret,
        )
        # 创建AcsClient实例
        self.client.set_region_id(region_id)

    def getAliyunEcsInfo(self):
        # 获取ecs实例信息,利用迭代器,可直接遍历函数得到ecs实例信息
        # for a in get_aliyun_ecs(ali_key, ali_secret, region_ids):
        #   for ecs in a:
        #       print(ecs['InstanceId'], ecs['HostName'], ecs['ZoneId'], ecs['PublicIpAddress']['IpAddress'], ecs['InnerIpAddress']['IpAddress'], ecs['StartTime'])
        # ecs instance各字段解释:https://help.aliyun.com/document_detail/25656.html?spm=a2c4g.11186623.2.2.a0TLxW#InstanceAttributesType
        # 设置初始页码
        pageNumber = 1

        # 创建request,并设置参数
        request = DescribeInstancesRequest.DescribeInstancesRequest()
        request.set_accept_format('json')
        request.set_PageSize(10)
        request.set_PageNumber(pageNumber)
        # request.set_
        response = self.client.do_action_with_exception(request)

        # 发起API请求并显示返回值
        response_dict = json.loads(response)

        # 生成生成器
        while response_dict['Instances']['Instance']:
            yield response_dict['Instances']['Instance']
            pageNumber += 1
            request.set_PageNumber(pageNumber)
            response = self.client.do_action_with_exception(request)
            response_dict = json.loads(response)

    def get_ecs_monitor(self, instances_ids, period):
        # 实例化request
        request = QueryMetricLastRequest.QueryMetricLastRequest()
        # 组装request,接手json,监控流出流量,周期300s
        request.set_accept_format('json')
        request.set_Project('acs_ecs_dashboard')
        request.set_Metric('InternetOutRate')
        request.set_Period(period)
        request.set_Dimensions(instances_ids)
        response = self.client.do_action_with_exception(request)
        response_dict = json.loads(response)
        infos = response_dict.get('Datapoints')
        return infos
class ecsBandMonitor(object):

    def __init__(self, ali_key, ali_secret, region_id):
        self.ali_key = ali_key
        self.ali_secret = ali_secret
        self.client = AcsClient(
            self.ali_key,
            self.ali_secret,
        )
        # 创建AcsClient实例
        self.client.set_region_id(region_id)

    def getAliyunEcsInfo(self):
        # 获取ecs实例信息,利用迭代器,可直接遍历函数得到ecs实例信息
        # for a in get_aliyun_ecs(ali_key, ali_secret, region_ids):
        #   for ecs in a:
        #       print(ecs['InstanceId'], ecs['HostName'], ecs['ZoneId'], ecs['PublicIpAddress']['IpAddress'], ecs['InnerIpAddress']['IpAddress'], ecs['StartTime'])
        # ecs instance各字段解释:https://help.aliyun.com/document_detail/25656.html?spm=a2c4g.11186623.2.2.a0TLxW#InstanceAttributesType
        # 设置初始页码
        pageNumber = 1

        # 创建request,并设置参数
        request = DescribeInstanceStatusRequest.DescribeInstanceStatusRequest()
        request.set_accept_format('json')
        request.set_PageSize(10)
        request.set_PageNumber(pageNumber)
        # request.set_
        response = self.client.do_action_with_exception(request)

        # 发起API请求并显示返回值
        response_dict = json.loads(response)

        # 生成生成器
        while response_dict['InstanceStatuses']['InstanceStatus']:
            yield response_dict['InstanceStatuses']['InstanceStatus']
            pageNumber += 1
            request.set_PageNumber(pageNumber)
            response = self.client.do_action_with_exception(request)
            response_dict = json.loads(response)

    def checkAliMonitorStatus(self, instance_id):
        # 实例化request
        request = NodeStatusRequest.NodeStatusRequest()

        # 组装request,接受json
        request.set_accept_format('json')
        request.set_InstanceId(instance_id)
        response = self.client.do_action_with_exception(request)
        response_dict = json.loads(response)
        return response_dict
class aliRedisMonitor(object):
    def __init__(self, ali_key, ali_secret, region_id):
        self.ali_key = ali_key
        self.ali_secret = ali_secret
        self.client = AcsClient(
            self.ali_key,
            self.ali_secret,
        )
        # 创建AcsClient实例
        self.client.set_region_id(region_id)

    def get_aliredis_instanceid(self, regionids):
        for regionid in regionids:
            self.client.set_region_id(regionid)
            # 设置初始页码
            pageNumber = 1

            request = DescribeInstancesRequest.DescribeInstancesRequest()
            request.set_accept_format('json')
            request.set_PageSize(10)
            request.set_PageNumber(pageNumber)

            # 发起API请求并显示返回值
            response = self.client.do_action_with_exception(request)
            response_dict = json.loads(response)

            # 生成生成器
            while response_dict['Instances']['KVStoreInstance']:
                yield response_dict['Instances']['KVStoreInstance']
                pageNumber += 1
                request.set_PageNumber(pageNumber)
                response = self.client.do_action_with_exception(request)
                response_dict = json.loads(response)

    def get_ali_monitor_info(self, instances_ids, metric, period):
        # 实例化request
        request = QueryMetricLastRequest.QueryMetricLastRequest()
        # 组装request,接手json,监控流出流量,周期300s
        request.set_accept_format('json')
        request.set_Project('acs_kvstore')
        request.set_Metric(metric)
        request.set_Period(period)
        request.set_Dimensions(instances_ids)
        response = self.client.do_action_with_exception(request)
        response_dict = json.loads(response)
        infos = response_dict.get('Datapoints')
        return infos
    def test_resolve_endpoint(self):
        client = AcsClient("id", "aks", region_id='', port=51352)
        req = RpcRequest('sts', '2020', 'test')
        req.endpoint = 'localhost'
        req.request_network = ''
        req.product_suffix = ''
        self.do_request(client, req)

        try:
            client._resolve_endpoint(req)
        except Exception as e:
            self.assertEqual("No such region ''. Please check your region ID.",
                             e.message)

        client.set_region_id('cn@hangzhou')
        try:
            client._resolve_endpoint(req)
        except Exception as e:
            self.assertEqual(
                'The parameter region_id not match with ^[a-zA-Z0-9_-]+$',
                e.message)
Beispiel #7
0
class aliRedisMonitor(object):
    def __init__(self, ali_key, ali_secret, region_id):
        self.ali_key = ali_key
        self.ali_secret = ali_secret
        self.client = AcsClient(
            self.ali_key,
            self.ali_secret,
        )
        # 创建AcsClient实例
        self.client.set_region_id(region_id)

    def get_ali_monitor_info(self, instances_ids, metric, period):
        # 实例化request
        request = QueryMetricLastRequest.QueryMetricLastRequest()
        # 组装request,接手json,监控流出流量,周期300s
        request.set_accept_format('json')
        request.set_Project('acs_kvstore')
        request.set_Metric(metric)
        request.set_Period(period)
        request.set_Dimensions(instances_ids)
        response = self.client.do_action_with_exception(request)
        response_dict = json.loads(response)
        infos = response_dict.get('Datapoints')
        return infos
Beispiel #8
0
    'username': envs['ACR_DOCKER_USERNAME'],
    'password': envs['ACR_DOCKER_PASSWORD']
}

client = docker.from_env()

if not os.path.exists(filename):
    sys.exit(1)
lines = [line.strip() for line in open(filename)]

for line in lines:
    if line.startswith('#'):
        continue
    if line == '':
        continue
    try:
        repos = line.split(":")
        remote_repos = repolize(repos[0])
        acr_repos = repolize(repos[1])
        acr_repos.append('_'.join(remote_repos))
        tag_regexp = repos[2]
        remote_tags = get_repo_tags(remote_repos, tag_regexp, sync_nums)
        acr_region = acr_repos[0].split('.')[1]
        apiClient.set_region_id(acr_region)
        acr_tags = get_acr_tags(acr_repos[1], acr_repos[2])
        sync_tags = get_push_tags(acr_tags, remote_tags)
        sync_repo(client, '/'.join(remote_repos), '/'.join(acr_repos),
                  sync_tags)
    except Exception:
        traceback.print_exc()
class AliSlbTools(object):
    def __init__(self, ali_key, ali_secret, region_id):
        self.ali_key = ali_key
        self.ali_secret = ali_secret
        self.client = AcsClient(
            self.ali_key,
            self.ali_secret,
        )
        self.region_id = region_id
        self.client.set_region_id(self.region_id)

    def get_internet_type_slb(self, withbandwidth=False):
        pageNumber = 1
        request = DescribeLoadBalancersRequest.DescribeLoadBalancersRequest()
        request.set_PageSize(10)
        request.set_PageNumber(pageNumber)
        request.set_accept_format('json')
        request.set_AddressType('internet')
        request.set_NetworkType('classic')
        request.set_LoadBalancerStatus('active')
        if withbandwidth:
            request.set_InternetChargeType('paybybandwidth')
        response = self.client.do_action_with_exception(request)
        response_dict = json.loads(response)
        # 生成生成器
        while response_dict.get('LoadBalancers').get('LoadBalancer'):
            yield response_dict.get('LoadBalancers').get('LoadBalancer')
            pageNumber += 1
            request.set_PageNumber(pageNumber)
            response = self.client.do_action_with_exception(request)
            response_dict = json.loads(response)

    def get_slb_attr(self, slb_id):
        request = DescribeLoadBalancerAttributeRequest.DescribeLoadBalancerAttributeRequest(
        )
        request.set_accept_format('json')
        request.set_LoadBalancerId(slb_id)
        response = self.client.do_action_with_exception(request)
        response_dict = json.loads(response)
        return response_dict

    def get_slb_listener_ports(self, slb_id):
        res = self.get_slb_attr(slb_id)
        ports_and_protos = res.get('ListenerPortsAndProtocol').get(
            'ListenerPortAndProtocol')
        port_infos = []
        for port_and_proto in ports_and_protos:
            proto = port_and_proto.get('ListenerProtocol')
            port = port_and_proto.get('ListenerPort')
            info_dic = {
                'proto': proto,
                'port': port,
            }
            port_infos.append(info_dic)
        return port_infos

    def get_slb_tcp_attr(self, slb_id, port):
        request = DescribeLoadBalancerTCPListenerAttributeRequest.DescribeLoadBalancerTCPListenerAttributeRequest(
        )
        request.set_accept_format('json')
        request.set_LoadBalancerId(slb_id)
        request.set_ListenerPort(port)
        try:
            response = self.client.do_action_with_exception(request)
            response_dict = json.loads(response)
        except Exception as err:
            return False
        return response_dict

    def get_slb_http_attr(self, slb_id, port):
        request = DescribeLoadBalancerHTTPListenerAttributeRequest.DescribeLoadBalancerHTTPListenerAttributeRequest(
        )
        request.set_accept_format('json')
        request.set_LoadBalancerId(slb_id)
        request.set_ListenerPort(port)
        try:
            response = self.client.do_action_with_exception(request)
            response_dict = json.loads(response)
        except Exception as err:
            return False
        return response_dict

    def get_slb_https_attr(self, slb_id, port):
        request = DescribeLoadBalancerHTTPSListenerAttributeRequest.DescribeLoadBalancerHTTPSListenerAttributeRequest(
        )
        request.set_accept_format('json')
        request.set_LoadBalancerId(slb_id)
        request.set_ListenerPort(port)
        try:
            response = self.client.do_action_with_exception(request)
            response_dict = json.loads(response)
            return response_dict
        except Exception as err:
            return False

    def get_slb_port_attr(self, slb_id, port, proto):
        if proto == 'tcp':
            return self.get_slb_tcp_attr(slb_id, port)
        elif proto == 'http':
            return self.get_slb_http_attr(slb_id, port)
        elif proto == 'https':
            return self.get_slb_https_attr(slb_id, port)
        else:
            return False
Beispiel #10
0
class aliEcsSnapshot(object):
    def __init__(self, ali_key, ali_secret, region_id):
        self.ali_key = ali_key
        self.ali_secret = ali_secret
        self.client = AcsClient(
            self.ali_key,
            self.ali_secret,
        )
        self.region_id = region_id
        self.client.set_region_id(self.region_id)

    def get_instanceid(self, ip):
        request = DescribeInstancesRequest.DescribeInstancesRequest()
        request.set_InstanceNetworkType('classic')
        request.set_InnerIpAddresses(ip)
        response = self.client.do_action_with_exception(request)
        response_dic = json.loads(response)
        instance_id = response_dic.get('Instances').get('Instance')[0].get(
            'InstanceId')
        return instance_id

    def get_disk_ids(self, instance_id):
        request = DescribeDisksRequest.DescribeDisksRequest()
        request.set_InstanceId(instance_id)
        request.set_DiskType('all')
        request.set_Status('In_use')
        request.set_PageSize(20)
        response = self.client.do_action_with_exception(request)
        response_dic = json.loads(response)
        disks = response_dic.get('Disks').get('Disk')
        disk_ids = []
        for disk in disks:
            disk_ids.append(disk.get('DiskId'))
        return disk_ids

    def create_snapshot(self, disk_id, snap_name, tags, description):
        request = CreateSnapshotRequest.CreateSnapshotRequest()
        request.set_DiskId(disk_id)
        request.set_SnapshotName(snap_name)
        request.set_Tags(tags)
        request.set_Description(description)

        response = self.client.do_action_with_exception(request)
        response_dic = json.loads(response)
        return response_dic

    def find_snapshot(self, instance_id, disk_id_lst, page_size):
        request = DescribeSnapshotLinksRequest.DescribeSnapshotLinksRequest()
        request.set_InstanceId(instance_id)
        request.set_DiskIds(disk_id_lst)
        request.set_PageSize(page_size)
        pageNumber = 1
        request.set_PageNumber(pageNumber)

        response = self.client.do_action_with_exception(request)
        response_dict = json.loads(response)
        # 生成生成器
        while response_dict:
            yield response_dict
            pageNumber += 1
            request.set_PageNumber(pageNumber)
            response = self.client.do_action_with_exception(request)
            response_dict = json.loads(response)

    def delete_snapshot(self, snap_id):
        self.client.set_region_id(self.region_id)
        request = DeleteSnapshotRequest.DeleteSnapshotRequest()
        request.set_SnapshotId(snap_id)
        response = self.client.do_action_with_exception(request)
        response = json.loads(response)
        return response
Beispiel #11
0
class AliApiTools(object):
    def __init__(self, ali_key, ali_secret):
        self.ali_key = ali_key
        self.ali_secret = ali_secret
        self.client = AcsClient(
            self.ali_key,
            self.ali_secret,
        )

    def getAliyunEcsInfo(self, region_ids):
        """
        获取ecs实例信息,利用迭代器,可直接遍历函数得到ecs实例信息
        调用方法
        for a in get_aliyun_ecs(ali_key, ali_secret, region_ids):
           for ecs in a:
               print(ecs['InstanceId'], ecs['HostName'], ecs['ZoneId'], ecs['PublicIpAddress']['IpAddress'], ecs['InnerIpAddress']['IpAddress'], ecs['StartTime'])
        ecs instance各字段解释:https://help.aliyun.com/document_detail/25656.html?spm=a2c4g.11186623.2.2.a0TLxW#InstanceAttributesType
        """

        # 创建AcsClient实例
        for region_id in region_ids:

            self.client.set_region_id(region_id)

            # 设置初始页码
            pageNumber = 1

            # 创建request,并设置参数
            request = ecsDescribeInstancesRequest.DescribeInstancesRequest()
            request.set_accept_format('json')
            request.set_PageSize(10)
            request.set_PageNumber(pageNumber)
            response = self.client.do_action_with_exception(request)

            # 发起API请求并显示返回值
            response_dict = json.loads(response.decode('utf-8'))

            # 生成生成器
            while response_dict['Instances']['Instance']:
                yield response_dict['Instances']['Instance']
                pageNumber += 1
                request.set_PageNumber(pageNumber)
                response = self.client.do_action_with_exception(request)
                response_dict = json.loads(response.decode('utf-8'))

    def getAliyunRedisInfo(self, region_ids):
        for region_id in region_ids:

            self.client.set_region_id(region_id)
            # 设置初始页码
            pageNumber = 1

            # 创建request,并设置参数
            request = redisDescribeInstancesRequest.DescribeInstancesRequest()
            request.set_accept_format('json')
            request.set_PageSize(10)
            request.set_PageNumber(pageNumber)
            response = self.client.do_action_with_exception(request)

            # 发起API请求并显示返回值
            response_dict = json.loads(response.decode('utf-8'))

            # 生成生成器
            while response_dict['Instances']['KVStoreInstance']:
                yield response_dict['Instances']['KVStoreInstance']
                pageNumber += 1
                request.set_PageNumber(pageNumber)
                response = self.client.do_action_with_exception(request)
                response_dict = json.loads(response.decode('utf-8'))

    def get_ecs_overdue_sum(self, region):
        # 获取ecs实例即将过期个数(14天)
        overdue_ecs_sum = 0
        for ecs_instances_info in client.getAliyunEcsInfo([region]):
            for ecs_info in ecs_instances_info:
                expired_time_str = ecs_info['ExpiredTime']
                expired_date = int(
                    time.mktime(
                        time.strptime(expired_time_str, "%Y-%m-%dT%H:%MZ")))
                remain_time = expired_date - int(time.time())
                if remain_time < 691200:
                    overdue_ecs_sum += 1

        return overdue_ecs_sum

    def get_redis_overdue_sum(self, region):
        # 获取redis实例即将过期个数(14天)
        overdue_redis_sum = 0
        for redis_instances_info in client.getAliyunRedisInfo([region]):
            for redis_info in redis_instances_info:
                expired_time_str = redis_info['EndTime']
                expired_date = int(
                    time.mktime(
                        time.strptime(expired_time_str, "%Y-%m-%dT%H:%M:%SZ")))
                remain_time = expired_date - int(time.time())
                if remain_time < 691200:
                    overdue_redis_sum += 1

        return overdue_redis_sum

    @staticmethod
    def parse_args():
        # 解析参数
        parser = argparse.ArgumentParser(
            description="monitor overdue from aliyun")
        parser.add_argument(
            "-t",
            "--servertype",
            type=str,
            choices=["redis", "ecs"],
            required=True,
            help="阿里云服务类型",
        )
        parser.add_argument(
            "-r",
            "--region",
            type=str,
            required=True,
            help="阿里云服务或ecs所在可用区,例如region",
        )

        args = parser.parse_args()
        return args
Beispiel #12
0
class AliEcsTools(object):
    def __init__(self, ali_key, ali_secret, region_id):
        self.ali_key = ali_key
        self.ali_secret = ali_secret
        self.client = AcsClient(
            self.ali_key,
            self.ali_secret,
        )
        self.region_id = region_id
        self.client.set_region_id(self.region_id)

    def get_disks(self, instance_id):
        request = DescribeDisksRequest.DescribeDisksRequest()
        request.set_InstanceId(instance_id)
        request.set_DiskType('all')
        request.set_Status('In_use')
        request.set_PageSize(20)
        response = self.client.do_action_with_exception(request)
        response_dic = json.loads(response)
        disks_info = response_dic.get('Disks').get('Disk')
        disk_lst = []
        for disk in disks_info:
            disk_lst.append({'DiskId': disk.get('DiskId'), 'Device': disk.get('Device'), 'Type': disk.get('Type'), 'Size': disk.get('Size')})
        return disk_lst

    def find_last_snapshot(self, disk_id):
        request = DescribeSnapshotsRequest.DescribeSnapshotsRequest()
        request.set_DiskId(disk_id)
        request.set_Status("accomplished")
        request.set_PageSize(10)
        pageNumber = 1
        request.set_PageNumber(pageNumber)

        response = self.client.do_action_with_exception(request)
        response_dict = json.loads(response)
        # 生成生成器
        while response_dict.get('Snapshots').get('Snapshot'):
            yield response_dict.get('Snapshots').get('Snapshot')
            pageNumber += 1
            request.set_PageNumber(pageNumber)
            response = self.client.do_action_with_exception(request)
            response_dict = json.loads(response)

    def get_last_snap_id(self, disk_id):
        ts_cur = 0
        last_snap_id = None
        for snaps in self.find_last_snapshot(disk_id):
            for snap in snaps:
                snap_id = snap.get('SnapshotId')
                ts = int(time.mktime(time.strptime(snap.get('CreationTime'), '%Y-%m-%dT%H:%M:%SZ')))
                last_snap_id, ts_cur = (snap_id, ts) if ts > ts_cur else (last_snap_id, ts_cur)
        return last_snap_id

    def get_image(self, snap_id):
        # 拿到快照id,检查快照id状态
        request = DescribeImagesRequest.DescribeImagesRequest()
        request.set_Status('Available')
        request.set_ImageOwnerAlias('self')
        request.set_PageNumber(1)
        request.set_PageSize(10)
        # 检查快照是否已经生成镜像,如果已经生成,则返回已生成的
        request.set_SnapshotId(snap_id)
        response = self.client.do_action_with_exception(request)
        response_dict = json.loads(response)
        images = response_dict.get('Images').get('Image')
        # 判断是否返回中有image,如果有则返回,如果没有则创建。
        if images:
            return images[0].get('ImageId')
        # 没有,创建新的镜像,检查镜像状态,创建成功后,返回镜像id。
        else:
            image_id = self.create_image(snap_id)
            while True:
                check_result = self.check_image_status(image_id)
                if not check_result:
                    print('镜像不存在: {image_id}'.format(image_id=image_id))
                    exit(1)
                elif check_result != 'Available':
                    print("等待镜像状态为:Available")
                    time.sleep(3)
                elif check_result == 'Available':
                    break
                else:
                    print('check_image 检查结果异常:image_id'.format(image_id))
                    exit(1)
            return image_id

    def create_image(self, snap_id):
        # 拿到快照id,检查快照id状态
        request = CreateImageRequest.CreateImageRequest()
        request.set_accept_format('json')
        request.set_SnapshotId(snap_id)
        request.set_ImageName(
            "auto_expansion_{date_time}".format(date_time=time.strftime('%Y-%m-%d_%H:%M', time.localtime(time.time()))))
        response = self.client.do_action_with_exception(request)
        response_dict = json.loads(response)

        return response_dict.get('ImageId')

    def add_to_slb(self, svid, instance_ids, weight):
        request = AddVServerGroupBackendServersRequest.AddVServerGroupBackendServersRequest()
        request.set_VServerGroupId(svid)
        backend_servers = [{"ServerId": instance_id, "Port": "80", "Weight": weight, "Type": "ecs"} for instance_id in
                           instance_ids]
        request.set_BackendServers(backend_servers)
        response = self.client.do_action_with_exception(request)
        print(response)

    def get_instance_info(self, instancd_ids):
        pageNumber = 1
        request = DescribeInstancesRequest.DescribeInstancesRequest()
        request.set_InstanceIds(instancd_ids)
        request.set_accept_format('json')
        request.set_PageSize(10)
        request.set_PageNumber(pageNumber)

        # 发起API请求并显示返回值
        response = self.client.do_action_with_exception(request)
        response_dict = json.loads(response)

        # 生成生成器
        while response_dict['Instances']['Instance']:
            yield response_dict['Instances']['Instance']
            pageNumber += 1
            request.set_PageNumber(pageNumber)
            response = self.client.do_action_with_exception(request)
            response_dict = json.loads(response)

    def join_security_group(self, instance_id, security_group_id):
        request = JoinSecurityGroupRequest.JoinSecurityGroupRequest()
        request.set_accept_format('json')
        request.set_InstanceId(instance_id)
        request.set_SecurityGroupId(security_group_id)
        response = self.client.do_action_with_exception(request)
        response_dict = json.loads(response)
        return response_dict

    def check_image_status(self, image_id):
        request = DescribeImagesRequest.DescribeImagesRequest()
        request.set_accept_format('json')
        request.set_ImageId(image_id)
        request.set_ImageOwnerAlias('self')
        request.set_PageNumber(1)
        request.set_PageSize(10)
        response = self.client.do_action_with_exception(request)
        response_dict = json.loads(response)
        image = response_dict.get('Images').get('Image')[0]
        if image:
            status = image.get('Status')
            return status
        else:
            return False