2012-10-03 91 views
18

我做了有2个独立的AWS账户的客户的一些工作。我们需要将其中一个S3帐户中的存储桶中的所有文件移至第二个帐户上的新存储桶。S3移动到不同的帐户桶之间进行文件?

我们认为s3cmd会允许这样做,使用格式:

s3cmd cp s3://bucket1 s3://bucket2 --recursive 

然而,这仅允许我使用一个账户的钥匙,我不能指定第二帐户的帐户。

有没有办法做到这一点,而无需下载文件并重新上传他们的第二帐户?

+0

Ref:在两个不同的帐户之间复制/移动:http://stackoverflow.com/questions/5518205/move-files-directly-from-one-s3-account-to-another –

回答

33

您不必向每个人开放权限。从斗使用的源和目标复制下面的水桶政策在一个帐户到另一个使用IAM用户

桶复制从 - SourceBucket

桶复制到 - DestinationBucket

来源AWS账户ID - XXXX-XXXX-XXXX

源IAM用户 - SRC-IAM-用户

以下策略装置 - 该IAM用户 - XXXX-XXXX-XXXX:SRC-IAM-用户具有S3:ListBucket和s3 :GetObject priv在SourceBucket/*和S3 ileges:ListBucket和S3:上DestinationBucket PutObject特权/ *

在SourceBucket政策应该是这样的:

{ 
"Id": "Policy1357935677554", 
"Statement": [ 
    { 
     "Sid": "Stmt1357935647218", 
     "Action": [ 
      "s3:ListBucket" 
     ], 
     "Effect": "Allow", 
     "Resource": "arn:aws:s3:::SourceBucket", 
     "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"} 
    }, 
    { 
     "Sid": "Stmt1357935676138", 
     "Action": ["s3:GetObject"], 
     "Effect": "Allow", 
     "Resource": "arn:aws:s3::: SourceBucket/*", 
     "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"} 
    } 
] 
} 

在DestinationBucket的政策应该是:

{ 
"Id": "Policy1357935677554", 
"Statement": [ 
    { 
     "Sid": "Stmt1357935647218", 
     "Action": [ 
      "s3:ListBucket" 
     ], 
     "Effect": "Allow", 
     "Resource": "arn:aws:s3::: DestinationBucket", 
     "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"} 
    }, 
    { 
     "Sid": "Stmt1357935676138", 
     "Action": ["s3:PutObject"], 
     "Effect": "Allow", 
     "Resource": "arn:aws:s3::: DestinationBucket/*", 
     "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"} 
    } 
] 
} 

要运行的命令是s3cmd cp s3://SourceBucket/File1 s3://DestinationBucket/File1

+0

精美的作品。谢谢! – Sergio

+1

如果我想将这个文件夹/文件下载到我的本地机器上,该怎么办? –

+0

如果这些桶位于不同区域 – David

3

带宽内AWS不计,所以你可以从里面AWS一个盒子做这一切节省一些金钱和时间,只要将铲斗在同一区域。

至于这样做,而不必在文件touch在某处的计算机上 - 不这么认为。

除外:既然他们这样做,从你邮寄到他们的硬盘批量上传,他们可能会做同样为你的桶桶传送。

+1

谢谢汤姆。看起来就是这样。从一个实例做起来似乎也是一个很好的方法。谢谢你的提示。 – Geuis

0

我会建议使用云莓S3的探险家,作为一个简单的解决方案,得到的东西快速移动。此外,它还允许您使用内部aws无带宽传输服务。

您也可以使用云莓SDK工具集成到您的应用程序。

好运 乔恩

-6

好吧,想出了一个答案。有可能还有其他的方法来做到这一点,但这很容易。

我能够与s3cmd工具来做到这一点,但可能可以用类似的工具来完成。

当您配置s3cmd时,请配置您的您的帐户访问密钥和秘密访问密钥。

使用您正转移到的存储桶的帐户登录到S3 Web控制台。

参观S3 Web控制台。

https://console.aws.amazon.com/s3/home 

点击你的存储桶,然后点击动作,然后点击属性。

在“权限”选项卡下的底部点击“添加更多的权限。”

Set "Grantee" to Everyone 

Check "List" and "Upload/Delete" 

Save 

转移,从终端

s3cmd cp s3://from_account_bucket s3://to_account_bucket --recursive 

运行,当传输完成后,应立即访问的S3控制台一次删除您添加的桶的权限。

这里显然有一个安全问题。我们转移到的存储桶向所有人开放。有人找到您的存储桶名称的机会很小,但确实存在。

您可以使用存储桶策略作为替代方式,只开放特定账户的访问权限,但这对我来说太难了,所以我把这个做为一个练习给那些需要弄清楚的人。

希望这会有所帮助。

+1

对不起,-1为安全漏洞。这里绝对不是很好的做法 - 这是一个很大的破解。 – swrobel

0

即使角色和策略是一个真正优雅的方式,我有另一种解决方案:

  1. 让您的AWS-凭据来源桶科目
  2. 同为目的地桶科目
  3. 在本地计算机(台式机或AWS之外的任何服务器)创建具有新的配置文件源代码桶帐户的凭证。

    AWS --profile $ {} YOUR_CUSTOM_PROFILE在aws_access_key_id和aws_secret_access_key(你可以跳过区域和输出)配置

  4. 填充

  5. 保存你的目的 - 斗凭据作为环境的变量

    出口AWS_ACCESS_KEY_ID = AKI ..​​.

    出口AWS_SECRET_ACCESS_KEY = CN ...

  6. 现在做同步,但增加的关键 “配置文件” - 参数

    AWS --profile $ {} YOUR_CUSTOM_PROFILE S3同步S3:// $ {} SOURCE_BUCKET_NAME S3:// $ {} DESTINATION_BUCKET_NAME

+1

如果源桶和目标桶的凭据不同,我可以执行S3同步吗? – HariShankar

相关问题