You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go SDK调用AWS Cognito本地正常,K8s部署后凭证错误求助

问题诊断与解决方案

核心原因

你的代码在K8s集群中运行时出现NoCredentialProviders错误,本质是AWS SDK无法找到有效的身份凭证。本地运行正常是因为你的Fedora开发机上存在AWS凭证链的有效提供者(比如~/.aws/credentials文件、环境变量,或者开发机本身关联了IAM角色),但K8s Pod内没有配置任何可用的凭证来源。

从错误日志能看到SDK尝试了所有默认凭证提供者:

  • 环境变量:未找到AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY
  • 本地共享凭证文件:Pod内不存在~/.aws/credentials
  • EC2实例角色:K8s节点或Pod无法访问元数据服务(169.254.169.254请求超时)

解决方案

方案1:通过K8s Secrets注入环境变量(快速验证)

这是最直接的临时验证方案,将AWS凭证存储在K8s Secret中,再注入到Pod的环境变量里:

  1. 创建K8s Secret存储凭证:
kubectl create secret generic aws-creds \
  --from-literal=AWS_ACCESS_KEY_ID=你的access-key \
  --from-literal=AWS_SECRET_ACCESS_KEY=你的secret-key
  1. 在Deployment的Pod模板中注入环境变量:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: your-app
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: your-app
    spec:
      containers:
      - name: your-app
        image: your-image:tag
        env:
        - name: AWS_ACCESS_KEY_ID
          valueFrom:
            secretKeyRef:
              name: aws-creds
              key: AWS_ACCESS_KEY_ID
        - name: AWS_SECRET_ACCESS_KEY
          valueFrom:
            secretKeyRef:
              name: aws-creds
              key: AWS_SECRET_ACCESS_KEY

AWS SDK会自动读取这些环境变量,无需修改代码。

方案2:使用IAM Roles for Service Accounts(IRSA,生产推荐)

这是AWS EKS集群的最佳实践,无需管理长期凭证,Pod会自动获取临时IAM凭证:

  1. 给K8s Service Account绑定IAM角色:

    • 创建一个IAM角色,信任策略允许你的EKS OIDC提供商访问
    • 给该角色添加cognito-idp:AdminGetUser权限(权限范围需覆盖目标User Pool)
    • 在K8s中创建Service Account,通过eks.amazonaws.com/role-arn注解关联这个IAM角色
  2. 在Deployment中使用这个Service Account:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: your-app
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: your-app
    spec:
      serviceAccountName: your-irsa-sa # 关联的SA名称
      containers:
      - name: your-app
        image: your-image:tag

AWS SDK会自动通过Pod的元数据服务获取临时凭证,无需任何代码修改。

方案3:硬编码凭证(不推荐,仅用于测试)

如果只是临时测试,可以直接在代码中指定凭证(注意不要将硬编码的凭证提交到版本控制):

// 修改session创建部分
creds := credentials.NewStaticCredentials("你的access-key", "你的secret-key", "")
mySession := session.Must(session.NewSession(&aws.Config{
    Credentials: creds,
    Region:      aws.String(awsRegion),
}))

svc := cognitoidentityprovider.New(mySession, aws.NewConfig().WithCredentialsChainVerboseErrors(verbose))

额外注意事项

  • 确保你使用的AWS凭证(或IAM角色)拥有cognito-idp:AdminGetUser权限,且权限范围包含目标User Pool
  • 如果你的K8s集群不是EKS,而是自建集群,建议优先使用方案1或方案3提供凭证

内容的提问来源于stack exchange,提问作者Heath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 04:06:27