최신 업데이트:2025-08-18 15:54:22
이 Go SDK는 CDNetworks 오브젝트 스토리지(OS)에서 제공하는 공식 API를 기반으로 개발되었습니다.
현재 버전: v1.0.1
Go 1.7 이상 필요
아래 명령어를 실행하여 SDK를 설치하세요.
go get -u github.com/CDNetworks-Object-Storage/wcs-go-sdk-v2/wos
WosClient(WOS 클라이언트)는 CDNetworks 오브젝트 스토리지에 접근하기 위한 Go 클라이언트입니다. 버킷 및 오브젝트 등 오브젝트 스토리지의 리소스를 관리·운영할 수 있도록 다양한 인터페이스를 제공합니다.
WOS Go SDK를 사용하여 요청을 보내려면 WosClient 인스턴스를 초기화하고, 필요에 따라 클라이언트 설정 파라미터를 조정해야 합니다.
var ak = "*** 본인의 Access Key 입력 ***"
var sk = "*** 본인의 Secret Key 입력 ***"
var endpoint = "https://your-endpoint"
var regionName = "your-regionName"
wosClient, err := wos.New(ak, sk, endpoint, wos.WithRegion("your-region"))
if err == nil {
// wosClient를 이용하여 오브젝트 스토리지에 접근
// ...
// wosClient 종료
wosClient.Close()
} else {
// API 응답에서 에러 코드 및 메시지 파싱
if wosError, ok := err.(wos.WosError); ok {
fmt.Println(wosError.StatusCode)
fmt.Println(wosError.Code)
fmt.Println(wosError.Message)
} else {
fmt.Println(err)
}
}
클라이언트 생성 시 다양한 파라미터를 통해 설정을 지정할 수 있습니다. 예를 들어, 응답 헤더 수신 시간 제한을 30초로 설정하는 경우:
wosClient, err := wos.New(ak, sk, endpoint, wos.WithHeaderTimeout(30))
| 메서드 | 설명 | 권장값 |
|---|---|---|
| WithSignature(signature SignatureType) | 인증 서명 타입. 기본값은 WOS 인증(wos.SignatureWos)이며, aws-v2(wos.SignatureV2) 또는 aws-v4(wos.SignatureV4)로도 설정 가능 | N/A |
| WithSslVerifyAndPemCerts(sslVerify bool, pemCerts []byte) | 서버 인증서 검증 파라미터 설정. 기본값은 검증 안 함 | N/A |
| WithHeaderTimeout(headerTimeout int) | 응답 헤더 수신 시간(초). 기본값 60초 | 10, 60 |
| WithMaxConnections(maxIdleConns int) | 최대 대기 HTTP 연결 수. 기본값 1000 | N/A |
| WithConnectTimeout(connectTimeout int) | HTTP/HTTPS 연결 생성 시간(초). 기본값 60초 | 10, 60 |
| WithSocketTimeout(socketTimeout int) | 데이터 읽기/쓰기 시간(초). 기본값 60초 | 10, 60 |
| WithIdleConnTimeout(idleConnTimeout int) | 커넥션 풀 내 유휴(Idle) HTTP 연결 타임아웃(초). 기본값 30초 | Default |
| WithMaxRetryCount(maxRetryCount int) | 인터페이스 요청의 최대 재시도 횟수. 기본값 3회 | 1, 5 |
| WithProxyUrl(proxyUrl string) | HTTP 프록시 설정 | N/A |
| WithHttpTransport(transport *http.Transport) | 사용자 정의 Transport 설정 | Default |
| WithRequestContext(ctx context.Context) | 각 HTTP 요청에 대한 컨텍스트 설정 | N/A |
| WithMaxRedirectCount(maxRedirectCount int) | HTTP/HTTPS 요청 최대 리다이렉트 횟수. 기본값 3회 | 1, 5 |
| WithRegion(region string) | S3의 리전을 설정합니다. 콘솔의 공간 개요에 표시되는 regionName을 사용하세요. 자세한 내용은 Obtain Domains 참고 | regionName에 따라 설정 |
| WithPathStyle(pathStyle boolean) | 서비스 접근 시 path-style/virtual-hosted-style URL 사용 여부. 비활성화(default) 시 bucketName.endpoint 형식 URL 사용, 활성화 시 endpoint/bucketName 형식 사용 | N/A |
var ak = "*** 본인의 Access Key 입력 ***"
var sk = "*** 본인의 Secret Key 입력 ***"
var endpoint = "https://your-endpoint"
wosClient, _ := wos.New(ak, sk, endpoint, wos.WithRegion("your-region"))
input := &wos.ListBucketsInput{}
input.QueryLocation = true
output, err := wosClient.ListBuckets(input)
if err == nil {
fmt.Printf("StatusCode:%d, RequestId:%s\n", output.StatusCode, output.RequestId)
fmt.Printf("Owner.DisplayName:%s, Owner.ID:%s\n", output.Owner.DisplayName, output.Owner.ID)
for index, val := range output.Buckets {
fmt.Printf("Bucket[%d]-Name:%s,CreationDate:%s,EndPoint:%s,Region:%s\n", index, val.Name, val.CreationDate, val.Endpoint, val.Region)
}
} else {
// API 응답에서 에러 코드 및 메시지 파싱
if wosError, ok := err.(wos.WosError); ok {
fmt.Println(wosError.StatusCode)
fmt.Println(wosError.Code)
fmt.Println(wosError.Message)
} else {
fmt.Println(err)
}
}
var ak = "*** 본인의 Access Key 입력 ***"
var sk = "*** 본인의 Secret Key 입력 ***"
var endpoint = "https://your-endpoint"
wosClient, _ := wos.New(ak, sk, endpoint, wos.WithRegion("your-region"))
input := &wos.ListObjectsInput{}
input.Bucket = bucketName
// input.Prefix = "src/"
output, err := wosClient.ListObjects(input)
if err == nil {
fmt.Printf("StatusCode:%d, RequestId:%s,OwnerId:%s,OwnerName:%s,\n", output.StatusCode, output.RequestId, output.Owner.ID, output.Owner.DisplayName)
for index, val := range output.Contents {
fmt.Printf("Content[%d]-ETag:%s, Key:%s, LastModified:%s, Size:%d, StorageClass:%s\n",
index, val.ETag, val.Key, val.LastModified, val.Size, val.StorageClass)
}
} else {
// API 응답에서 에러 코드 및 메시지 파싱
if wosError, ok := err.(wos.WosError); ok {
fmt.Println(wosError.StatusCode)
fmt.Println(wosError.Code)
fmt.Println(wosError.Message)
} else {
fmt.Println(err)
}
}
var ak = "*** 본인의 Access Key 입력 ***"
var sk = "*** 본인의 Secret Key 입력 ***"
var endpoint = "https://your-endpoint"
wosClient, _ := wos.New(ak, sk, endpoint, wos.WithRegion("your-region"))
input := &wos.PutObjectInput{}
input.Bucket = bucketName
input.Key = objectKey
input.Metadata = map[string]string{"meta": "value"}
input.Body = strings.NewReader("Hello WOS")
output, err := wosClient.PutObject(input)
if err == nil {
fmt.Printf("StatusCode:%d, RequestId:%s\n", output.StatusCode, output.RequestId)
fmt.Printf("ETag:%s", output.ETag)
} else {
// API 응답에서 에러 코드 및 메시지 파싱
if wosError, ok := err.(wos.WosError); ok {
fmt.Println(wosError.StatusCode)
fmt.Println(wosError.Code)
fmt.Println(wosError.Message)
} else {
fmt.Println(err)
}
}
var ak = "*** 본인의 Access Key 입력 ***"
var sk = "*** 본인의 Secret Key 입력 ***"
var endpoint = "https://your-endpoint"
wosClient, _ := wos.New(ak, sk, endpoint, wos.WithRegion("your-region"))
input := &wos.GetObjectInput{}
input.Bucket = bucketName
input.Key = objectKey
output, err := wosClient.GetObject(input)
if err == nil {
defer output.Body.Close()
fmt.Printf("StatusCode:%d, RequestId:%s\n", output.StatusCode, output.RequestId)
fmt.Printf("StorageClass:%s, ETag:%s, ContentType:%s, ContentLength:%d, LastModified:%s\n",
output.StorageClass, output.ETag, output.ContentType, output.ContentLength, output.LastModified)
p := make([]byte, 1024)
var readErr error
var readCount int
for {
readCount, readErr = output.Body.Read(p)
if readCount > 0 {
fmt.Printf("%s", p[:readCount])
}
if readErr != nil {
break
}
}
} else {
// API 응답에서 에러 코드 및 메시지 파싱
if wosError, ok := err.(wos.WosError); ok {
fmt.Println(wosError.StatusCode)
fmt.Println(wosError.Code)
fmt.Println(wosError.Message)
} else {
fmt.Println(err)
}
}
var ak = "*** 본인의 Access Key 입력 ***"
var sk = "*** 본인의 Secret Key 입력 ***"
var endpoint = "https://your-endpoint"
wosClient, _ := wos.New(ak, sk, endpoint, wos.WithRegion("your-region"))
input := &wos.DeleteObjectInput{}
input.Bucket = bucketName
input.Key = objectKey
output, err := wosClient.DeleteObject(input)
if err == nil {
fmt.Printf("StatusCode:%d, RequestId:%s\n", output.StatusCode, output.RequestId)
} else {
// API 응답에서 에러 코드 및 메시지 파싱
if wosError, ok := err.(wos.WosError); ok {
fmt.Println(wosError.StatusCode)
fmt.Println(wosError.Code)
fmt.Println(wosError.Message)
} else {
fmt.Println(err)
}
}
example/simple_multipart_upload_sample.go 참조
example/multipart_upload_sample.go 참조
자세한 예시는 wos_go_sample.go 참고
| 기능 | 이름 |
|---|---|
| 버킷 리스트 조회 | ListBuckets |
| 버킷 존재 여부 조회 | HeadBucket |
| 버킷 라이프사이클 설정 | SetBucketLifecycleConfiguration |
| 버킷 라이프사이클 조회 | GetBucketLifecycleConfiguration |
| 버킷 라이프사이클 삭제 | DeleteBucketLifecycleConfiguration |
| 오브젝트 리스트 조회 | ListObjects |
| 오브젝트 v2 리스트 조회 | ListObjectV2 |
| 멀티파트 업로드 리스트 조회 | ListMultipartUploads |
| 오브젝트 삭제 | DeleteObject |
| 오브젝트 다중 삭제 | DeleteObjects |
| 보관 아카이브 오브젝트 복구 | RestoreObject |
| 멀티파트 업로드 시작 | InitiateMultipartUpload |
| 파트 업로드 | UploadPart |
| 파트 복사 | CopyPart |
| 업로드된 파트 리스트 조회 | ListParts |
| 멀티파트 업로드 중단 | AbortMultipartUpload |
| 오브젝트 업로드 | PutObject |
| 파일 업로드 | PutFile |
| 오브젝트 존재 여부 체크 | HeadObject |
| 오브젝트 메타데이터 조회 | GetObjectMetadata |
| 오브젝트 다운로드 | GetObject |
| 오브젝트 미디어 정보 조회 | GetAvinfo |
| 샘플 설명 | 샘플명 |
|---|---|
| 대용량 오브젝트 병렬 멀티파트 복사 | concurrent_copy_part_sample.go |
| 대용량 오브젝트 병렬 멀티파트 다운로드 | concurrent_download_object_sample.go |
| 대용량 오브젝트 멀티파트 업로드 | multipart_upload_sample.go |
| 폴더 생성 | create_folder_sample.go |
| 오브젝트 다중 삭제 | delete_objects_sample.go |
| 파일 다운로드 | download_sample.go |
| 버킷 내 오브젝트 리스트 조회 | list_objects_sample.go |
| 폴더 내 오브젝트 리스트 조회 | list_objects_in_folder_sample.go |
| 오브젝트 메타데이터 조작 | object_meta_sample.go |
| 기본 오브젝트 조작 | object_operations_sample.go |
| 단순 멀티파트 업로드 | simple_multipart_upload_sample.go |
| 임시 서명 조작 | temporary_signature_sample.go |