如何修复IBM Cloud COS上传对象时NoCredentialProviders报错
问题修复方案
根因说明
你为第二个自定义缓冲配置的上传器新建的sess1会话,没有关联预先配置了IBM IAM凭证、COS服务端点的conf配置对象,该会话默认会从环境变量、本地配置文件等位置拉取凭证,找不到有效凭证就会抛出NoCredentialProviders错误。
核心修复点
修改sess1的创建逻辑,传入已完成配置的conf对象,让新会话继承COS访问所需的所有配置:
错误代码:
sess1 := session.Must(session.NewSession())
修正后代码:
sess1 := session.Must(session.NewSession(conf))
完整可运行代码
package main import ( "bytes" "fmt" "net/http" "os" "time" "github.com/IBM/ibm-cos-sdk-go/aws" "github.com/IBM/ibm-cos-sdk-go/aws/credentials/ibmiam" "github.com/IBM/ibm-cos-sdk-go/aws/session" "github.com/IBM/ibm-cos-sdk-go/service/s3" "github.com/IBM/ibm-cos-sdk-go/service/s3/s3manager" ) var ( apiKey = os.Getenv("MY_COS_IBM_KEY_TEMP") serviceInstanceID = os.Getenv("MY_SVC_IBM_INST_ID_TEMP") authEndpoint = "https://iam.cloud.ibm.com/identity/token" serviceEndpoint = "https://s3.us.cloud-object-storage.appdomain.cloud" ) func main() { oldBucket := "pixmedia" newBucket := "mediaflixibm" newColdBucket := "newmediaflixibmx" conf := aws.NewConfig(). WithEndpoint(serviceEndpoint). WithCredentials(ibmiam.NewStaticCredentials(aws.NewConfig(), authEndpoint, apiKey, serviceInstanceID)). WithS3ForcePathStyle(true) sess := session.Must(session.NewSession()) client := s3.New(sess, conf) input := &s3.CreateBucketInput{ Bucket: aws.String(newBucket), } client.CreateBucket(input) input2 := &s3.CreateBucketInput{ Bucket: aws.String(newColdBucket), CreateBucketConfiguration: &s3.CreateBucketConfiguration{ LocationConstraint: aws.String("us-geo"), }, } output, err := client.CreateBucket(input2) fmt.Println(output) fmt.Println(err) d, err := client.ListBuckets(&s3.ListBucketsInput{}) fmt.Println(d) fmt.Println(err) // 读取待上传文件 file, err := os.Open("/Users/kumargaurav/Downloads/test.png") if err != nil { fmt.Printf("err opening file: %s", err) return } defer file.Close() fileInfo, _ := file.Stat() size := fileInfo.Size() buffer := make([]byte, size) file.Read(buffer) // 第一次上传:默认配置上传器 var key = "ob-xx" upParams := &s3manager.UploadInput{ Body: bytes.NewReader(buffer), Bucket: &oldBucket, Key: &key, } uploader := s3manager.NewUploader(sess) res, err := uploader.Upload(upParams) fmt.Println("Res is", res) fmt.Println("Error is ", err) // 第二次上传:自定义缓冲配置上传器 // 核心修复:创建会话时传入conf配置 sess1 := session.Must(session.NewSession(conf)) uploader1 := s3manager.NewUploader(sess1, func(u *s3manager.Uploader) { u.BufferProvider = s3manager.NewBufferedReadSeekerWriteToPool(25 * 1024 * 1024) }) ures, err := uploader1.Upload(&s3manager.UploadInput{ Bucket: aws.String("pixmedia"), Key: aws.String("ob-xx"), Body: bytes.NewReader(buffer), }) if err != nil { fmt.Println(err.Error()) return } fmt.Println("URes is", ures) fmt.Println("Uerr is", err) }
额外优化说明
原代码中第一次上传构造的upParams包含大量无意义的空值字段,不需要配置的参数直接省略即可,避免触发COS接口不必要的校验逻辑。
内容的提问来源于stack exchange,提问作者Pixzium Media
相关产品推荐
相关产品推荐

