使用Python Lambda将S3解压文件夹内容复制至另一S3根目录
实现S3解压文件夹内容跨桶复制的Lambda方案
核心思路
通过Lambda函数遍历源桶解压目录下的所有对象(包含子文件夹),将每个对象复制到目标桶,同时保留原有的相对目录结构。
具体实现步骤
1. 配置Lambda IAM权限
确保Lambda角色拥有以下S3权限:
- 源桶的
ListBucket和GetObject权限(用于遍历和读取文件) - 目标桶的
PutObject权限(用于写入复制的文件)
示例IAM策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject", "s3:ListBucket"], "Resource": [ "arn:aws:s3:::src_bucket", "arn:aws:s3:::src_bucket/extract/*" ] }, { "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::dest_bucket/*" } ] }
2. Lambda代码实现(Python)
使用boto3的分页器处理大量文件,避免单次请求超时,同时保持目录结构:
import boto3 s3 = boto3.client('s3') def lambda_handler(event, context): # 替换为实际的源桶、目标桶和解压目录前缀 src_bucket = 'src_bucket' dest_bucket = 'dest_bucket' src_prefix = 'extract/' # 分页遍历源前缀下的所有对象 paginator = s3.get_paginator('list_objects_v2') page_iterator = paginator.paginate(Bucket=src_bucket, Prefix=src_prefix) for page in page_iterator: if 'Contents' not in page: continue for obj in page['Contents']: src_key = obj['Key'] # 跳过目录前缀本身(若存在) if src_key == src_prefix: continue # 构造目标键:移除源前缀,保留相对路径 dest_key = src_key[len(src_prefix):] # 执行跨桶复制 try: s3.copy_object( Bucket=dest_bucket, Key=dest_key, CopySource={'Bucket': src_bucket, 'Key': src_key} ) except Exception as e: print(f"复制对象 {src_key} 失败: {str(e)}") return {'statusCode': 200, 'body': '文件复制完成'}
3. 触发方式选择
- 联动解压函数:在现有解压ZIP的Lambda函数末尾,直接调用上述复制逻辑,实现解压后自动复制。
- S3事件触发:给
src_bucket配置S3事件,当extract/路径下有新对象创建时,触发复制Lambda。
关键注意事项
- 处理大文件:使用
copy_object而非get_object+put_object,利用S3服务器端复制,减少Lambda内存和时间消耗。 - 错误处理:添加异常捕获,记录失败对象的日志,便于后续排查。
- 目录结构保留:通过移除源前缀
extract/,确保目标桶内的文件结构与源解压目录一致。
内容的提问来源于stack exchange,提问作者Spike
相关产品推荐
相关产品推荐

