我尝试使用 AWS CLI 将策略附加到 S3 存储桶,并使用包含策略作为输入的 JSON 文件。我的命令是:
aws s3api put-bucket-policy --bucket myBucketName --policy file://policy.json
但是,我不断收到此错误:
An error occurred (MalformedPolicy) when calling the PutBucketPolicy operation: Policies must be valid JSON and the first byte must be '{'
策略文件的内容是:
{
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::redacted:role/redacted"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::myBucketName/*"
}
]
}
我的 JSON 文件格式似乎正确。第一个字节肯定是“{”。文件路径非常简单,文件位于使用cli的当前工作目录中。 “{”之前没有空格或其他字符。这是我第一次收到此错误。我之前已经成功上传并应用了其他策略。但这项政策失败了。
我比较了之前成功的政策内容,没有发现任何明显的错误。
为了保持理智,我将策略更改为仅是一个左大括号 { } ,没有任何内容,并且我得到了相同的错误。
请注意,所显示的 JSON 中的 arn 已被编辑,但我已确认它对于我的帐户来说是正确的;这个问题似乎与arn无关。
我还看到了这个相关问题:AWS S3 Bucket 给出“策略必须是有效的 JSON 并且第一个字节必须是 '{' 本例的解决方案是在左大括号“{”之前包含空格。我的情况并非如此。
另外,我尝试添加“版本”字段,但这并没有修复错误(“版本”:“2008-10-17”,)
进一步更新:我尝试使用 AWS 管理控制台应用该策略。完全相同的 JSON 保存并成功应用!现在怎么办?
为什么这个 JSON 策略文件无效?
原来问题出在 JSON 文件的编码上。该文件是由 Powershell 脚本生成的;在我没有意识到的情况下,Powershell 的编码是 UTF-16 LE BOM。
更改创建 .json 文件的语句以使用 ANSII 编码修复了问题:
输出文件-FilePath“policy.json”-InputObject $policy -编码ansii
我怀疑 AWS CLI 使用 UTF-8 编码,并且对 UTF-16 LE BOM 格式不满意。
如果您收到此错误,并且您确定 JSON 文件以“{”开头,请确保文件的字符编码设置为 UTF-8 或 ANSII。