AWS CodePipeline部署Lambda时S3 ListBucket权限错误解决
以下是针对性的排查和修正步骤:
检查IAM策略的资源范围是否匹配
s3:ListBucket操作的资源必须是桶本身的ARN(格式为arn:aws:s3:::your-bucket-name),而非桶内对象的ARN(arn:aws:s3:::your-bucket-name/*)。很多人会误把ListBucket的资源写成/*,导致权限不生效。确保IAM策略里的ListBucket语句资源是桶ARN,示例策略片段:{ "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::your-target-bucket" }确认报错的角色是否为你修改的那一个
CodePipeline的部署阶段可能使用两种角色:一是CodePipeline本身的执行角色,二是CloudFormation部署栈时使用的部署角色(如果在CDK的CfnDeployment或PipelineStage中指定了单独角色)。去CloudWatch的CodePipeline日志里查找报错的角色ARN,确认你在IAM控制台修改的是这个角色的权限。排查S3桶的Bucket Policy是否存在拒绝规则
如果目标桶配置了Bucket Policy,里面的Deny语句优先级高于IAM角色的Allow权限。检查Bucket Policy是否有拒绝该角色访问的规则,或者有条件限制(比如要求加密传输、特定IP段)导致当前请求不满足,进而导致ListBucket权限被拒绝。验证CDK部署的实际IAM策略
有时候CDK代码中的权限定义和控制台显示的不一致,比如权限被其他CDK构造覆盖、或者部署时未生效。运行cdk diff查看当前栈的变更,或者在IAM控制台导出角色的完整策略JSON,对比是否包含正确的ListBucket权限,且资源范围正确。跨账号/区域场景的额外检查
如果S3桶和CodePipeline不在同一AWS账号或区域:- 必须在桶的Bucket Policy中显式允许CodePipeline角色的访问
- 确保CodePipeline的部署请求使用了正确的区域端点,避免跨区域访问的权限问题
检查IAM策略的条件限制
如果你的IAM策略添加了Condition字段(比如aws:SourceVpc、aws:PrincipalArn等),需要确认CodePipeline的部署请求满足这些条件,否则权限不会触发。
内容的提问来源于stack exchange,提问作者219CID

