Go

최신 업데이트: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 인스턴스를 초기화하고, 필요에 따라 클라이언트 설정 파라미터를 조정해야 합니다.

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)
    }
}

설정(Configurations)

클라이언트 생성 시 다양한 파라미터를 통해 설정을 지정할 수 있습니다. 예를 들어, 응답 헤더 수신 시간 제한을 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
이 문서의 내용이 도움이 되었습니까?
아니오
정상적으로 제출되었습니다.피드백을 주셔서 감사합니다.앞으로도 개선을 위해 노력하겠습니다.