在account-a的存储桶中,使由account-b角色上传的对象为公开。

0

【以下的问题经过翻译处理】 大家好

我试图使用Account-B角色(而不是用户)将我的对象上传到Account-A的公共存储桶,但这些对象不是公共的。我想让它们公开或与存储桶具有相同的访问权限。

以下是我的尝试:

  1. 在Account-A中创建MyPublicBucket存储桶,并设置其策略:
{
    "Version": "2012-10-17",
    "Id": "Policy1484633382620",
    "Statement": [
        {
            "Sid": "Stmt1",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws-cn:s3:::MyPublicBucket/*"
        },
        {
            "Sid": "Stmt2",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws-cn:iam::AccountB-ID:role/MyPutObjectRole"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws-cn:s3:::MyPublicBucket/*"
        }
    ]
}

  1. 我在Account-B中将MyPutObjectRole与我的ec2关联,并在此ec2中调用“aws s3 cp --recursive dist s3://MyPublicBucket /”进行上传对象。对象已成功上传,但归Account-B所有,无法公开访问。

  2. 根据文档(https://docs.aws.amazon.com/AmazonS3/latest/dev/amazon-s3-policy-keys.html#grant-putobject-conditionally-1),我添加了以下内容:

"Condition": {
            "StringEquals": {
                "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID"
            }
        }

并调用"aws s3 cp --recursive dist s3://MyPublicBucket/ --grants full=id=AccountA-CanonicalUserID"。

但却返回 "An error occurred (InvalidToken) when calling the PutObject operation: The provided token is malformed or otherwise invalid."。 我尝试使用 s3api,比如 "aws s3api put-object --bucket MyPublicBucket --key 1.txt --body 1.txt --grant-full-control id=AccountA-CanicalUserID",但返回同样的 InvalidToken 错误。 我想在使用授权时我必须提供"--profile",但由于我使用的是角色而不是用户,所以没有配置文件。

总之,我的问题是如何让账户 B 的 ec2 可以将公共对象上传到账户 A 的公共存储桶。

profile picture
专家
已提问 5 个月前7 查看次数
1 回答
0

【以下的回答经过翻译处理】 谢谢,我发现我遗漏了 AWS_DEFAULT_REGION=cn-north-1,导致它返回无效令牌。

我通过以下方法解决了问题 1 在运行命令前添加 AWS_DEFAULT_REGION 2 允许我的角色使用 S3:PubObjectAcl:


{

            "Sid": "Stmt2",

            "Effect": "Allow",

            "Principal": {

                "AWS": "arn:aws-cn:iam::AccountB-ID:role/MyPutObjectRole"

            },

            "Action": ["s3:PutObject","s3:PutObjectAcl"],

            "Resource": "arn:aws-cn:s3:::MyPublicBucket/*"

 }

3 然后执行: aws s3 cp xxx.txt s3://myPublicBucket --acl public-read

profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则