![](/img/trans.png)
[英]How to apply acl policies using aws s3api to subfolders in S3 bucket
[英]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操作可以正常工作,但其他操作則不然。 看到這里
您必須將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
首先,讓我們確保沒有其他政策:
$ 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。
對於那些最終來到這里的人來說,幾個可能有用的提示。
存儲桶名稱:存儲桶應全部以小寫命名。 如果沒有,一些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
如果像我一樣,你開始在通過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.