48 lines
2.0 KiB
Python
48 lines
2.0 KiB
Python
|
|
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}")
|