如何用Python编写的AWS Lambda函数实现S3文件夹移动/重命名?
用Python编写AWS Lambda函数重命名S3“文件夹”
核心原理
S3本身不存在实际的文件夹结构,所谓的“文件夹”只是对象Key中的前缀。因此重命名文件夹本质是:
- 遍历所有Key前缀为原文件夹路径的对象
- 将每个对象复制到新的前缀路径下
- 删除原对象
Lambda函数代码示例
import boto3 s3 = boto3.client('s3') def lambda_handler(event, context): # 配置参数 source_bucket = 'your-bucket-name' old_prefix = 'folder/' new_prefix = 'renamedfolder/' # 分页列出所有原前缀下的对象 paginator = s3.get_paginator('list_objects_v2') page_iterator = paginator.paginate(Bucket=source_bucket, Prefix=old_prefix) for page in page_iterator: if 'Contents' not in page: continue for obj in page['Contents']: old_key = obj['Key'] # 跳过S3控制台创建的空文件夹标记(零大小对象) if old_key == old_prefix: continue # 生成新对象Key:替换前缀 new_key = old_key.replace(old_prefix, new_prefix, 1) # 复制对象到新路径 copy_source = {'Bucket': source_bucket, 'Key': old_key} s3.copy_object( Bucket=source_bucket, Key=new_key, CopySource=copy_source ) # 删除原对象 s3.delete_object(Bucket=source_bucket, Key=old_key) return { 'statusCode': 200, 'body': f"已成功将S3前缀 '{old_prefix}' 重命名为 '{new_prefix}'" }
关键注意事项
- 权限配置:Lambda执行角色需拥有
s3:ListBucket、s3:GetObject、s3:PutObject、s3:DeleteObject权限 - 大数量对象处理:当文件夹下对象超过1000个时,必须使用分页器
paginator遍历所有对象,避免单次请求数量限制 - 空文件夹处理:代码默认跳过S3控制台创建的空文件夹标记(Key为
folder/的零大小对象),可根据需求添加删除逻辑 - 跨桶移动:若需跨桶移动,只需修改
copy_source中的Bucket为目标桶,并确保角色拥有跨桶操作权限
内容的提问来源于stack exchange,提问作者shspencer
相关产品推荐
相关产品推荐

