如何通过AWS服务将S3中新上传的文件推送至FTP/SFTP服务器?
用AWS内部服务实现S3文件自动推送至FTP的方案
完全可以通过AWS内部服务实现这个需求,核心思路是用S3事件触发Lambda执行FTP上传,以下是具体实现方案:
核心组件与流程
- S3事件通知:作为触发源,当符合路径格式的新文件上传到S3时,自动触发后续操作
- AWS Lambda:负责完成从S3读取文件、上传至FTP服务器的核心逻辑
- (可选)AWS EventBridge:作为兜底机制,定时扫描补传遗漏的文件
1. 配置S3事件通知
针对你的路径模式s3-bucket/some_path/yyyymm/yyyymmdd/file_yyymmdd.csv.gz,在S3控制台的目标存储桶中配置事件通知:
- 设置触发条件为「对象创建(全部)」
- 配置对象键过滤规则:前缀填
some_path/,后缀填.csv.gz,或者用更精准的过滤表达式匹配日期格式(比如some_path/[0-9]{6}/[0-9]{8}/file_[0-9]{8}\.csv\.gz) - 选择触发目标为「Lambda函数」,关联你后续创建的Lambda函数
2. 编写Lambda上传逻辑
在Lambda中编写代码实现FTP上传,以Python为例:
- 用
boto3库读取S3中的目标文件内容 - 用
ftplib(普通FTP)或paramiko(SFTP)库连接FTP服务器并上传文件 - 敏感信息(FTP地址、端口、账号密码)不要硬编码,建议存在AWS Secrets Manager中,Lambda通过IAM权限读取该密钥
注意事项:
- 给Lambda配置正确的IAM权限:允许读取触发事件对应的S3对象,允许访问Secrets Manager(如果使用),以及网络访问权限(如果FTP在公网,Lambda需配置公网访问;如果是内网,要将Lambda部署到VPC私有子网并配置NAT网关)
- 根据文件大小调整Lambda的超时时间(最大15分钟),大文件建议采用分块上传逻辑
- 添加异常捕获和日志记录,利用CloudWatch Logs排查上传失败问题
3. 可选:EventBridge定时补传
如果担心S3事件触发遗漏,可以配置EventBridge定时任务(比如每日凌晨执行):
- 任务触发Lambda函数,扫描S3中指定日期路径下的文件
- 检查该文件是否已成功上传至FTP(可通过记录上传状态到DynamoDB或FTP服务器文件列表判断)
- 对未上传的文件执行补传操作
内容的提问来源于stack exchange,提问作者c0ng111
相关产品推荐
相关产品推荐

