如何通过AWS Lambda函数从本地批量上传文件至AWS S3存储桶并设置自动触发?
通过AWS Lambda实现本地文件上传S3+自动调度方案
一、核心前提说明
Lambda运行在AWS云端服务器上,无法直接访问你本地局域网的文件——这是很多示例没生效的核心原因。得先让Lambda能获取到文件,再谈上传和调度。
二、两种可行上传方案
方案1:本地主动推送给Lambda(适合小文件≤6MB)
通过API Gateway中转实现小文件上传:
- 在AWS控制台创建API Gateway,添加POST方法并关联Lambda函数
- Lambda代码(Python):
import boto3 import json s3_client = boto3.client('s3') TARGET_BUCKET = "你的目标S3桶名" def lambda_handler(event, context): # 从API请求中提取文件名和内容 file_name = event['queryStringParameters']['filename'] # 二进制文件需改用base64解码,此处以文本文件为例 file_content = event['body'].encode('utf-8') # 上传至目标S3桶 s3_client.put_object( Bucket=TARGET_BUCKET, Key=file_name, Body=file_content ) return {"statusCode": 200, "body": json.dumps("上传成功")}
- 本地脚本(Python)示例:
import requests import os API_ENDPOINT = "你的API Gateway地址" LOCAL_FILE_PATH = "/home/user/local-data.txt" if os.path.exists(LOCAL_FILE_PATH): with open(LOCAL_FILE_PATH, "r") as f: file_data = f.read() # 发送上传请求 resp = requests.post( API_ENDPOINT, params={"filename": "cloud-copy.txt"}, data=file_data ) print(resp.text)
方案2:临时S3桶中转(适合大文件)
大文件避免用API Gateway,先传临时桶再让Lambda同步到目标桶:
- 创建临时S3桶,本地用AWS CLI上传文件:
# 本地终端执行,需提前配置AWS凭证 aws s3 cp /path/to/local/file s3://你的临时桶名/
- 给Lambda添加S3触发器:选择临时桶,触发事件选
s3:ObjectCreated:* - Lambda代码(Python):
import boto3 s3_client = boto3.client('s3') TARGET_BUCKET = "你的目标S3桶名" def lambda_handler(event, context): # 获取临时桶的文件信息 source_bucket = event['Records'][0]['s3']['bucket']['name'] source_file_key = event['Records'][0]['s3']['object']['key'] # 复制文件到目标桶 s3_client.copy_object( Bucket=TARGET_BUCKET, Key=source_file_key, CopySource={"Bucket": source_bucket, "Key": source_file_key} ) # 可选:复制完成后删除临时桶内的文件 s3_client.delete_object(Bucket=source_bucket, Key=source_file_key) return "文件同步完成"
三、自动调度设置
场景1:本地机器持续运行——用系统定时任务
- Windows:创建任务计划程序,定时执行上传脚本
- Linux/macOS:编辑crontab添加定时任务:
# 每天凌晨1点执行上传脚本 0 1 * * * python3 /home/user/upload-script.py
场景2:Lambda主动拉取——本地文件需公网可访问
若本地能搭建HTTP/FTP服务暴露文件到公网,用EventBridge给Lambda加定时触发器:
- 在EventBridge控制台创建规则,选择按计划安排,设置调度表达式(如
cron(0 0 * * ? *)每天凌晨执行) - Lambda代码(Python,拉取HTTP文件):
import boto3 import requests s3_client = boto3.client('s3') TARGET_BUCKET = "你的目标S3桶名" LOCAL_FILE_PUBLIC_URL = "http://你的公网IP:8000/local-file.csv" def lambda_handler(event, context): # 拉取本地公网文件 resp = requests.get(LOCAL_FILE_PUBLIC_URL) resp.raise_for_status() # 上传至S3 s3_client.put_object( Bucket=TARGET_BUCKET, Key="daily-local-data.csv", Body=resp.content ) return "拉取并上传成功"
四、常见失效原因排查
- IAM权限不足:Lambda角色必须具备S3的
PutObject/GetObject权限,触发器(EventBridge/S3)需有权限调用Lambda - 网络不通:Lambda若在VPC内,需配置NAT网关才能访问公网;本地HTTP服务要开放端口、关闭防火墙
- 参数错误:S3桶名拼写错误、触发器事件类型选错(如选了删除事件而非创建事件)
- 文件编码问题:二进制文件用文本方式传输会损坏,需改用base64或直接传输二进制流
内容的提问来源于stack exchange,提问作者Muhammad Yahya
相关产品推荐
相关产品推荐

