AWS SAM模板更新S3 Bucket Policy时提示无效资源(MalformedPolicy)问题求助
解决AWS SAM S3桶策略的MalformedPolicy错误
我来帮你定位问题根源——你遇到的MalformedPolicy错误,核心是S3动作与对应的资源ARN不匹配。S3的桶级动作和对象级动作需要对应不同的资源范围,不能混在一起用。
问题分析
S3的权限动作分为两类:
- 桶级动作:比如
s3:ListBucket,这类动作只能作用于桶本身(ARN格式:arn:aws:s3:::bucket-name),不能带/*或者末尾斜杠。 - 对象级动作:比如
s3:GetObject、s3:PutObject、s3:DeleteObject,这类动作作用于桶内的对象,对应的ARN格式是arn:aws:s3:::bucket-name/*。
你当前的策略把所有动作都绑定了两个资源(桶和对象ARN),导致s3:ListBucket这个桶级动作被错误地关联到了对象资源,触发了格式错误。
修正后的SAM模板
把策略拆分成两个Statement,分别对应桶级和对象级权限:
BucketPolicy: Type: AWS::S3::BucketPolicy Properties: Bucket: !Ref MyWebsite PolicyDocument: Id: MyPolicy Version: 2012-10-17 Statement: # 处理桶级的ListBucket权限 - Sid: BucketListAccess Effect: Allow Principal: "*" Action: 's3:ListBucket' Resource: "arn:aws:s3:::my-resume-wesite123456" # 处理对象级的读写删权限 - Sid: ObjectReadWriteDeleteAccess Effect: Allow Principal: "*" Action: - 's3:GetObject' - 's3:PutObject' - 's3:DeleteObject' Resource: "arn:aws:s3:::my-resume-wesite123456/*"
额外建议
- 灵活引用桶ARN:建议用
!Sub来动态生成ARN,避免硬编码桶名,比如把资源写成:
和Resource: !Sub "arn:aws:s3:::${MyWebsite}"
这样后续修改桶名时不用手动更新策略。Resource: !Sub "arn:aws:s3:::${MyWebsite}/*" - 权限安全风险:当前策略用
*作为Principal,意味着任何人都能读写删除你桶里的内容,生产环境一定要限制为特定的IAM用户/角色,不要使用通配符。 - 桶名拼写:注意你桶名里的
wesite是website的笔误,虽然已经成功创建桶,但后续建议修正避免混淆。
内容的提问来源于stack exchange,提问作者sjb_1981
相关产品推荐
相关产品推荐

