在不同账号的存储桶之间转移文件,如何操作S3?

31

我正在为一个有两个独立AWS账户的客户进行一些工作。我们需要将其中一个S3帐户上存储桶中的所有文件移动到第二个帐户上的新存储桶。

我们认为可以使用s3cmd来完成此操作,格式如下:

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

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

有没有一种方法可以在不下载文件并重新上传到第二个账户的情况下完成这个操作?


参考:在两个不同的账户之间复制/移动:https://dev59.com/wm035IYBdhLWcg3wSN0G - Tej Kiran
5个回答

46

您不必向所有人开放权限。使用以下 Bucket 策略来从一个帐户的存储桶复制到另一个帐户,使用 IAM 用户:

  • 要复制的 Bucket: SourceBucket

  • 要复制到的 Bucket: DestinationBucket

  • 源 AWS 帐户 ID: XXXX–XXXX-XXXX

  • 源 IAM 用户: src–iam-user

以下策略意味着 - IAM 用户 - XXXX–XXXX-XXXX:src–iam-userSourceBucket/* 上具有 s3:ListBuckets3:GetObject 权限,同时在 DestinationBucket/* 上具有 s3:ListBuckets3: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"}
  }]
}

目标存储桶的策略应为:

{
  "Id": "Policy1357935677555",
  "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


运行得非常好。谢谢! - Sergio
1
如果我想将这个文件夹/文件下载到本地机器上怎么办? - Eliza A
如果这些存储桶位于不同的区域,会发生什么? - David
S3存储桶是全局的,不属于特定区域。 - freerunner
哎呀,帮了我大忙了。IAM策略真是棘手。我的情况是创建一个SNS主题,并将该主题作为S3存储桶的SNS事件侦听器添加到不同账户中。必须在S3存储桶上为IAM用户(来自SNS账户)添加存储桶策略。 - Abhi

3

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

至于在不让文件在某个计算机上落地的情况下完成操作 - 应该是不可能的。

除非:由于他们从邮寄给他们的硬盘进行批量上传,所以他们也可能为您提供桶到桶传输的相同服务。


1
谢谢Tom。看起来就是这样了。从实例开始做似乎也是一个不错的选择。感谢你的提示。 - Geuis

0
我建议使用Cloudberry S3 Explorer,作为快速启动事物的简单解决方案。此外,它还允许您利用内部AWS带宽免费传输服务。
您还可以使用Cloudberry SDK工具集成到您的应用程序中。

-1

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

  1. 获取源存储桶帐户的AWS凭据
  2. 获取目标存储桶帐户的AWS凭据
  3. 在您的本地计算机(桌面或任何位于AWS之外的服务器)上使用源存储桶帐户的凭据创建一个新配置文件。

    aws --profile ${YOUR_CUSTOM_PROFILE} configure

  4. 填写aws_access_key_id和aws_secret_access_key(您可以跳过Region和Output)

  5. 将目标存储桶凭据保存为环境变量

    export AWS_ACCESS_KEY_ID=AKI...

    export AWS_SECRET_ACCESS_KEY=CN...

  6. 现在进行同步,但添加关键的"profile"参数

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


2
如果源存储桶和目标存储桶的凭证不同,有没有办法进行S3同步? - HariShankar
无法运行 - 调用ListObjectsV2操作时发生错误(AccessDenied):访问被拒绝。它只是使用配置文件中的凭据作为源和目标。 - ANDgineer

-11

好的,找到了答案。可能有其他方法来做到这一点,但这种方式非常简单。

我能够使用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控制台,并删除您为存储桶添加的权限。

显然这里存在安全问题。我们要传输到的存储桶是对所有人开放的。找到您的存储桶名称的机会很小,但确实存在。

您可以使用存储桶策略作为另一种只开放给特定帐户访问的替代方法,但我觉得那太麻烦了,所以我把它留给需要解决这个问题的人练习。

希望这有所帮助。


5
抱歉,安全漏洞得扣掉一分。在这里绝对不是一个好的做法——这是一次严重的黑客攻击。 - swrobel
可怕且不必要的黑客。s3已经为您提供了Bucket Policy功能,以便您创建源/目标策略,以安全的方式将源同步到目标。 - Daniel Andrei Mincă

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接