使用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提供商已正确创建:
该值需与IAM角色信任策略中的OIDC提供商地址完全一致aws eks describe-cluster --name <集群名称> --query "cluster.identity.oidc.issuer" --output text
内容的提问来源于stack exchange,提问作者Ajay Kumar
相关产品推荐
相关产品推荐

