提问人:GrahamMc 提问时间:11/17/2023 最后编辑:GrahamMc 更新时间:11/17/2023 访问量:18
调用 PutBucketPolicy 接口上传策略 JSON 时的 MalformedPolicy:策略必须是有效的 JSON,并且第一个字节必须为“{”
MalformedPolicy when calling the PutBucketPolicy operation to upload a policy JSON: Policies must be valid JSON and the first byte must be '{'
问:
我正在尝试使用 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 的工作目录中。“{”之前没有空格或其他字符。这是我第一次收到此错误。在此之前,我已经成功上传并应用了其他策略。不过,这项政策是失败的。
我比较了以前成功的政策的内容,没有看到任何明显的我做错了什么。
为了理智起见,我将策略更改为只是一个没有任何内容的打开和关闭大括号 { },我得到了同样的错误。
请注意,arn 已在显示的 JSON 中被编辑,但我已确认它对我的帐户是正确的;该问题似乎与 ARN 无关。
我还看到了这个相关问题:AWS S3 存储桶给出“策略必须是有效的 JSON,第一个字节必须是”{“ 在这种情况下,解决方案是在左大括号”{“之前包含空格。我的情况并非如此。
另外,我尝试添加“版本”字段,但这并没有修复错误(“版本”:“2008-10-17”,)
进一步更新:我尝试使用 AWS 管理控制台应用策略。完全相同的 JSON 保存并成功应用!现在怎么办?
为什么此 JSON 策略文件无效?
答:
事实证明,问题出在JSON文件的字符编码上。
该文件由 Powershell 脚本生成;在我意识到的情况下,Powershell 的编码是 UTF-16 LE BOM。
将创建 .json 文件的语句更改为使用 ANSII 编码解决了以下问题:
Out-File -FilePath “policy.json” -InputObject $policy -编码 ansii
我怀疑 AWS CLI 使用 UTF-8 编码,并且对 UTF-16 LE BOM 格式不满意。
如果收到此错误,并且确定 JSON 文件以“{”开头,请确保文件的字符编码设置为 UTF-8 或 ANSII。
评论