使用boto3为S3 bucket配置公共访问策略时反复出现MalformedPolicy错误
错误原因
- 核心问题出在
put_bucket_policy方法的传参错误:你给Policy参数传入的是加了单引号的字面量字符串'policy_file.read()',而非文件读取后得到的实际策略内容。这时候传给S3的内容首字符是字母p,自然不符合策略首字节必须为{的要求。 - 同时你给
Bucket参数传入的是硬编码的字符串'bucket_name',不是你预先定义好的存储桶名称变量bucket_name,即便策略问题修复后也会出现找不到存储桶的错误。
修复后的实现代码
import boto3 import json S3API = boto3.client("s3", region_name="regionname") bucket_name = "bucketname" # 使用with上下文管理器读取文件,自动处理资源释放 with open("../public_policy.json", "r", encoding="utf-8") as policy_file: policy_content = policy_file.read() S3API.put_bucket_policy( Bucket = bucket_name, Policy = policy_content )
可选校验步骤
如果修改后仍报错,可按以下顺序排查:
- 执行代码前先打印
policy_content的首字符,确认返回值为{,排除本地JSON文件存在前导空白、BOM头或者编码错误的问题。 - 用
json.loads(policy_content)测试JSON内容能否正常解析,提前发现策略本身的语法错误。
内容的提问来源于stack exchange,提问作者lade
相关产品推荐
相关产品推荐

