EKS中使用角色注解ServiceAccount时AWS SDK凭证缺失问题排查
EKS Pod IAM角色认证调试方案
我们通过带角色注解的ServiceAccount让Pod获取IAM角色用于AWS SDK认证,该配置在旧集群正常,但新集群使用AWS SDK v2 SQS客户端时出现错误:
Missing credentials in config, if using AWS_CONFIG_FILE, set AWS_SDK_LOAD_CONFIG=1
已确认Pod环境变量、ServiceAccount注解、Deployment关联、IAM信任关系配置均符合要求,但JavaScript SDK未读取到AWS_WEB_IDENTITY_TOKEN_FILE中的凭证,以下是可用于调试的日志及验证方法:
一、AWS SDK v2 内置调试日志
- 启用SDK调试模式:在Pod环境变量中添加
AWS_DEBUG_LOG=true,或在代码中设置客户端日志级别为trace:
该日志会输出SDK获取凭证的完整流程,包括是否尝试读取令牌文件、STS调用的请求/响应细节。const { SQSClient } = require("@aws-sdk/client-sqs"); const client = new SQSClient({ logger: { trace: (msg) => console.log(msg), debug: (msg) => console.log(msg), }, });
二、Pod内部文件与权限验证
- 进入Pod内部,检查令牌文件的存在性与可读性:
若文件不存在或权限不足,需查看节点kubelet日志排查挂载问题:# 查看文件权限与状态 ls -l /var/run/secrets/eks.amazonaws.com/serviceaccount/token # 验证文件可读取(注意:令牌内容敏感,请勿泄露) cat /var/run/secrets/eks.amazonaws.com/serviceaccount/token
重点查找与# 查看kubelet实时日志(适配containerd等容器运行时) journalctl -u kubelet -faws-iam-token挂载相关的错误信息,如挂载失败、权限配置异常。
三、EKS Pod Identity Webhook 日志
如果新集群使用EKS Pod Identity组件(而非旧版kube-aws-iam-controller),查看webhook日志:
# 获取webhook Pod列表 kubectl get pods -n kube-system -l app.kubernetes.io/name=eks-pod-identity-webhook # 查看实时日志 kubectl logs <webhook-pod-name> -n kube-system -f
日志会显示是否成功处理ServiceAccount注解,是否为Pod注入了正确的环境变量与挂载卷。
四、手动STS调用测试日志
在Pod内部手动调用STS的AssumeRoleWithWebIdentity接口,验证凭证获取流程:
# 安装curl和jq(若Pod中未预装) apt-get update && apt-get install -y curl jq # 发起STS调用 curl -X POST "https://sts.us-east-1.amazonaws.com/" \ -d "Action=AssumeRoleWithWebIdentity" \ -d "Version=2011-06-15" \ -d "RoleArn=arn:aws:iam::**************:role/dev-node-api" \ -d "RoleSessionName=test-session" \ -d "WebIdentityToken=$(cat /var/run/secrets/eks.amazonaws.com/serviceaccount/token)"
调用失败时,返回的错误信息会直接定位问题(如信任关系不匹配、令牌无效等)。
五、IAM信任关系验证日志
检查信任关系中的sub字段是否与ServiceAccount的命名空间、名称完全匹配:
- 当前信任关系中
sub值为system:serviceaccount:apis:node-api-service-account,但ServiceAccount的命名空间是app,存在命名空间不匹配,需修正为system:serviceaccount:app:node-api-service-account。 - 使用AWS CLI模拟权限验证:
模拟结果会明确显示该调用是否被允许。aws iam simulate-principal-policy \ --policy-source-arn "arn:aws:iam::************:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/********************************1F61" \ --action-names "sts:AssumeRoleWithWebIdentity" \ --resource-arns "arn:aws:iam::**************:role/dev-node-api" \ --context-entries "Key=oidc.eks.us-east-1.amazonaws.com/id/********************************1F61:sub,Value=system:serviceaccount:app:node-api-service-account" \ --context-entries "Key=oidc.eks.us-east-1.amazonaws.com/id/********************************1F61:aud,Value=sts.amazonaws.com"
内容的提问来源于stack exchange,提问作者Andrew Aarestad
相关产品推荐
相关产品推荐

