Goland中AWS SDK无法从~/.aws/credentials加载凭证求助
我使用credentials.NewEnvCredentials()时,误以为它能读取~/.aws/credentials文件里的凭证信息,但代码报错找不到AWS_ACCESS_KEY_ID或AWS_SECRET_ACCESS_KEY。手动将这两个变量添加到Goland运行配置的环境变量中后,连接可以成功建立。但出于部署需求,我需要直接读取~/.aws/credentials文件中的值。我曾在Goland终端手动导出这两个变量,但Goland并未识别。目前只有硬编码AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY及会话令牌能正常运行,但这并非我的目标,我更希望只需指定AWS配置文件(profile)即可。
相关代码如下:
var DefaultTransport http.RoundTripper = &http.Transport{ Dial: (&net.Dialer{ Timeout: 30 * time.Second, KeepAlive: 30 * time.Second, }).Dial, TLSHandshakeTimeout: 10 * time.Second, } credentialsEnv := credentials.NewEnvCredentials() signer := v4.NewSigner(credentialsEnv) client := &http.Client{Transport: DefaultTransport} signedClient, signerError := aws_signing_client.New(signer, client, "es", "us-east-1") if signerError != nil { fmt.Errorf("Unable to create aws signed http transport client object: %v", signerError) } opensearchConfig := opensearch.Config{ Addresses: parameters.Addresses, //Username: parameters.Username, //Password: parameters.Password, //Username: "mercury", //Password: "", Transport: signedClient.Transport, //Transport: tp, } opensearchClient, err := opensearch.NewClient(opensearchConfig) fmt.Println(opensearchClient.Info())
改用文件凭证提供者
credentials.NewEnvCredentials()仅从环境变量读取凭证,不会解析~/.aws/credentials文件。要读取该文件,改用credentials.NewSharedCredentials():// 不传第二个参数默认读取default profile,也可指定自定义profile名称 creds := credentials.NewSharedCredentials("", "your-profile-name") signer := v4.NewSigner(creds)更推荐使用AWS SDK的默认凭证链(自动依次查找环境变量、
~/.aws/credentials、IAM角色等),通过会话对象实现:sess := session.Must(session.NewSessionWithOptions(session.Options{ Profile: "your-profile-name", // 指定profile,留空则用default })) signer := v4.NewSigner(sess.Config.Credentials)解决Goland终端环境变量不生效问题
Goland终端继承IDE启动时的环境变量,手动在终端导出变量后,需重启Goland让IDE重新加载环境;也可直接在Goland的运行配置中添加环境变量,或在~/.bashrc/~/.zshrc中配置后重启IDE。最佳实践
不要硬编码凭证,始终依赖AWS SDK默认凭证链,让代码在本地、EC2、EKS等环境自动适配;若需指定profile,通过环境变量AWS_PROFILE设置,或在代码中指定,避免硬编码。
内容的提问来源于stack exchange,提问作者wubbalubba

