AWS Transfer Family:Lambda中boto3 v1.35.92不识别start_remote_delete
问题解决:AttributeError: 'Transfer' object has no attribute 'start_remote_delete'
原因分析
你遇到的错误是因为当前Lambda环境中使用的boto3版本(1.35.92)对应的Transfer Family客户端没有封装start_remote_delete方法。AWS新API方法需要对应的SDK更新才能支持,即使官方文档已标注支持,SDK的适配可能存在延迟,或者Lambda默认环境的依赖版本未同步更新。
解决方案
1. 验证并升级依赖版本
Lambda默认运行时环境自带的boto3/botocore版本可能落后于你预期的版本。先在Lambda中打印当前依赖版本确认:
import boto3 import botocore print(f"boto3 version: {boto3.__version__}") print(f"botocore version: {botocore.__version__}")
如果版本确实低于支持start_remote_delete的要求,可通过以下方式升级:
- 创建包含最新boto3和botocore的Lambda层,附加到你的函数上;
- 或在部署包中直接打包最新版依赖(注意避免与Lambda运行时自带依赖冲突)。
2. 用invoke_operation直接调用API(无需升级SDK)
如果暂时无法升级依赖,可使用Transfer客户端的invoke_operation方法直接调用该API,绕过客户端方法封装的限制:
# 替换原有的start_remote_delete调用 delete_response = transfer.invoke_operation( Operation='StartRemoteDelete', ConnectorId=connector_id, Parameters={ 'RemoteFilePaths': retrieve_paths } ) print(f"Delete started: {delete_response['RemoteDeleteId']}")
3. 等待传输完成再执行删除
当前代码在启动传输后立即触发删除,可能导致文件未完成传输就被删除。建议先轮询传输状态,确认完成后再执行删除:
import time # 启动传输后添加状态轮询逻辑 while True: transfer_status = transfer.describe_file_transfer(TransferId=transfer_id) status = transfer_status['FileTransferStatus'] if status in ['COMPLETED', 'FAILED']: break time.sleep(5) # 每5秒轮询一次 if status == 'COMPLETED': # 执行删除操作 delete_response = transfer.invoke_operation( Operation='StartRemoteDelete', ConnectorId=connector_id, Parameters={'RemoteFilePaths': retrieve_paths} ) print(f"Delete started: {delete_response['RemoteDeleteId']}") else: print(f"Transfer failed with status: {status}")
4. 确认API支持的资源类型
确保你的Transfer Connector类型(SFTP)确实支持start_remote_delete操作,核对AWS官方文档中该API的适用场景与限制。
内容的提问来源于stack exchange,提问作者Sahith Thatipalli
相关产品推荐
相关产品推荐

