使用aws s3api时出现MalformedPolicy错误

时间:2013-10-21 14:13:25

标签: amazon-web-services amazon-s3

我正在尝试使用 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操作可以正常工作,但其他操作则不然。见here

3 个答案:

答案 0 :(得分:8)

TL; DR


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

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


或( Windows


$ 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"
}


正如您所看到的,该政策是正确的

答案 1 :(得分:0)

我已经使用了JSON。

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

  1. 存储桶名称:存储桶应全部以小写命名。如果没有,某些s3 / s3api操作可用( mb put-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”:{ “后缀”: “的index.html”}}

  3. 是最低限度。 (如果内联,请记得逃避引号!)

答案 2 :(得分: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/*\"}]}"