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

时间:2017-08-10 09:24:15

标签: amazon-web-services amazon-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/

我的问题是如何在北京(中国)桶和全球桶之间同步数据?首先,使用指定的region&上面endpoint-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,但似乎无法在endpoint-url中配置.aws/config,因为没有提到{{3} }。

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

3 个答案:

答案 0 :(得分:0)

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

围绕此限制有几种方法,每种方法都有其自身的缺点:

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

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

答案 1 :(得分:0)

BJS / ZHY区域与经典区域的划分不同(aws-cn代表BJS / ZHY,aws-cn代表其他区域)

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

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

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

答案 2 :(得分:0)

我使用本地磁盘进行临时存储,
1.从eu-west同步到笔记本电脑--profile = myglobal
2.从笔记本电脑同步到cn-north --profile = mychina