You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 09:12:01