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

标签 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 存储桶中的日志文件。 .

我已经设置了bucket-b但是,在帐户 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 的命令.

最佳答案

例如,如果您要将“账户 A”S3 存储桶对象复制到“账户 B”S3 存储桶,请按照以下步骤操作。

为“账户 A”中的 S3 存储桶创建一个策略,如下所示。为此,您需要“帐户 B”号码,要找到 B 帐号,请转至支持 → 支持中心并从那里复制帐号。

设置“账户 A”存储桶策略:

 {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DelegateS3Access",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::ACCOUNT_B_NUMBER:root"
            },
            "Action": [
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::ACCOUNT_A_BUCKET_NAME/*",
                "arn:aws:s3:::ACCOUNT_A_BUCKET_NAME"
            ]
        }
    ]
}

登录“账户 B”并创建新的 IAM 用户或为现有用户附加以下策略。

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

使用“账户 B”IAM 用户(您已使用上述用户策略创建 IAM)配置 AWS CLI

aws s3 sync s3://ACCOUNT_A_BUCKET_NAME s3://ACCOUNT_B_BUCKET_NAME --source-region ACCOUNT_A_REGION-NAME --region ACCOUNT_B_REGION-NAME

这样我们就可以通过不同的 AWS 账户复制 S3 存储桶对象。

如果您有多个 awscli 配置文件,请在命令末尾使用 --profile 和配置文件名称。

关于amazon-web-services - 如何使用多个AWS账户同步多个S3存储桶?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57331196/

相关文章:

python - 将字典列表作为 csv 直接写入 S3

amazon-web-services - 有没有办法使用无服务器 CLI 进行试运行?

python - 如何使用 python 在 aws s3 预签名的 url 中隐藏我的访问 key

Golang s3 在上传图片时找不到文件和服务器崩溃

amazon-web-services - AWS Lambda 解压缩 gzip 文件而不将文件保存在本地

networking - Cloudera Hadoop 在 EC2 上使用 Vagrant - 如何设置主机、IP 和网络?

python-3.x - ec2 实例的公共(public) ip 地址在实例初始化时为 None

amazon-web-services - AWS RDS : Can't get modify of Instance Class to go through

amazon-web-services - SQS 队列需要什么权限才能通过 SNS 接收来自 SES 的通知?

ubuntu - 在 AWS EC2 上使用 SSL 和 nginx 和 Ubuntu 不起作用