AWS S3权限 - put-bucket-acl出错

3

我正在尝试将一个S3存储桶从一个帐户(A)移动到另一个帐户(B)。 我已经成功地完成了这个操作,并从帐户A中删除了存储桶。 我现在正在尝试将新的存储桶从帐户B移动到帐户B上的另一个存储桶,但是发现除了存储桶本身之外,我无法访问文件。 经过与s3 cli及其权限的搏斗后,我检查了s3api命令,并发现文件(惊喜)仍保留旧的所有权。 我现在正在尝试更改它,但是使用put-bucket-acl时停滞不前,JSON文件对于s3api命令不起作用。 我尝试以调试方式运行命令,但并没有太多收获。 有人知道该怎么办吗? 也许有更好的解决方法?

到目前为止我做了什么: 命令:

aws s3api put-bucket-acl --bucket my-bucket  --cli-input-json file://1.json

与put-object-acl相同

1. json文件:

"Grantee": {
"DisplayName": "account_B",
"EmailAddress": "user@mail.com",
"ID": "111111hughalphnumericnumber22222",
"Type": "CanonicalUser",
"Permission": "FULL_CONTROL"
 }

我收到的错误信息如下:

输入中存在未知参数: "Grantee",必须是以下之一:ACL、AccessControlPolicy、Bucket、ContentMD5、GrantFullControl、GrantRead、GrantReadACP、GrantWrite、GrantWriteACP。输入中存在未知参数: "Permission",必须是以下之一:ACL、AccessControlPolicy、Bucket、ContentMD5、GrantFullControl、GrantRead、GrantReadACP、GrantWrite、GrantWriteACP。

更新: 在我的情况下,假设在两个帐户之间使用AssumeRole无效。 cli(s3cmd,s3api)GUI(MCSTools,bucketexplorer),使用headers、body(Postman)的ACL也没有帮助。 我正在联系AWS支持,并希望能得到最好的解决方案。 有了解决方案后我会进行更新。
4个回答

4

所以,AWS技术支持来拯救了我...我把这个留给其他人看,这样他们就不用像我一样浪费两天时间去弄清楚到底出了什么问题...

aws s3api get-object-acl --bucket <bucket_on_B> --key <Key_on_B_Owned_by_A>  --profile IAM_User_A > A_to_B.json

应用以下结果:

aws s3api get-bucket-acl --bucket <Bucket_on_B> --profile IAM_User_B

将这个json文件放到对应的位置后,然后运行即可。
aws s3api put-object-acl --bucket <Bucket_on_B> --key <Key_on_B_Owned_by_A> --access-control-policy file://A_to_B.json --profile IAM_User_A

我之前不知道file://<myfile.json>这部分。 - C.J.

2
对于仍在寻找如何实现此操作的任何人 - OP可能查看了正确的AWS文档,但忽略了正确的命令。我很高兴通过这个stackoverflow页面找到了正确的命令 :)

https://docs.aws.amazon.com/cli/latest/reference/s3api/put-bucket-acl.html

在那里有带有例子的 JSON 语法,而不是使用 --cli-input-json,请使用 --access-control-policy。^^
{
  "Grants": [
    {
      "Grantee": {
        "DisplayName": "string",
        "EmailAddress": "string",
        "ID": "string",
        "Type": "CanonicalUser"|"AmazonCustomerByEmail"|"Group",
        "URI": "string"
      },
      "Permission": "FULL_CONTROL"|"WRITE"|"WRITE_ACP"|"READ"|"READ_ACP"
    }
    ...
  ],
  "Owner": {
    "DisplayName": "string",
    "ID": "string"
  }
}

我有一个JSON文件作为策略,使用这个命令可以正常工作:
aws s3api put-bucket-acl --bucket bucketname --access-control-policy file://yourJson.json
还有一点需要注意的是,我无法在现有权限的情况下添加权限,旧ACL将被覆盖。因此,您想要添加的任何权限都需要与现有策略一起包含在JSON策略文件中。在首先使用某些命令描述所有ACL时,会更容易理解它。

2
您的JSON格式有误。根据put-bucket-acl选项的文档,您可以使用--generate-cli-skeleton生成有效的JSON模板('skeleton')。例如:
aws s3api put-bucket-acl --bucket BUCKETNAME --generate-cli-skeleton

以下是输出结果:

{
    "ACL": "", 
    "AccessControlPolicy": {
        "Grants": [
            {
                "Grantee": {
                    "DisplayName": "", 
                    "EmailAddress": "", 
                    "ID": "", 
                    "Type": "", 
                    "URI": ""
                }, 
                "Permission": ""
            }
        ], 
        "Owner": {
            "DisplayName": "", 
            "ID": ""
        }
    }, 
    "Bucket": "", 
    "ContentMD5": "", 
    "GrantFullControl": "", 
    "GrantRead": "", 
    "GrantReadACP": "", 
    "GrantWrite": "", 
    "GrantWriteACP": ""
}

我知道这个选项,但我不确定其中的参数-我是否需要全部插入?如果我不想让“URI”公开,我该怎么办?我从哪里获取“ContentMD5”,我是“Owner”-我应该插入旧所有者吗?如果我有一个没有电子邮件地址的用户,我该怎么给他授权访问?谢谢! - soBusted
1
在http://docs.aws.amazon.com/cli/latest/reference/s3api/put-bucket-acl.html和http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTacl.html上有一些带有最小结构的好例子。如果您不使用`AmazonCustomerByEmail`,而是使用`CanonicalUser`或`Group`,则可以省略用户电子邮件。您也可以省略`ContentMD5`。 - Sergey Kovalev

0

语法如下(附有示例):

aws s3api put-bucket-acl --bucket bucket_name --access-control-policy file://grant.json

grant.json 文件:

{
    "Grants": [
            {
            "Grantee": {
                "ID": "CANONICAL_ID_TO_GRANT",
                "Type": "CanonicalUser"
            },
            "Permission": "WRITE"
            },
            {
            "Grantee": {
                "ID": "CANONICAL_ID_TO_GRANT",
                "Type": "CanonicalUser"
            },
            "Permission": "READ"
            }
        ],
        "Owner": {
            "DisplayName": "example_owner",
            "ID": "CANONICAL_ID_OWNER"
        }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接