Python Lambda连接EKS集群报403权限错误求助
问题分析与解决方案
1. 先解决"[Errno 2] No such file or directory: 'aws'"错误
Lambda默认运行环境不带AWS CLI,如果你代码里直接调用aws eks get-token这类CLI命令,必然会报错。推荐两种替代方案:
- 用boto3直接生成EKS认证token:不需要依赖CLI,代码更轻量。示例片段:
import boto3 from kubernetes import client, config def get_eks_auth_token(cluster_name): eks_client = boto3.client('eks') # 调用EKS API获取token(要求boto3版本>=1.20.0) token_result = eks_client.get_token(clusterName=cluster_name) return token_result['status']['token'] def setup_k8s_client(cluster_name, cluster_endpoint): token = get_eks_auth_token(cluster_name) k8s_config = client.Configuration() k8s_config.host = cluster_endpoint k8s_config.verify_ssl = True # 根据你的集群SSL配置调整 k8s_config.api_key = {"authorization": f"Bearer {token}"} client.Configuration.set_default(k8s_config)
- 附加包含AWS CLI的Lambda层:如果一定要用CLI,可以打包AWS CLI成Lambda层挂载到函数上,但不如boto3方案高效。
2. 解决403 Forbidden(system:anonymous)错误
这个错误核心是Lambda角色没被EKS正确识别,即使更新了aws-auth ConfigMap,也可能存在以下问题:
- 检查aws-auth ConfigMap配置是否正确:确保Lambda角色ARN完全匹配,格式不能错。示例正确配置片段:
apiVersion: v1 kind: ConfigMap metadata: name: aws-auth namespace: kube-system data: mapRoles: | - groups: - system:masters rolearn: arn:aws:iam::123456789012:role/你的Lambda执行角色ARN username: lambda-eks-admin
更新后执行kubectl apply -f aws-auth.yaml,等待1-2分钟让配置生效。
- 确认Lambda角色的信任策略:必须允许Lambda服务承担该角色,信任策略示例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
- 验证token对应的身份:用Lambda角色生成token后,测试是否能正常认证:
# 用Lambda角色ARN生成token aws eks get-token --cluster-name 你的集群名 --role-arn Lambda角色ARN # 用token访问集群API,检查是否返回正确身份 curl -H "Authorization: Bearer <生成的token>" https://你的集群端点/api/v1/namespaces/f-design/pods
- 检查VPC安全组规则:Lambda安全组要允许出站访问EKS API的443端口;EKS集群的安全组要允许来自Lambda安全组的443端口入站流量。
3. 额外排查点
- 确保Lambda执行角色有
eks:DescribeCluster权限,否则无法获取集群信息和生成token。 - 确认K8s RBAC没有覆盖
system:masters的权限(默认该组有全集群权限,除非自定义了更严格的规则)。 - 检查Kubernetes Python客户端版本和EKS集群版本是否兼容,避免API版本不匹配导致的异常。
内容的提问来源于stack exchange,提问作者Ravi
相关产品推荐
相关产品推荐

