如何查看AWS Transfer Family SFTP连接器的进行中文件传输?
关于AWS Transfer Family SFTP连接器进行中传输的状态查询方案
问题背景
我配置了AWS Lambda函数,每隔X分钟调用AWS Transfer Family SFTP连接器的start_file_transfer接口拉取文件。但Lambda重复运行时,若前一次文件下载尚未完成,会触发文件锁定错误。需要实现:Lambda运行时先检查当前是否有对应文件的进行中下载,存在则跳过本次调用。
现有调用与响应示例
start_file_transfer调用代码
transfer.start_file_transfer( ConnectorId="[my-connector-id]", RetrieveFilePaths=[sftp_file], LocalDirectoryPath="/[my-s3-bucket]/[my-s3-key]" )
接口返回响应
{ "TransferId": "3296exe9-21fy-063r-a97n-2c91e6u3ab81", "ResponseMetadata": { "RequestId": "l5au1f5e-v59u-763w-h7gr-9461y268135o", "HTTPStatusCode": 200, "HTTPHeaders": { "date": "Wed, 30 Aug 2023 15:30:30 GMT", "content-type": "application/x-amz-json-1.1", "content-length": "6429", "connection": "keep-alive", "x-amzn-requestid": "l5au1f5e-v59u-763w-h7gr-9461y268135o" }, "RetryAttempts": 0 } }
传输完成后的CloudWatch日志
{ "operation": "RETRIEVE", "timestamp": "2023-08-30T16:30:33.227572Z", "connector-id": "[my-connector-id]", "transfer-id": "3296exe9-21fy-063r-a97n-2c91e6u3ab81", "file-transfer-id": "3296exe9-21fy-063r-a97n-2c91e6u3ab81/F6drt7oppd2+87YuTREWWW", "url": "sftp://sftp.example.com", "file-path": "my_path/file.txt", "status-code": "COMPLETED", "start-time": "2023-08-30T16:30:32.102939Z", "end-time": "2023-08-30T16:30:32.886031Z", "account-id": "999999999999", "connector-arn": "arn:aws:transfer:[my-region]:999999999999:connector/[my-connector-id]", "local-directory-path": "/[my-s3-bucket]/[my-s3-key]" }
原生状态查询能力说明
目前AWS Transfer Family的SFTP连接器没有原生API可以直接查询进行中的传输状态。接口返回的TransferId仅用于关联CloudWatch日志,无法通过API主动查询该传输的实时运行状态。
自建状态管理方案(推荐实现)
通过DynamoDB维护传输状态,结合CloudWatch日志监听实现状态更新,具体步骤:
状态记录初始化
Lambda调用start_file_transfer成功后,将以下信息写入DynamoDB表:TransferId(主键)FilePath:拉取的SFTP文件路径Status:设置为IN_PROGRESSCreatedAt:当前时间戳ConnectorId:连接器ID
状态自动更新
配置CloudWatch日志订阅过滤器,监听包含status-code字段的Transfer Family日志:- 当捕获到
status-code为COMPLETED或FAILED的日志时,触发另一个Lambda函数 - 该Lambda根据日志中的
transfer-id,更新DynamoDB中对应记录的Status为COMPLETED或FAILED
- 当捕获到
运行前状态检查
每次定时Lambda触发时,先查询DynamoDB:- 根据要拉取的
FilePath,检查是否存在Status为IN_PROGRESS的未过期记录 - 若存在则跳过本次拉取;若不存在则执行
start_file_transfer并写入初始状态
- 根据要拉取的
额外优化
- 为DynamoDB表设置TTL(生存时间),自动清理超过一定时长的状态记录(比如24小时),避免数据堆积
- 若同一文件可能被多次触发,可将
FilePath作为主键或全局二级索引,简化查询逻辑
内容的提问来源于stack exchange,提问作者gbeaven
相关产品推荐
相关产品推荐

