You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否使用Lambda实现网站CSV文件下载并直接上传至Amazon S3?

无服务器化实现CSV自动下载上传S3的方案可行性与优化建议

方案可行性确认

你提出的需求完全可落地,500MB的文件大小完全在AWS无服务器服务的支持范围内,不需要保留EC2实例。

基础实现方案

核心基于EventBridge + Lambda + S3的组合即可实现全流程无服务器化:

  • 用EventBridge Scheduler配置每日定时触发规则,匹配目标网站CSV的更新频率
  • Lambda运行环境选择Python,不需要调用pandas.read_csv处理文件,直接用内置的urllib3或者第三方requests库流式下载目标CSV,直接上传到S3,不需要落地本地存储,也不会占用过多内存
  • 上传到S3后可以配置S3事件通知,自动触发后续的清洗、检索处理逻辑,完成全链路无服务器化改造

核心注意点

  • Lambda超时时间需要调整到10~15分钟(Lambda最大支持15分钟超时),预留足够的下载上传时间
  • Lambda内存建议设置为1GB及以上,更高的内存配额对应更高的CPU和网络带宽配额,大文件传输速度更快
  • 不需要占用/tmp临时存储,直接通过流式传输的方式把下载流写入S3,核心代码参考如下:
import boto3
import urllib3

s3 = boto3.client('s3')
http = urllib3.PoolManager()
SOURCE_URL = 'https://sam.gov/api/prod/fileextractservices/v1/api/download/Contract%20Opportunities/datagov/ContractOpportunitiesFullCSV.csv?privacy=Public'
BUCKET_NAME = '替换为你的S3桶名'
S3_KEY = 'raw/ContractOpportunitiesFullCSV.csv'

def lambda_handler(event, context):
    response = http.request('GET', SOURCE_URL, preload_content=False)
    s3.upload_fileobj(response, BUCKET_NAME, S3_KEY)
    return {'status': 'success'}

更优化的实现方案

如果需要更高的稳定性,建议加入Step Functions编排全流程:

  • 流程第一步触发下载Lambda,配置最多3次失败重试,应对偶发的网络波动问题
  • 下载完成后新增校验步骤,比对下载文件的大小、哈希值和源站返回的文件元数据,避免下载到不完整的坏文件
  • 校验通过后再触发后续清洗、检索逻辑,校验失败则发送SNS告警通知人工处理
  • 历史的CSV文件可以配置S3生命周期规则,超过30天的自动归档到Glacier存储层,降低存储成本

避坑提醒

  • 每次触发下载前可以先请求源站的文件头信息,比对文件最后更新时间,如果和已存储在S3的最新版本一致,不需要重复下载,浪费资源
  • 大文件下载可以加入断点续传逻辑,传输中断后不需要重新下载整个文件,从断点位置继续传输即可

内容的提问来源于stack exchange,提问作者Cristian Murra Chavez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:30:05