通过AWS Lambda认证K8s集群遇401未授权问题求助
问题分析与解决方案
不需要手动生成~/.aws/credentials或config文件,Lambda运行时会自动通过IAM执行角色获取临时凭证,401错误的根源不在本地凭证文件,而是以下几个关键问题:
1. 修复EKSAuth的区域参数传递错误
你的Lambda代码中指定了区域为us-east-2,但初始化EKSAuth时未传入该区域,使用了默认的us-east-1,导致生成的STS签名区域与集群区域不匹配,直接引发认证失败。
修改调用代码:
eks = auth.EKSAuth(CLUSTER_NAME, region=REGION)
2. 配置EKS集群的IAM权限映射(核心)
EKS集群无法自动识别Lambda的执行角色,必须将角色ARN添加到EKS的aws-auth ConfigMap中,完成IAM身份到K8s用户/组的映射:
- 获取当前
aws-auth配置:
kubectl get configmap aws-auth -n kube-system -o yaml
- 添加Lambda执行角色到
mapRoles字段(替换占位符为你的实际信息):
mapRoles: - rolearn: arn:aws:iam::你的AWS账号ID:role/你的Lambda执行角色名称 username: lambda-eks-user groups: - system:masters # 或自定义的有权限的组,不建议直接用system:masters,推荐创建专用组
- 更新ConfigMap:
kubectl apply -f aws-auth-updated.yaml
3. 配置K8s RBAC权限
即使IAM角色完成映射,还需要给对应的K8s用户/组分配访问Pod的权限:
创建一个ClusterRole和ClusterRoleBinding(保存为lambda-rbac.yaml):
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: lambda-pod-reader rules: - apiGroups: [""] resources: ["pods"] verbs: ["list", "get"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: lambda-pod-reader-binding subjects: - kind: User name: lambda-eks-user # 对应aws-auth中配置的username apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: lambda-pod-reader apiGroup: rbac.authorization.k8s.io
应用配置:
kubectl apply -f lambda-rbac.yaml
4. 验证Lambda执行角色的基础权限
确保Lambda的IAM执行角色已包含以下权限(通过IAM控制台配置):
eks:DescribeCluster:用于获取集群端点和证书信息sts:GetCallerIdentity:用于生成EKS认证token(该权限默认包含在基础执行角色中,若被限制需手动添加)
5. 简化kubeconfig配置(可选)
当前kubeconfig中的users字段配置无效(user: 'lambda'不是合法格式),可以简化为:
kube_content['users'] = [ { 'name': 'aws', 'user': {} } ]
因为后续代码已经手动设置了token,kubeconfig的用户配置仅作为占位符即可。
内容的提问来源于stack exchange,提问作者jipot
相关产品推荐
相关产品推荐

