调用 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 '{'

提问人:GrahamMc 提问时间:11/17/2023 最后编辑:GrahamMc 更新时间:11/17/2023 访问量:18

问:

我正在尝试使用 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 网络服务 亚马逊 S3 AWS-CLI

评论


答:

0赞 GrahamMc 11/17/2023 #1

事实证明,问题出在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。