VSCode调试Golang连接AWS DynamoDB时遇EC2 IMDS传输错误
AWS SDK Go v2连接DynamoDB凭证问题排查
项目环境
使用的AWS SDK Go v2相关包版本:
github.com/aws/aws-sdk-go-v2 v1.18.0github.com/aws/aws-sdk-go-v2/config v1.18.18github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.19github.com/aws/aws-sdk-go-v2/service/dynamodb v1.19.2
已将AWS凭证正确放置在~/.aws/credentials文件中,凭证在AWS CLI中可正常使用,执行aws s3 ls --profile <profile_name>能得到预期输出。~/.zshrc文件中已配置环境变量AWS_PROFILE=stage。
问题描述
在VSCode中调试该Golang项目时,项目可正常构建运行,但每次执行DynamoDB查询都会报错:
operation error DynamoDB: Query, get identity: get credentials: failed to refresh cached credentials, no EC2 IMDS role found, operation error ec2imds: GetMetadata, expect HTTP transport, got
已尝试操作
- 轮换了AWS凭证
- 将aws-sdk-go-v2下的所有包及子包更新至最新版本
解决方案
1. 确保VSCode调试环境加载AWS_PROFILE
VSCode默认调试进程不会自动读取~/.zshrc中的环境变量,可通过以下方式解决:
- 从zsh终端启动VSCode:执行
code .,调试时会继承终端的环境变量 - 在VSCode的
launch.json中手动添加环境变量:{ "version": "0.2.0", "configurations": [ { "name": "Launch", "type": "go", "request": "launch", "mode": "auto", "program": "${fileDirname}", "env": { "AWS_PROFILE": "stage" } } ] }
2. 代码中显式指定加载的Profile
在加载AWS配置时,明确指定要使用的Profile,避免SDK自动查找凭证逻辑出错:
import ( "context" "github.com/aws/aws-sdk-go-v2/config" ) func loadAWSConfig() (config.Config, error) { return config.LoadDefaultConfig(context.TODO(), config.WithSharedConfigProfile("stage"), ) }
3. 禁用EC2 IMDS凭证查找
若代码不会在EC2实例上运行,可在加载配置时禁用EC2元数据服务(IMDS)的凭证源,避免SDK尝试从该服务获取凭证:
cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithSharedConfigProfile("stage"), config.WithEC2IMDSRegion(""), // 禁用IMDS凭证查找 )
4. 显式设置HTTP客户端
报错提示expect HTTP transport, got <nil>,可能是配置加载时HTTP客户端未正确初始化,可显式设置HTTP transport:
import ( "context" "net/http" "github.com/aws/aws-sdk-go-v2/config" ) func loadAWSConfig() (config.Config, error) { return config.LoadDefaultConfig(context.TODO(), config.WithSharedConfigProfile("stage"), config.WithHTTPClient(&http.Client{}), ) }
内容的提问来源于stack exchange,提问作者Sayan Sil
相关产品推荐
相关产品推荐

