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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 23:22:13