如何使用多个AWS账户同步多个S3存储桶?

时间:2019-08-02 17:37:59

标签: amazon-web-services amazon-s3 amazon-ec2 amazon-iam

我无法同步连接到两个单独的AWS账户的两个S3存储桶。

有两个AWS账户-账户A(由第三方管理)和账户B(由我管理)。我希望将文件从帐户A的S3存储桶中提取到帐户B的S3存储桶中。

帐户A向我提供了以下说明:

  • 在帐户B中,创建一个名为LogsUser的新IAM用户。将以下策略附加到用户:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "sts:AssumeRole",
                "Resource": "arn:aws:iam::ACCOUNTID:role/12345-LogAccess-role"
            }
        ]
    }
  • 配置AWS CLI以更新配置和凭证文件。具体来说,~/.aws/config文件看起来像:

    [profile LogsUser]
    role_arn = arn:aws:iam::ACCOUNTID:role/12345-LogAccess-role
    source_profile = LogsUser
    

    ~/.aws/credentials文件看起来像

    aws_access_key_id = YOUR_ACCESS_KEY_ID
    aws_secret_access_key = YOUR_SECRET_ACCESS_KEY
    
  • 从这里,我可以使用$ aws s3 ls --profile LogsUser s3://bucket-a成功查询帐户A的存储桶中的日志文件。

我已经在帐户B中设置了bucket-b,但是无法查询bucket-b中的任何文件。例如,$ aws s3 ls --profile LogsUser s3://bucket-b返回An error occurred (AccessDenied) when calling the AssumeRole operation: Access denied

是否可以添加其他一些东西到配置文件或IAM策略中,以允许使用bucket-b选项访问--profile LogsUser?我可以使用其他bucket-b设置访问--profile,但是我不想同步到本地文件系统,然后再同步到另一个存储桶。

所需的结果是运行类似aws s3 sync s3://bucket-a s3://bucket-b --profile UserLogs的命令。

3 个答案:

答案 0 :(得分:0)

我建议您考虑使用AWS S3存储桶复制:

https://docs.aws.amazon.com/AmazonS3/latest/dev/crr.html

答案 1 :(得分:0)

如果您只想列出Fatal Python error: Py_Initialize: can't initialize sys standard streams Traceback (most recent call last): File "$HOME/anaconda3/lib/python3.7/io.py", line 52, in <module> File "$HOME/anaconda3/lib/python3.7/abc.py", line 147 print(f"Class: {cls.__module__}.{cls.__qualname__}", file=file) ^ SyntaxError: invalid syntax Aborted (core dumped) 中的对象,请执行此操作。

首先请确保LogsUser IAM用户具有访问帐户B中的bucket-b s3存储桶的适当权限。如果没有,您可以将此策略添加到该用户

bucket-b

如果用户具有权限,并且存储在{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:*" ], "Resource": [ "arn:aws:s3:::bucket-b/*" ] } ] } 中存储在~/.aws/credentials中的访问密钥和秘密密钥属于LogsUser IAM用户,则只需列出{{1}内的对象使用以下命令。 [default]

如果要运行命令bucket-b,请执行此操作。

请记住,在担任具有LogsUser永久凭证的角色后,我们将使用STS创建的临时凭证。这意味着帐户A中的角色应该有权访问两个存储桶以执行操作,而另一个帐户(帐户B)中的存储桶(aws s3 ls)应该具有适当的存储桶策略以允许角色执行S3操作。 / p>

要向角色提供访问aws s3 sync s3://bucket-a s3://bucket-b --profile UserLogs的权限,请将以下存储桶策略附加到bucket-b

bucket-b

还在帐户A中,将一个策略附加到以下角色,以允许访问两个帐户中的S3存储桶。

bucket-b

答案 2 :(得分:0)

您的情况是:

  • 您希望从Bucket-A中的Account-A复制
  • 文件需要复制到Bucket-B中的Account-B
  • Account-A为您提供了在LogAccess-role中假设Account-A的能力,该权限可以访问Bucket-A

使用CopyObject()命令(AWS CLI sync命令使用)在存储桶之间复制文件时,需要:

  • 在源存储桶(Bucket-A)上读取访问权限
  • 在目标存储桶(Bucket-B)上写访问权限

当您假设LogAccess-role时,您会收到对Bucket-A具有读访问权限的凭据。这太棒了!但是,这些凭据无权写入Bucket-B,因为它位于单独的帐户中。

要解决此问题,您应该在Bucket-A上创建一个Bucket策略,该策略授予LogAccess-roleAccount-B的写访问权限。 “存储桶策略”如下所示:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::ACCOUNT-A:role/12345-LogAccess-role"
            },
            "Action": [
                "s3:ListBucket",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::bucket-a",
                "arn:aws:s3:::bucket-a/*"
            ]
        }
    ]
}

(您可能需要其他权限。请检查所有错误消息以获取提示。)

这样,LogAccess-role将能够从Bucket-A读取并写入Bucket-B