【问题标题】:Is it possible to copy between AWS accounts using AWS CLI?是否可以使用 AWS CLI 在 AWS 账户之间进行复制?
【发布时间】:2014-04-11 09:13:10
【问题描述】:

是否可以使用 AWS CLI 在 AWS 账户之间复制 S3 存储桶的内容?我知道可以在同一账户中的存储桶之间复制/同步,但我需要将旧 AWS 账户的内容放入新账户。我为 AWS CLI 配置了两个配置文件,但我不知道如何在单个复制/同步命令中使用这两个配置文件。

【问题讨论】:

    标签: amazon-web-services amazon-s3 aws-cli


    【解决方案1】:

    非常简单。比方说:

    旧 AWS 账户 = old@aws.com

    新 AWS 账户 = new@aws.com

    old@aws.com 身份登录 AWS 控制台

    转到您选择的存储桶并应用以下存储桶政策

    {
      "Statement": [
        {
          "Action": [
            "s3:ListBucket"
          ],
          "Effect": "Allow",
          "Resource": "arn:aws:s3:::bucket_name",
          "Principal": {
            "AWS": [
              "account-id-of-new@aws.com-account"
            ]
          }
        },
        {
          "Action": [
            "s3:GetObject",
            "s3:PutObject"
          ],
          "Effect": "Allow",
          "Resource": "arn:aws:s3:::bucket_name/*",
          "Principal": {
            "AWS": [
              "account-id-of-new@aws.com-account"
            ]
          }
        }
      ]
    }
    

    我猜bucket_nameaccount-id-of-new@aws.com-account1 在上述政策中对您来说很明显

    现在,请确保您使用 new@aws.com 的凭据运行 AWS-CLI

    运行下面的命令,复制会像魅力一样发生:

    aws s3 cp s3://bucket_name/some_folder/some_file.txt  s3://bucket_in_new@aws.com_acount/fromold_account.txt
    

    当然,请确保new@aws.com 对他自己的存储桶bucket_in_new@aws.com_acount 具有写入权限,这在上述命令中用于保存从old@aws.com 存储桶复制的内容。

    希望这会有所帮助。

    【讨论】:

    • 可以反过来做吗?我可以(通过 AWS_ACCESS_KEY_ID)访问具有列出和获取对象的权限的源存储桶 A,并且我想将文件从该存储桶复制到我的存储桶 B,并且只有在存储桶 B 上我才能更改权限/策略。我从帐户 A 授予用户完全访问权限,但仍然收到“调用 CopyObject 操作时拒绝访问”错误。有什么想法吗?
    • 如果 new@aws.com 中也存在“bucket_name/some_folder/some_file.txt”路径会怎样?
    【解决方案2】:

    好的,我现在有这个工作!感谢您的回答。最后,我使用了@slayedbylucifer 和@Sony Kadavan 之间的组合。对我有用的是新的存储桶策略和新的用户策略。

    我添加了以下存储桶策略(帐户 A):

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": [
                    "s3:ListBucket"
                ],
                "Effect": "Allow",
                "Resource": "arn:aws:s3:::myfoldername",
                "Principal": {
                    "AWS": [
                        "arn:aws:iam::111111111111:user/myusername"
                    ]
                }
            },
            {
                "Action": [
                    "s3:*"
                ],
                "Effect": "Allow",
                "Resource": "arn:aws:s3:::myfoldername",
                "Principal": {
                    "AWS": [
                        "arn:aws:iam::111111111111:user/myusername"
                    ]
                }
            }
        ]
    }
    

    以及以下用户政策(帐户 B):

        {
           "Version": "2012-10-17",
           "Statement":{
              "Effect":"Allow",
              "Action":"s3:*",
              "Resource":"arn:aws:s3:::myfoldername/*"
           }
    
    }
    

    并使用了以下 aws cli 命令(需要 region 选项,因为帐户位于不同的区域):

    aws --region us-east-1 s3 sync s3://myfoldername s3://myfoldername-accountb
    

    【讨论】:

      【解决方案3】:

      是的,你可以。 您需要首先在第二个账户中创建一个 IAM 用户并将权限委派给它 - 特定 S3 存储桶上的读/写/列表。完成此操作后,将此 IAM 用户的凭据提供给您的 CLI,它就会起作用。

      如何委派权限: 向 IAM 用户委派跨账户权限 - AWS Identity and Access Management:http://docs.aws.amazon.com/IAM/latest/UserGuide/DelegatingAccess.html#example-delegate-xaccount-roles

      Sample S3 policy for delegation:
      
      {
         "Version": "2012-10-17",
         "Statement" : {
            "Effect":"Allow",
            "Sid":"AccountBAccess1",
            "Principal" : {
                "AWS":"111122223333"
            },
            "Action":"s3:*",
            "Resource":"arn:aws:s3:::mybucket/*"
         }
      }
      

      当您在生产设置中执行此操作时,请在权限方面进行更多限制。如果您需要从存储桶复制到另一个存储桶。然后一方面,您只需要提供 List 和 Get(而不是 Put)

      【讨论】:

      • 为什么需要 IAM 用户?只需在具有读取权限的存储桶之间进行复制即可。
      • 如果没有 IAM,您必须向 CLI 提供完整的账户凭证(aws id 和 secret)。最好在“最小特权原则”中避免这种情况 - 因此建议使用 IAM。
      【解决方案4】:

      在我的例子中,下面提到的命令会起作用,希望这也对你有用。我在不同地区有两个不同的 AWS 账户,我想将我的旧存储桶内容复制到一个新的存储桶中。我为 AWS CLI 配置了两个配置文件。

      使用了以下 aws cli 命令:

      aws s3 cp --profile <profile1> s3://source_bucket_path/ --profile <profile2> s3://destination_bucket_path/ --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --recursive
      

      【讨论】:

      • 你真的可以在一个命令中使用多个--profile 开关吗?它似乎对我不起作用,我在文档中找不到任何提及。
      • 不起作用。它返回:“致命错误:调用 HeadObject 操作时发生错误(403):禁止”
      猜你喜欢
      • 1970-01-01
      • 2022-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-02
      • 1970-01-01
      相关资源
      最近更新 更多