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

如何通过Python Boto3实现S3跨区域递归复制对象

boto3完全可以实现和你给出的AWS CLI命令等效的跨区域S3递归复制能力,不存在接口层面的跨区域限制。你之前测试的同区域限制问题,本质是配置方式错误,不是接口本身不支持跨区域场景。

核心实现逻辑

你用的aws s3 cp --recursive跨区域复制,底层做了两件事:

  1. 连接源区域S3端点,递归列出源桶路径下的所有对象
  2. 连接目标区域S3端点,逐个发起对象复制请求,请求中明确携带源桶的位置信息

用boto3可以完全复现这套逻辑,核心要避开两个配置误区:

  • 不要用全局默认区域初始化客户端,操作源桶和目标桶的客户端要分别绑定对应区域
  • 调用复制接口时,必须在复制源参数中明确声明源桶所在区域,不能省略

可直接运行的实现代码如下:

import boto3
from botocore.config import Config

def cross_region_s3_recursive_copy(
    source_bucket: str,
    source_region: str,
    target_bucket: str,
    target_region: str,
    source_prefix: str = "",
    target_prefix: str = ""
):
    # 初始化绑定目标区域的S3客户端,复制请求需发往目标区域端点
    target_s3_client = boto3.client(
        "s3",
        region_name=target_region,
        config=Config(signature_version="s3v4")
    )
    # 初始化绑定源区域的客户端,用于遍历源桶对象
    source_s3_client = boto3.client("s3", region_name=source_region)

    # 分页遍历源桶指定前缀下所有对象,实现--recursive等效逻辑
    paginator = source_s3_client.get_paginator("list_objects_v2")
    for page in paginator.paginate(Bucket=source_bucket, Prefix=source_prefix):
        if "Contents" not in page:
            continue
        for obj in page["Contents"]:
            source_key = obj["Key"]
            # 跳过S3目录占位对象
            if source_key.endswith("/"):
                continue
            target_key = source_key.replace(source_prefix, target_prefix, 1)
            print(f"复制中: s3://{source_bucket}/{source_key} -> s3://{target_bucket}/{target_key}")
            # 发起跨区域复制请求,显式指定源区域
            target_s3_client.copy(
                CopySource={
                    "Bucket": source_bucket,
                    "Key": source_key,
                    "SourceRegion": source_region
                },
                Bucket=target_bucket,
                Key=target_key
            )

if __name__ == "__main__":
    # 参数与你给出的AWS CLI命令完全对应
    cross_region_s3_recursive_copy(
        source_bucket="source-bucket",
        source_region="region1",
        target_bucket="target-bucket",
        target_region="region2"
    )
之前方案失效的常见原因

你之前用boto3.resource + meta.client.copy的方案无法适配跨区域,基本是以下问题导致的:

  • 初始化resource时没有指定目标区域,客户端默认读取本地AWS配置的默认区域,跨区域请求会被S3路由拦截
  • 调用copy方法时,CopySource参数没有传入SourceRegion字段,S3服务端无法定位跨区域的源桶,直接返回访问错误
  • 没有实现分页遍历对象的逻辑:不管是AWS CLI还是boto3,copy方法本身只支持单对象复制,--recursive的递归效果是上层封装了“列对象+逐个复制”的逻辑,不是接口自带能力

注意:上述单对象复制接口最大支持5GB大小的文件,如果桶内存在超过5GB的大对象,需要改用S3分片复制接口实现,和AWS CLI自动适配大对象的逻辑一致。

内容的提问来源于stack exchange,提问作者Atin Bansal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:57:16