9

我正在尝试使用put-bucket-policy通过 aws s3api (Windows) 将策略添加到 s3 存储桶。

我正在使用此处给出的策略代码http://docs.aws.amazon.com/AmazonS3/latest/dev/AccessPolicyLanguage_UseCases_s3_a.html 在“向匿名用户授予权限”下替换我的存储桶名称。

我正进入(状态

A client error (MalformedPolicy) occured: policies must be valid JSON and the first byte must be '{'

有什么线索吗?

编辑:内联 JSON 有效 - 所以这是某种文件格式问题 - 只是不是我能看到的。能够让它与文件一起工作真是太好了。

编辑:为了帮助可能在这里结束的任何其他人,桶应该全部用小写命名。如果不是,则某些 s3/s3api 操作有效,但其他操作无效。看这里

4

3 回答 3

14

TL;博士


您必须file://协议方案添加到策略文件路径

$ aws s3api put-bucket-policy --bucket kryptonite \
   --policy file:///home/superman/aws-example/public-bucket-policy.json


或(视窗


$ aws s3api put-bucket-policy --bucket kryptonite \
   --policy file://C:\Temp\public-bucket-policy.json


或(相对路径


$ aws s3api put-bucket-policy --bucket kryptonite \
   --policy file://public-bucket-policy.json


完整故事:如何通过 CLI 设置公共存储桶策略

首先让我们确保桶上没有其他策略:

$ s3api get-bucket-policy --bucket kryptonite

A client error (NoSuchBucketPolicy) occurred when calling the   GetBucketPolicy
   operation: The bucket policy does not exist


现在让我们确保我们在当前目录中有策略文件并且它包含有效的 json(kryptonite存储桶的名字

$ ls
public-bucket-policy.json

$ cat public-bucket-policy.json 
{
  "Statement": [
    {
      "Resource": "arn:aws:s3:::kryptonite/*",
      "Action": "s3:GetObject",
      "Principal": "*",
      "Effect": "Allow",
      "Sid": "AddPerm"
    }
  ],
  "Version": "2012-10-17"
}


现在让我们尝试通过仅指定文件名来放置策略

$ s3api put-bucket-policy --bucket kryptonite --policy public-bucket-policy.json

A client error (MalformedPolicy) occurred when calling the PutBucketPolicy 
   operation: Policies must be valid JSON and the first byte must be '{'


现在让我们再次尝试并指定完整路径 $ s3api put-bucket-policy --bucket kryptonite \ --policy /home/superman/aws-example/public-bucket-policy.json

A client error (MalformedPolicy) occurred when calling the PutBucketPolicy 
   operation: Policies must be valid JSON and the first byte must be '{'


现在让我们添加file://前缀,它将起作用

$ s3api put-bucket-policy --bucket kryptonite \
    --policy file:///home/superman/aws-example/public-bucket-policy.json


我们现在可以验证是否已应用此策略

$ s3api get-bucket-policy --bucket kryptonite
{
    "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"AddPerm\",\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"s3:GetObject\",\"Resource\":\"arn:aws:s3:::kryptonite/*\"}]}"
}


作为特别的奖励,让我们通过jq实用程序(两次)管道策略以提取正确的字段并很好地格式化 JSON

$ s3api get-bucket-policy --bucket kryptonite | jq .Policy --raw-output | jq .
{
  "Statement": [
    {
      "Resource": "arn:aws:s3:::kryptonite/*",
      "Action": "s3:GetObject",
      "Principal": "*",
      "Effect": "Allow",
      "Sid": "AddPerm"
    }
  ],
  "Version": "2012-10-17"
}


如您所见,该政策是正确的

于 2015-12-20T00:44:54.883 回答
0

我已经使用了 JSON。

对于最终到达这里的人来说,可能会有一些有用的提示。

  1. 存储桶名称:存储桶应全部小写。如果没有,某些 s3/s3api 操作可以工作(mbput-bucket-policy),但其他操作无效(put-bucket-website)请参阅http://support.rightscale.com/09-Clouds/AWS/FAQs/FAQ_0094_- _What_are_valid_S3_bucket_names%3F

  2. 如果像我一样,您首先在通过 S3 控制台创建的存储桶上使用get-bucket-website来获取示例 JSON 以使存储桶成为网站,那么它可能不起作用。get-bucket-website为您返回任何未设置参数的空白条目(例如RedirectAllRequestsTo) - 如果在put-bucket-website中使用它会给出错误...

    {"IndexDocument":{"Suffix":"index.html"}}

是最小值。(如果内联,请记住转义引号!)

于 2013-10-23T11:36:08.427 回答
0

对于“完全内联”语法,请使用:

aws s3api put-bucket-policy --bucket MYBUCKETNAME --policy "{\"Version\":\"2008-10-17\", \"Statement\":[{\"Sid\":\"AllowPublicRead\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"*\"},\"Action\":\"s3:GetObject\",\"Resource\":\"arn:aws:s3:::MYBUCKETNAME/*\"}]}"
于 2017-04-19T15:19:18.237 回答