如何实现MongoDB数据自动导出至S3并生成预签名URL发送给利益相关方
MongoDB自动导出、上传S3并推送预签名URL全自动化方案
完全可以实现全流程无人值守自动执行,所有人工操作都可以用脚本+定时任务替代,具体实现方案如下:
前置准备
- 部署运行脚本的机器(可以是你现有业务服务器、云函数实例),提前安装
mongoexport(MongoDB官方导出工具)、aws cli(用于操作S3、生成预签名URL)、邮件/IM推送工具(根据你通知客户的渠道选择) - 提前配置好ssh免密登录权限、MongoDB只读账号权限、AWS IAM账号权限(仅开通S3上传、生成预签名URL的最小权限),所有敏感信息(数据库连接串、AK/SK等)存在运行环境的环境变量中,禁止硬编码在脚本里
核心脚本实现
你可以根据技术栈选Shell或者Python写执行脚本,以下是Shell版本的核心逻辑,不用先导出JSON再转CSV,mongoexport本身支持直接输出CSV格式:
# 从环境变量读取配置信息 MONGO_CONN_STR=$MONGO_CONN_STR EXPORT_COLL="你的业务集合名" EXPORT_FIELDS="字段1,字段2,字段3" # 你需要导出的指定字段 EXPORT_TMP_PATH="./tmp_weekly_data.csv" S3_BUCKET="你的S3桶名" S3_FILE_KEY="weekly_export/$(date +%Y%m%d)_客户更新数据.csv" PRESIGN_EXPIRE_SEC=604800 # 预签名URL有效期设为7天,单位为秒 CUSTOMER_CONTACT="客户邮箱/其他通知账号" # 可选:如果需要走SSH隧道连接MongoDB,执行以下命令建立临时隧道 # ssh -fN -L 27017:localhost:27017 你的服务器登录账号@服务器公网IP # SSH_TUNNEL_PID=$! # 1. 导出最近7天更新的指定字段数据为CSV mongoexport --uri="$MONGO_CONN_STR" \ --collection="$EXPORT_COLL" \ --fields="$EXPORT_FIELDS" \ --type=csv \ --query='{"update_time": {"$gte": {"$date": "'$(date -d "7 days ago" +%Y-%m-%dT00:00:00Z)'"}}}' \ --out="$EXPORT_TMP_PATH" # 2. 上传文件到S3 aws s3 cp "$EXPORT_TMP_PATH" "s3://$S3_BUCKET/$S3_FILE_KEY" # 3. 生成带过期时间的预签名URL PRESIGN_URL=$(aws s3 presign "s3://$S3_BUCKET/$S3_FILE_KEY" --expires-in $PRESIGN_EXPIRE_SEC) # 4. 发送链接给客户,以下是发邮件的示例,可替换为企业微信/ Slack等其他通知渠道 echo "您好,本周数据库更新数据的下载链接为:$PRESIGN_URL,链接7天内有效,请及时下载。" | mail -s "【每周数据更新】$(date +%Y年%m月%d日)数据导出" $CUSTOMER_CONTACT # 清理资源 rm -f "$EXPORT_TMP_PATH" # 可选:如果开了SSH隧道,执行以下命令关闭 # kill $SSH_TUNNEL_PID
定时触发配置
脚本测试正常后,配置定时任务每周自动执行即可:
- 如果用Linux服务器部署,直接用
crontab配置,比如每周一上午9点执行脚本,日志存在本地,配置如下:0 9 * * 1 /path/to/你的脚本路径.sh >> /var/log/mongo_weekly_export.log 2>&1 - 也可以用你现有的CI/CD工具定时任务、或者云函数服务触发,不需要长期占用服务器资源。
可选优化项
- 增加错误告警逻辑:如果导出、上传任意步骤失败,先给运维人员发告警通知,不要给客户发送错误信息
- 导出后可以对CSV文件做加密压缩,压缩密码单独告知客户,避免数据泄露
- 大文件场景下可以对文件做分片压缩后再上传,提高传输稳定性
内容的提问来源于stack exchange,提问作者Habanero
相关产品推荐
相关产品推荐

