AWS CodePipeline部署阶段S3 ListBucket会话权限错误求助
CodePipeline部署步骤报S3 ListBucket权限错误(已通过IAM模拟器验证权限仍未解决)
问题描述
通过CloudFormation创建了包含三个步骤的AWS CodePipeline:拉取GitHub源码、CodeBuild构建、CloudFormation部署,但部署步骤失败,报错如下:
User: arn:aws:sts::AccountID:assumed-role/drive-tracker-cicd-prod-CodePipelineRole-QnWs78DD8pmv/1730118657170 is not authorized to perform: s3:ListBucket on resource: "arn:aws:s3:::drive-tracker-prod-artifacts" because no session policy allows the s3:ListBucket action (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: Z7135KF3QJY8W53J; S3 Extended Request ID: N+tgLvQdEVUmRhbMJBh+vPIP7X1W+sIVBwzZg8sEjqRgR3ZxHuxi2+QOjpBkkdLyb+hxBkZGQjU=; Proxy: null)
已通过IAM PolicySimulator验证CodePipelineRole和CodeDeployRole对工件存储桶拥有s3:ListBucket权限,添加了KMS密钥访问权限,且确认CodePipelineRole可扮演CodeDeployRole,但错误仍未解决。相关CloudFormation模板见问题原文。
根本原因分析
- CodePipelineRole策略包含无效S3动作:在CodePipelineRole的
CodePipelineAccess策略中,S3动作列表包含不存在的s3:GetBucket动作。虽IAM会忽略单个无效动作,但部分场景下会导致策略解析异常,影响有效权限的会话传递。 - CodeBuildServiceRole存在YAML语法错误:该角色的S3权限Statement重复定义
Resource字段,第二个Resource: '*'覆盖了前面的特定桶资源配置,此问题虽不直接触发当前报错,但会造成过度授权的安全风险。 - 宽泛的sts:AssumeRole权限引发会话策略冲突:CodePipelineRole的策略中允许
sts:AssumeRole作用于所有资源(Resource: '*'),当CodePipeline服务扮演该角色时,自动生成的会话权限范围可能被异常限制。
解决步骤
- 修复CodePipelineRole的S3动作配置
移除无效的s3:GetBucket动作,替换为实际需要的桶级动作(如s3:GetBucketLocation)或直接删除,修改后的S3权限Statement如下:
- Effect: Allow Action: - s3:PutObject - s3:GetObject - s3:GetBucketLocation - s3:ListBucket Resource: - !Join - '' - - 'arn:aws:s3:::' - !Ref PipelineArtifactBucket - !Join - '' - - 'arn:aws:s3:::' - !Ref PipelineArtifactBucket - /*
- 修复CodeBuildServiceRole的YAML语法错误
删除重复的Resource: '*'行,确保S3权限仅针对目标工件桶:
- Effect: Allow Action: - s3:PutObject - s3:GetObject* - s3:GetBucket* - s3:ListBucket Resource: - !Join - '' - - 'arn:aws:s3:::' - !Ref PipelineArtifactBucket - !Join - '' - - 'arn:aws:s3:::' - !Ref PipelineArtifactBucket - /*
- 限制CodePipelineRole的sts:AssumeRole权限范围
将sts:AssumeRole的资源范围缩小为仅允许扮演CodeDeployRole,遵循最小权限原则:
- Effect: Allow Action: - sts:AssumeRole Resource: !GetAtt CodeDeployRole.Arn
- 重新部署并验证
更新CloudFormation模板后重新部署,确保角色策略生效,随后触发CodePipeline重试部署步骤。
内容的提问来源于stack exchange,提问作者Nieber
相关产品推荐
相关产品推荐

