繁体   English   中英

S3跨账户文件传输,文件不可访问

[英]S3 cross account file transfer, file not accessible

我正在将 s3 文件从 accountA 推送到 accountB,但无法从 accountB 访问推送的文件。 我检查了推送的文件,推送文件的所有者似乎是 accountA。

这是我所做的。

accountA 中的 IAM 角色具有此策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:*",
                "s3-object-lambda:*"
            ],
            "Resource": "*"
        }
    ]
}

accountB 中的存储桶策略如下所示:

{
            "Sid": "S3AllowPutFromDataLake",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::accountId:role/roleNameAccountA"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::bucketName/*"
        }

如何解决这个问题?

这是在 AWS 账户之间复制 S3 对象时的常见问题。 这里有几个选项可以避免它发生。 选择您喜欢的任何一个:

拉而不是推

当账户 A 将 object 复制到账户 B 时会出现问题。所有权仍属于账户 A。

这可以通过让账户 B 触发复制来避免。 实际上,它是将 object“拉”到账户 B 而不是“推”object。所有权将保留在账户 B 中,因为账户 B 请求了副本。

禁用 ACL

对象级 ACL 的概念早于存储桶策略,并导致许多问题,例如您遇到的问题。

Amazon S3 现在引入了在存储桶上禁用 ACL 的功能,这是创建新存储桶时的推荐选项。 禁用 ACL 还将消除导致问题的“所有权”概念。 在您的情况下,应该禁用 ACL 的是帐户 B 中的目标存储桶。

请参阅: 为所有新存储桶禁用 ACL 并强制执行 Object 所有权 - Amazon Simple Storage Service

复制时指定所有权

复制文件时,可以通过将 ACL 设置为bucket-owner-full-control来指定应转移所有权。

使用 AWS CLI:

aws s3 cp s3://bucket-a/foo.txt s3://bucket-b/foo.txt --acl bucket-owner-full-control

使用 boto3:

    s3_client.copy_object(
                        ACL = 'bucket-owner-full-control',
                        Bucket = DESTINATION_BUCKET,
                        Key = KEY,
                        CopySource = {'Bucket':SOURCE_BUCKET, 'Key':KEY}
                    )

能够通过如下修改存储桶策略来解决此问题:

        {
            "Sid": "S3AllowPutFromDataLake",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::accountId:role/roleNameAccountA"
            },
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ]
            "Resource": "arn:aws:s3:::bucketName/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        }

并在推送文件时添加此参数:

'ACL': 'bucket-owner-full-control'

所有者仍然是 accountA,但现在我可以从 accountB 访问该文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM