求助:向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
相关产品推荐
相关产品推荐

