使用Boto3调用AWS DRS start_recovery未返回recoveryInstanceID问题
AWS DRS start_recovery 响应缺失 recoveryInstanceID 的原因与解决方法
可能原因
- 异步操作特性:
start_recovery是异步接口,启动恢复演练属于后台执行任务。接口返回时,AWS 可能还未完成恢复实例的创建流程,因此不会立即返回recoveryInstanceID。这是 DRS 服务的正常设计,而非接口调用错误。 - Boto3 版本兼容问题:较旧版本的 Boto3 SDK 可能未正确映射 DRS 服务的最新响应字段,导致无法解析出
recoveryInstanceID。 - 源服务器状态异常:如果目标源服务器未处于
READY_FOR_RECOVERY状态,恢复演练可能未正常触发,自然不会生成对应的恢复实例 ID。
解决方法
1. 异步轮询查询恢复实例
由于接口是异步的,需要通过 describe_recovery_instances 接口轮询获取结果,示例代码如下:
import boto3 import time drs_client = boto3.client('drs') source_server_id = 's-32fe7############' # 启动恢复演练 drs_client.start_recovery( isDrill=True, sourceServers=[{'sourceServerID': source_server_id}] ) # 轮询获取 recoveryInstanceID recovery_instance_id = None max_retries = 10 wait_interval = 30 # 每次间隔30秒查询 for attempt in range(max_retries): response = drs_client.describe_recovery_instances( filters={'sourceServerIDs': [source_server_id]} ) instances = response.get('recoveryInstances', []) if instances: recovery_instance_id = instances[0]['recoveryInstanceID'] break time.sleep(wait_interval) print(f"Recovery Instance ID: {recovery_instance_id}" if recovery_instance_id else "Timeout: Failed to get recovery instance ID")
2. 检查源服务器状态
先验证源服务器是否符合恢复演练要求:
response = drs_client.describe_source_servers( filters={'sourceServerIDs': [source_server_id]} ) source_server = response['sourceServers'][0] print(f"Source Server Status: {source_server['recoveryStatus']}")
只有当 recoveryStatus 为 READY_FOR_RECOVERY 时,才能正常启动恢复演练。
3. 更新 Boto3 SDK
执行命令升级到最新版本的 Boto3,确保 SDK 能正确解析 DRS 服务的响应字段:
pip install --upgrade boto3
内容的提问来源于stack exchange,提问作者Zaid Mughal
相关产品推荐
相关产品推荐

