簡體   English   中英

使用aws s3api時出現MalformedPolicy錯誤

[英]MalformedPolicy error using aws s3api

我正在嘗試使用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操作可以正常工作,但其他操作則不然。 看到這里

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設置公共存儲桶策略

首先,讓我們確保沒有其他政策:

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


現在讓我們確保我們在當前目錄中有策略文件,它包含有效的json( kryptonite bucket的頭腦名稱)

 $ 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

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


現在讓我們添加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" } 


正如您所看到的,政策是正確的

我已經使用了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”:{ “后綴”: “index.html的”}}

是最低限度的。 (如果內聯,請記得逃避引號!)

對於“完整內聯”語法,請使用:

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/*\"}]}"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM