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

使用Golang AWS SDK v2在EKS Fargate中访问SSM参数存储报错排查

解决EKS Fargate上Go SDK v2调用SSM参数存储的凭证问题

问题原因

EKS Fargate不支持EC2实例元数据服务(IMDS),你的服务在Worker Node上能正常运行是因为Worker Node依赖EC2实例角色获取凭证,而Fargate必须通过**IAM Roles for Service Accounts(IRSA)**机制获取权限凭证,当前SDK无法自动识别并加载IRSA凭证,导致出现找不到IMDS角色的超时错误。

修复步骤

1. 确认IRSA配置有效性

  • 验证Pod关联的ServiceAccount已绑定指定IAM执行角色:
    kubectl describe serviceaccount <你的ServiceAccount名称> -n <命名空间>
    
    检查输出的Annotations字段是否包含eks.amazonaws.com/role-arn: arn:aws:iam::<AWS账号ID>:role/<你的Pod执行角色>
  • 确认IAM角色的信任策略允许该ServiceAccount的OIDC身份:
    信任策略需包含类似规则:
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::<AWS账号ID>:oidc-provider/oidc.eks.<集群区域>.amazonaws.com/id/<OIDC提供商ID>"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "oidc.eks.<集群区域>.amazonaws.com/id/<OIDC提供商ID>:sub": "system:serviceaccount::<命名空间>:<ServiceAccount名称>"
            }
          }
        }
      ]
    }
    
  • 再次确认IAM角色权限包含ssm:GetParameter动作(确保权限策略无遗漏)

2. 调整Go SDK配置

Go SDK v2的LoadDefaultConfig默认会自动检测IRSA环境,但需确保以下配置:

  • 显式指定AWS区域(避免默认区域未正确加载)
  • 确保SDK能访问Fargate自动挂载的Web Identity Token路径(默认路径:/var/run/secrets/eks.amazonaws.com/serviceaccount/token)

修改getClient函数,添加区域指定:

func getClient() aws.Config {
    cfg, err := awsconfig.LoadDefaultConfig(context.TODO(),
        awsconfig.WithRegion("<你的EKS集群区域>"), // 替换为实际区域,如us-east-1
    )
    if err != nil {
        panic("configuration error, " + err.Error())
    }

    return cfg
}

若上述修改无效,可显式指定Web Identity凭证提供者作为兜底方案:

import (
    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/credentials/webidentity"
)

func getClient() aws.Config {
    tokenPath := "/var/run/secrets/eks.amazonaws.com/serviceaccount/token"
    roleARN := "<你的Pod执行角色ARN>" // 如arn:aws:iam::1234567890:role/fargate-ssm-access-role

    creds, err := webidentity.NewCredentialProvider(context.TODO(),
        tokenPath,
        roleARN,
    )
    if err != nil {
        panic("failed to create web identity credentials: " + err.Error())
    }

    cfg, err := config.LoadDefaultConfig(context.TODO(),
        config.WithRegion("<你的EKS集群区域>"),
        config.WithCredentialsProvider(creds),
    )
    if err != nil {
        panic("configuration error, " + err.Error())
    }

    return cfg
}

3. 验证并重启Pod

  • 确认Pod的Deployment/YAML中已指定正确的ServiceAccount:
    spec:
      serviceAccountName: <你的ServiceAccount名称>
    
  • 重启Pod使配置生效:
    kubectl rollout restart deployment <你的Deployment名称> -n <命名空间>
    

额外排查点

  • 检查网络策略是否限制Pod访问AWS STS服务:Fargate Pod默认允许访问sts.<区域>.amazonaws.com,若有自定义网络策略,需确保放行该域名
  • 确认EKS集群的OIDC提供商已正确创建:
    aws eks describe-cluster --name <集群名称> --query "cluster.identity.oidc.issuer" --output text
    
    该值需与IAM角色信任策略中的OIDC提供商地址完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 07:00:16