S3在不同帐户的桶之间移动文件?

时间:2012-10-03 01:52:15

标签: amazon-s3 s3cmd

我为拥有2个独立AWS账户的客户做了一些工作。我们需要将其中一个S3帐户的存储桶中的所有文件移动到第二个帐户的新存储桶中。

我们认为s3cmd允许使用以下格式:

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

但是,这只允许我使用一个帐户的密钥,而我无法指定第二个帐户的帐户。

有没有办法在不下载文件并将其再次上传到第二个帐户的情况下执行此操作?

5 个答案:

答案 0 :(得分:40)

您无需向所有人开放权限。在源和目标上使用以下Bucket策略,使用IAM用户从一个帐户中的存储桶复制到另一个帐户

Bucket to Copy from - SourceBucket

Bucket to Copy to - DestinationBucket

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

来源IAM用户 - src-iam-user

以下政策意味着 - IAM用户 - XXXX-XXXX-XXXX:src-iam-user在SourceBucket / *和s3上具有s3:ListBucket和s3:GetObject权限:ListBucket和s3:在DestinationBucket上的PutObject权限/ * < / p>

在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

答案 1 :(得分:3)

AWS内部的带宽不计算在内,因此只要存储桶位于同一区域,您就可以从AWS内部的框中完成所有操作,从而节省一些金钱和时间。

至于在没有文件触及某个地方的计算机的情况下这样做 - 不要这么认为。

除此之外:由于他们从您向其发送的硬盘进行批量上传,因此他们可能会为您进行桶到桶转移。

答案 2 :(得分:0)

我建议使用cloudberry s3 explorer作为一种简单的解决方案,让事情快速发展。它还允许您使用内部aws带宽免费传输服务。

您还可以使用cloudberry sdk工具集成到您的应用中。

祝你好运 乔恩

答案 3 :(得分:0)

即使角色和政策是一种非常优雅的方式,我还有另一种解决方案:

  1. 获取Source-Buckets-Account的AWS-Credentials
  2. Destination-Buckets-Account
  3. 相同
  4. 在本地计算机(桌面或AWS外部的任何服务器)上,使用Source-Bucket-Accounts的凭据创建新的配置文件。

    aws --profile $ {YOUR_CUSTOM_PROFILE} configure

  5. 填写aws_access_key_id和aws_secret_access_key(您可以跳过区域和输出)

  6. 将Destination-Bucket-Credentials保存为Environment-Variables

    导出AWS_ACCESS_KEY_ID = AKI ..​​.

    导出AWS_SECRET_ACCESS_KEY = CN ...

  7. 现在进行同步,但添加关键的“个人资料” - 参数

    aws --profile $ {YOUR_CUSTOM_PROFILE} s3 sync s3:// $ {SOURCE_BUCKET_NAME} s3:// $ {DESTINATION_BUCKET_NAME}

答案 4 :(得分:-6)

好的,找到了答案。也有其他方法可以做到这一点,但这很容易。

我能够使用s3cmd实用程序执行此操作,但可以使用类似工具完成此操作。

配置s3cmd时,请使用您的帐户访问密钥和密钥访问密钥进行配置。

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

访问S3 Web控制台。

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

点击您的存储桶,然后点击操作,然后点击属性。

&#34; Permissions&#34;选项卡单击&#34;添加更多权限&#34;。

Set "Grantee" to Everyone

Check "List" and "Upload/Delete"

Save

转移,从终端

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

传输完成后,您应立即再次访问S3控制台并删除您为存储桶添加的权限。

这里显然存在安全问题。我们转移到的桶对所有人开放。有人找到你的桶名的可能性很小,但确实存在。

您可以使用存储桶策略作为仅打开特定帐户访问权限的替代方式,但这对我来说太难了,我将其作为练习留给那些需要弄明白的人。

希望这有帮助。