import os import time from aliyunsdkecs.request.v20140526.JoinResourceGroupRequest import JoinResourceGroupRequest from aliyunsdkcore.client import AcsClient from utils.logger import log_action def transfer_instance_to_group(instance_id: str, resource_group_id: str, region_id: str, access_key: str, secret_key: str): try: print(f"🚀 开始绑定实例 {instance_id} 到资源组 {resource_group_id},区域:{region_id}") # 设置 SDK 超时时间(毫秒) os.environ["ALIBABA_CLOUD_SDK_CONNECTION_TIMEOUT"] = "15000" os.environ["ALIBABA_CLOUD_SDK_READ_TIMEOUT"] = "15000" # 创建客户端 print("🔑 初始化 AcsClient 中...") client = AcsClient(access_key, secret_key, region_id) for i in range(15): try: print(f"🔁 第 {i+1}/15 次尝试转移实例至资源组...") req = JoinResourceGroupRequest() req.set_ResourceId(instance_id) req.set_ResourceType("instance") req.set_ResourceGroupId(resource_group_id) result = client.do_action_with_exception(req) log_action(f"✅ 实例 {instance_id} 成功转移到资源组 {resource_group_id}") print(f"✅ 成功转移实例 {instance_id} 至资源组 {resource_group_id}") return except Exception as e: print(f"⚠️ 第 {i+1} 次尝试失败,错误:{e}") if "InvalidResourceGroup.NotFound" in str(e) or "timeout" in str(e): print("⏳ 资源组可能未同步或超时,等待 3 秒后重试...") time.sleep(3) else: import traceback traceback.print_exc() raise raise RuntimeError(f"❌ ECS 中资源组未同步成功: {resource_group_id}") except Exception as e: import traceback traceback.print_exc() raise RuntimeError(f"❌ 资源组转移失败: {e}")