在 ec2 实例上的不同帐户上同步两个不同的 s3 存储桶

Sync two different s3 buckets on different accounts on an ec2 instance

我的目标是我希望能够在 ec2 实例上使用此命令 aws s3 sync s3://source-bucket s3://destination-bucket 运行 aws cli。源和目标存储桶位于不同的账户中,我不拥有源账户。我已经看到很多关于如何同步驻留在不同帐户中的 s3 存储桶而不使用 ec2 实例的示例。尽管当我使用 ec2 实例并向这个中间人(e2c 实例)授予权限时,这些示例的翻译效果不佳。

我读过在使用 ec2 实例时最好使用 IAM 角色来授予权限。这是我目前配置的:

这是附加到我的 IAM 角色的策略,该角色也分配到我的目标帐户上的 ec2 实例。据我了解,它向我的 ec2 实例授予了我的目标 s3 存储桶的权限,用于列出、下载等。此外,该策略还允许您在源帐户上承担 s3-role

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:ListAllMyBuckets"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:PutObject",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::destination-bucket",
                "arn:aws:s3:::destination-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::<source account number>:role/s3-role"
        }
    ]
}

在源帐户上,我只创建了 s3-role 并将其配置为将目标帐户的帐号作为可信实体。以下是附加到 s3 角色的策略:

 {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::source-bucket/*",
                "arn:aws:s3:::source-bucket"
            ]
        }
    ]
}

最后,在我的 ec2 实例上,我使用配置文件配置了 aws cli,这样我就可以承担源帐户上的角色。这是它的样子:

[profile foundation]
role_arn = arn:aws:iam::<source account number>:role/s3-role

credential_source = Ec2InstanceMetadata

然后当我运行命令aws s3 sync s3://source-bucket s3://destination-bucket --profile foundation。调用 ListObjectsV2 操作时出现此错误 (AccessDenied):拒绝访问。我怀疑问题是我使用的命名配置文件可能只是授予对源帐户的访问权限,但我真的不知道。

我只是不确定如何授予权限,以便 ec2 实例可以在不承担角色的情况下访问源帐户。我不确定我是否也需要将策略附加到 s3 存储桶,如果是的话,我不确定我会在其中放入什么。最后一条重要信息是,我可以使用 cp 和 ls 等命令单独访问两个存储桶。

如果答案很明显,我将不胜感激。我是 aws 的新手,谢谢。

我发现在源存储桶上担任角色对于授予允许同步发生的权限不是必需的。在 s3 源存储桶的附加策略上,我将其添加到语句部分

{
            "Sid": "DelegateS3Access",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<destination account number>:root"
            },
            "Action": [
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::source-bucket/*",
                "arn:aws:s3:::source-bucket"
            ]
        }

然后在我的 IAM 角色上附加到我的目标账户上的 ec2 实例,我将其添加到报表部分

 {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::source-bucket",
                "arn:aws:s3:::source-bucket/*"
            ]
        }

然后我能够运行这个命令就好了aws s3 sync s3://source-bucket s3://destination-bucket