调用Go语言acmpca.GetCertificate()时出现NoCredentialProviders错误求助
解决AWS ACM PCA GetCertificate()的NoCredentialProviders错误
错误分析
从报错信息来看,AWS SDK在获取凭证时依次尝试了环境变量、共享凭证文件(尝试读取/root/.aws/credentials但未找到)、EC2实例角色(无法访问元数据服务),均失败。但你明确凭证已存储在~/.aws/credentials中,核心问题大概率是代码运行用户与存储凭证的用户不一致,或者凭证文件未被SDK正确识别。
解决方案
1. 对齐代码运行用户与凭证存储用户
报错里SDK尝试读取/root/.aws/credentials,说明代码是以root用户运行的,但你的凭证存放在普通用户的~/.aws/credentials(比如/home/your-user/.aws/credentials)。可以通过两种方式解决:
- 切换到存储凭证的普通用户运行代码;
- 将凭证复制到root用户的对应目录,并设置正确权限:
mkdir -p /root/.aws cp /home/your-user/.aws/credentials /root/.aws/ chmod 600 /root/.aws/credentials
2. 显式指定凭证文件路径
在创建AWS Session时,直接指定凭证文件的绝对路径,避免依赖默认的HOME路径:
import ( "fmt" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/credentials/sharedcredentials" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/acmpca" ) func main() { // 替换为你的凭证文件实际路径和profile名称(默认是default) creds := sharedcredentials.NewCredentials("/home/your-user/.aws/credentials", "default") sess := acmpca.New(session.New(&aws.Config{ Region: aws.String("us-east-1"), Credentials: creds, })) params := &acmpca.GetCertificateInput{ CertificateArn: aws.String("ARN"), CertificateAuthorityArn: aws.String("ARN"), } resp, err := sess.GetCertificate(params) if err != nil { fmt.Println("got error := ", err.Error()) return } fmt.Printf("++++ response ++++:= %+v", resp) }
3. 验证凭证文件的格式与权限
- 确保
~/.aws/credentials格式正确:[default] aws_access_key_id = YOUR_ACCESS_KEY aws_secret_access_key = YOUR_SECRET_KEY - 必须设置严格的文件权限,禁止其他用户读取:
chmod 600 ~/.aws/credentials
4. 检查HOME环境变量
如果代码运行时的HOME环境变量被修改,SDK会找不到凭证文件。可以先打印HOME变量确认:
echo $HOME
如果输出不是存储凭证的用户家目录,需要修正HOME变量后再运行代码。
内容的提问来源于stack exchange,提问作者Prajwal Bhagat
相关产品推荐
相关产品推荐

