如何在北京(中国)存储桶和全局存储桶之间同步 S3 中的数据?



北京(中国(区域非常独特,因为它几乎所有内容都是独立的(与 AWS Global 分开(。例如,要使用AWS CLI列出对象,我们必须指定regionendpoint-url

aws --region cn-north-1 
--endpoint-url https://s3.cn-north-1.amazonaws.com.cn 
--profile AN_AWS_CN_PROFILE 
s3 ls s3://AN_AWS_CN_BUCKET/

我的问题是如何在北京(中国(存储桶和全局存储桶之间同步数据?首先,全局存储桶无法通过上述指定的regionendpoint-url识别。例如

aws --region cn-north-1 
--endpoint-url https://s3.cn-north-1.amazonaws.com.cn 
--profile AN_AWS_CN_PROFILE 
s3 cp s3://AN_AWS_CN_BUCKET/ s3://AN_AWS_IRELAND_BUCKET/

会给

致命错误:调用 ListObjects 操作时出错 (NoSuchBucket(:指定的存储桶不存在

(目标存储桶确实存在。

到目前为止,我已经探索了 CLI 参数,并.aws/config文件来定义配置文件。也许可以在单个命令中使用多个profile,但似乎无法在.aws/config中配置endpoint-url,因为这里没有提到。

现在我只是将文件复制到本地然后上传,随着数据集的快速增长,这将成为一个问题。使用 EMR 可能会解决扩展问题,但它增加了额外的复杂性。我想知道是否有更好且可能简单的解决方案?谢谢。

BJS/ZHY 区域与经典区域处于不同的分区下(aws-cn 表示 BJS/ZHY,AWS 用于其他区域(

不同的分区阻止来自 BJS 和经典区域的账户相互通信 - 它们无法理解来自其他分区的 ARN,也无法将其他分区中的账户列入白名单或向其授予权限。

中国区域的 S3 也存在一些问题,即某些 S3 URL/IP 被本地网络提供商阻止。

根据我的经验,实现这一目标的最佳方法是创建一个 Lambda 函数以将 S3 对象上传到经典分区中的存储桶,或者配置 SNS->SQS->SQS 侦听器模式。

问题是 AWS API 期望所有操作都在一个会话中运行,该会话绑定到用户或角色。也就是说,如果您的存储桶都需要分别上传和下载的权限,则无法将这两个权限合并到一个会话中。

有几种方法可以解决此限制,每种方法都有自己的缺点:

a(在传输期间暂时公开每个文件。这需要脚本或应用程序形式的一些逻辑。实质上,您在源存储桶的账户中担任用户或角色,并更改要复制的文件的 ACL。您无需使存储桶可列出,因此任何攻击者都需要知道确切的路径才能在传输窗口期间访问您的文件。然后,使用目标账户的角色或用户,您将读取现在的公开文件并将其保存到目标存储桶。对每个文件重复此操作一次。

b(使用传输实例。AWS API 不允许同时代入两个角色/用户,但您可以先代入源存储桶账户的角色/用户,将所有必需的文件复制到本地磁盘,然后使用第二组凭证上传到目标存储桶。此调解器实例可以是 EC2 实例或您的本地计算机(如果您有带宽和卷容量(。

我使用本地磁盘进行临时存储:

  1. 从欧洲西部同步到笔记本电脑--profile=myglobal
  2. 从笔记本电脑同步到CN-North--profile=mychina

最新更新