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

如何通过AWS Lambda函数从本地批量上传文件至AWS S3存储桶并设置自动触发?

通过AWS Lambda实现本地文件上传S3+自动调度方案

一、核心前提说明

Lambda运行在AWS云端服务器上,无法直接访问你本地局域网的文件——这是很多示例没生效的核心原因。得先让Lambda能获取到文件,再谈上传和调度。

二、两种可行上传方案

方案1:本地主动推送给Lambda(适合小文件≤6MB)

通过API Gateway中转实现小文件上传:

  1. 在AWS控制台创建API Gateway,添加POST方法并关联Lambda函数
  2. 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("上传成功")}
  1. 本地脚本(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同步到目标桶:

  1. 创建临时S3桶,本地用AWS CLI上传文件:
# 本地终端执行,需提前配置AWS凭证
aws s3 cp /path/to/local/file s3://你的临时桶名/
  1. 给Lambda添加S3触发器:选择临时桶,触发事件选s3:ObjectCreated:*
  2. 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加定时触发器:

  1. 在EventBridge控制台创建规则,选择按计划安排,设置调度表达式(如cron(0 0 * * ? *)每天凌晨执行)
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 03:53:21