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

求助:向S3存储桶上传新对象时用Lambda生成预签名URL的脚本

通过Lambda生成S3预签名URL用于对象上传

以下是Python版本的Lambda实现脚本,可生成用于向S3存储桶上传对象的预签名URL(支持PUT请求方式):

import boto3
from botocore.exceptions import ClientError

def lambda_handler(event, context):
    # 核心配置参数
    s3_bucket = 'your-target-bucket-name'  # 替换为你的S3桶名称
    object_key = event.get('object_key', 'default-upload-file.txt')  # 可从事件传入自定义对象键,或设置默认值
    expiration = 3600  # 预签名URL有效期(单位:秒,此处设为1小时)

    s3_client = boto3.client('s3')

    try:
        # 生成PUT请求的预签名URL
        presigned_url = s3_client.generate_presigned_url(
            'put_object',
            Params={'Bucket': s3_bucket, 'Key': object_key},
            ExpiresIn=expiration
        )
        return {
            'statusCode': 200,
            'body': {
                'presigned_url': presigned_url,
                'object_key': object_key,
                'expiration_seconds': expiration
            }
        }
    except ClientError as e:
        return {
            'statusCode': 500,
            'body': f'生成预签名URL失败: {str(e)}'
        }

关键配置说明

  • IAM权限配置:Lambda的执行角色必须附加包含s3:PutObject权限的策略,示例策略如下:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "s3:PutObject",
                "Resource": "arn:aws:s3:::your-target-bucket-name/*"
            }
        ]
    }
    
  • 触发方式:可通过API Gateway触发该Lambda,前端调用API获取预签名URL后,直接通过PUT请求向该URL上传对象;也可根据业务需求,通过S3事件、CloudWatch事件等触发。
  • 对象键防重:若需避免覆盖已有对象,可在生成object_key时加入唯一标识(如UUID、时间戳),示例:
    import uuid
    object_key = f'uploads/{str(uuid.uuid4())}_{event.get("filename", "unknown-file")}'
    
  • 表单上传支持:如果需要支持POST表单上传,可改用generate_presigned_post方法,示例:
    post_response = s3_client.generate_presigned_post(
        s3_bucket,
        object_key,
        ExpiresIn=expiration
    )
    return {
        'statusCode': 200,
        'body': post_response
    }
    

注意事项

  • 预签名URL的有效期不宜过长,防止被滥用。
  • 若Lambda部署在VPC内,需确保VPC可访问S3(可配置S3 VPC端点)。
  • 如需设置对象ACL、存储类别等参数,可在Params中添加对应字段,比如ACL: 'private'、StorageClass: 'STANDARD_IA'。

内容的提问来源于stack exchange,提问作者19sax96

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 14:05:24