使用AWS CodeBuild读取SSM参数失败:凭据加载异常求助
我之前也碰到过完全一样的情况——非VPC配置下CodeBuild跑简单构建毫无问题,但一尝试读取SSM参数就弹出com.amazonaws.auth.InstanceProfileCredentialsProvider@5754b242: Unable to load credentials from service endpoint的错误,明明已经给服务角色加了ssm:GetParameters权限却不管用。下面是我排查和解决这个问题的几个关键方向:
先检查服务角色的信任关系
别只盯着权限策略不放,先确认角色的信任策略是否允许CodeBuild服务来扮演它。正确的信任策略应该包含这段内容:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "codebuild.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }要是信任关系配置错了,就算权限再齐全,CodeBuild也拿不到有效的角色凭据。
确认是否开启了角色自动配置选项
去CodeBuild项目的配置页面看看,有没有勾选Allow AWS CodeBuild to modify this service role so it can be used with this build project?这个选项会自动帮你补充角色所需的会话令牌相关权限,很多时候没开这个选项,就会导致非VPC环境下的凭据加载失败。排除参数本身的问题
有时候报错“凭据加载失败”,实际是参数不存在或者路径写错了导致请求被拒绝,系统误报成凭据问题。你可以用AWS CLI模拟CodeBuild的角色权限,执行aws ssm get-parameters --names "你的参数名称或路径",看看能不能正常返回参数值,先确认参数本身是可访问的。检查权限边界的限制
如果你的服务角色设置了权限边界,就算你给了ssm:GetParameters权限,权限边界也可能会拦截这个操作。进入角色的详情页面,查看“权限边界”部分,确保没有限制SSM相关的API调用。清理手动配置的AWS凭据环境变量
要是你在CodeBuild项目里手动设置过AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY这类环境变量,CodeBuild会优先使用这些凭据而非服务角色的临时凭据。如果这些手动配置的凭据无效,就会触发加载失败的报错。记得把这些不必要的环境变量删掉。
按这个顺序排查下来,大概率能解决你的问题。
内容的提问来源于stack exchange,提问作者Shorn

