【问题标题】:S3 moving files between buckets on different accounts?S3在不同帐户的存储桶之间移动文件?
【发布时间】:2012-10-03 01:52:15
【问题描述】:

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

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

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

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

有没有办法在不下载文件并再次将它们上传到第二个帐户的情况下做到这一点?

【问题讨论】:

标签: amazon-s3 s3cmd


【解决方案1】:

您不必向所有人开放权限。使用以下关于源和目标的存储桶策略,使用 IAM 用户从一个账户中的存储桶复制到另一个账户

  • 要复制的存储桶:SourceBucket

  • 要复制到的存储桶:DestinationBucket

  • 来源 AWS 账户 ID:XXXX–XXXX-XXXX

  • 来源 IAM 用户:src–iam-user

以下策略意味着 - IAM 用户 - XXXX–XXXX-XXXX:src–iam-user 拥有 s3:ListBuckets3:GetObject 特权 on SourceBucket/*s3:ListBuckets3:PutObject DestinationBucket/* 特权

在 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": "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

【讨论】:

  • 效果很好。谢谢!
  • 如果我想将此文件夹/文件下载到本地计算机怎么办?
  • 如果这些存储桶位于不同的区域会怎样
  • s3 存储桶是全球性的,而不是特定于区域的。
  • 呼……也帮了我。 IAM 政策很棘手。我的方案是创建一个 sns 主题并将该主题作为 sns 事件侦听器添加到来自不同帐户的 s3 存储桶。必须在 s3 存储桶上为该 IAM 用户(来自 sns acct)添加存储桶策略
【解决方案2】:

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

至于在没有将文件放在某处计算机上的情况下执行此操作 - 不要这么认为。

除了:由于他们从您邮寄给他们的硬盘进行批量上传,他们可能会为您执行相同的桶到桶传输。

【讨论】:

  • 谢谢汤姆。看来这就是它的发展方向。从实例中执行它似乎也是一个好方法。感谢您的提示。
【解决方案3】:

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

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

祝你好运 乔恩

【讨论】:

    【解决方案4】:

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

    1. 为 Source-Buckets-Account 获取您的 AWS 凭证
    2. Destination-Buckets-Account 也是如此
    3. 在您的本地计算机(桌面或 AWS 之外的任何服务器)上使用 Source-Bucket-Accounts 的凭据创建一个新配置文件。

      aws --profile ${YOUR_CUSTOM_PROFILE} 配置

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

    5. 将您的 Destination-Bucket-Credentials 保存为 Environment-Variables

      导出 AWS_ACCESS_KEY_ID=AKI...

      导出 AWS_SECRET_ACCESS_KEY=CN...

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

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

    【讨论】:

    • 如果源存储桶和目标存储桶的凭据不同,我还能进行 S3 同步吗?
    • 这对我不起作用 - 调用 ListObjectsV2 操作时发生错误 (AccessDenied):访问被拒绝 它只是使用配置文件中的凭据用于源和目标。
    【解决方案5】:

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

    我可以使用 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 表示安全漏洞。这里绝对不是好习惯 - 这是一个很大的技巧。
    • 糟糕且不需要破解。 s3 已经为您提供了存储桶策略功能来创建源/目标策略,以便以安全的方式将源同步到目标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 2021-04-09
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多