AWS替代Cron的方案:定时运行Python脚本更新S3托管站点
AWS定时更新S3天气站点数据的方案与步骤
首选方案:Lambda + EventBridge
这是AWS生态里适配轻量定时任务的最优组合,无需管理服务器,按实际调用量计费,完全匹配你的爬虫更新需求。
步骤1:适配Lambda的Python爬虫代码
把你的本地爬虫脚本改成Lambda兼容格式:
- 必须包含
lambda_handler(event, context)作为入口函数 - 替换本地文件写入逻辑为AWS SDK(boto3)的S3上传代码
- 核心代码示例:
import boto3 import requests s3_client = boto3.client('s3') TARGET_BUCKET = '你的S3桶名称' def lambda_handler(event, context): # 爬虫逻辑:获取天气数据 raw_weather_data = requests.get('目标天气数据源URL').content # 上传到S3的data目录 s3_client.put_object( Bucket=TARGET_BUCKET, Key='data/weather_update.json', # 替换为你的实际文件名 Body=raw_weather_data ) return {'statusCode': 200, 'body': '数据更新完成'} - 若脚本依赖第三方库(如非标准库),需打包成Lambda层或直接包含在部署压缩包中。
步骤2:创建Lambda函数
- 登录AWS控制台,进入Lambda服务页面
- 点击「创建函数」,选择「从头开始创作」
- 填写函数名称,运行时选与脚本兼容的Python版本
- 权限选择「创建新角色,带有基本Lambda权限」,后续需给该角色补充S3写入权限
- 点击「创建函数」,在「代码」标签页粘贴调整后的爬虫代码
步骤3:配置Lambda角色的S3权限
- 进入Lambda函数的「配置」标签页,点击「权限」模块下的执行角色链接
- 在IAM控制台中,给该角色添加内联策略,示例JSON:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::你的S3桶名称/data/*" } ] } - 保存策略,确保Lambda具备写入S3 data目录的权限
步骤4:用EventBridge设置定时触发
- 在Lambda函数的「配置」标签页,点击「触发器」→「添加触发器」
- 触发器类型选「EventBridge(CloudWatch Events)」
- 选择「创建新规则」,填写规则名称
- 规则类型选「计划表达式」,比如每3小时运行的表达式为
cron(0 */3 * * ? *)(AWS cron格式:分 时 日 月 周 年) - 点击「添加」完成配置
其他可选方案
方案2:EC2实例+crontab
若你的爬虫依赖复杂环境、Lambda打包困难,可选择EC2:
- 启动一台EC2实例,安装Python及所需依赖
- 上传爬虫脚本,调整为直接用boto3写入S3,或先存本地再用
s3 sync命令同步 - 执行
crontab -e添加定时任务,示例:0 */3 * * * python3 /home/ec2-user/your_script.py - 注意:给EC2实例的IAM角色添加S3权限,或配置本地AWS凭证
方案3:AWS Batch(重负载场景)
若爬虫需大量计算、运行时间超过15分钟(Lambda最大超时),可使用Batch:
- 创建Job Definition,定义运行爬虫的容器或脚本环境
- 用EventBridge定时触发Batch Job
- 适合数据量大、执行时间长的爬虫任务
测试与验证
- 手动触发Lambda函数,查看「监控」标签页的CloudWatch日志,确认数据是否成功上传至S3
- 等待定时任务触发时间,检查S3的data目录是否生成新文件
- 若遇权限问题,优先排查IAM角色的权限范围是否正确
内容的提问来源于stack exchange,提问作者Dani J
相关产品推荐
相关产品推荐

