오브젝트스토리지

iwinv Object Storage - Go SDK

 

 

 

SDK는 소프트웨어 개발키트(Software Development Kit)의 약어로, 개발자를 위한 플랫폼별 구축 도구세트입니다.

소프트웨어를 개발하고 실행하는데 필요한 모든것을 제공하며, 개발의 효율성을 높여주는 장점이 있습니다.



오늘 소개드릴 Go SDK는 Google에서 개발한 프로그래밍언어 기반으로 Go 언어로 작성된 프로그램을 개발 및 관리할수 있는데,

AWS의 Go를 지원하는 AWS SDK 서비스 등을 연동하여 개발자는 Go로 AWS를 쉽게 통합하고 활용할 수 있습니다.
 


본 메뉴얼은 AWS S3에서 제공하는 Go SDK를 이용하여 iwinv Object Storage를 사용하는 방법을 설명합니다.

 

참고문서 


 


https://docs.aws.amazon.com/ko_kr/sdk-for-go/v1/developer-guide

https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/go 

 



Go SDK 사
용하기



테스트 OS : Ubuntu 18.04 LTS

 

[인증키 확인]

Endpoint -> 오브젝트 스토리지 -> 스토리지 관리 -> 인증키 관리 -> API {IDC} Endpoint    

## Endpoint 입력시에는  http://kr.object.iwinv.kr  혹은 https://kr.object.iwinv.kr  과 같은 형식으로 입력해주어야 코드가 정상 실행됩니다. 

Access_Key  : console.iwinv.kr -> 오브젝트 스토리지 -> 스토리지 관리 -> 인증키 관리 -> Access Key ID

Secret_Key   : console.iwinv.kr -> 오브젝트 스토리지 -> 스토리지 관리 -> 인증키 관리 -> Secret Key ID

 

 

 

Go 설치하기

apt install golang-go

 

Go SDK 설치하기  

go get -u github.com/aws/aws-sdk-go

 

 

# 예제코드  


 

버킷 생성

package main

import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/aws/aws-sdk-go/aws/credentials"
"fmt"
"os"
)

func main() {
if len(os.Args) != 2 {
exitErrorf("Bucket name missing!\nUsage: %s bucket_name", os.Args[0])
}
bucket := os.Args[1]

sess, err := session.NewSession(&aws.Config{
Endpoint: aws.String("Endpoint"),
Region: aws.String("default"),
Credentials: credentials.NewStaticCredentials("Access_Key", "Secret_Key", ""),
})

svc := s3.New(sess)

_, err = svc.CreateBucket(&s3.CreateBucketInput{
Bucket: aws.String(bucket),
})
if err != nil {
exitErrorf("Unable to create bucket %q, %v", bucket, err)
}

fmt.Printf("Waiting for bucket %q to be created...\n", bucket)

err = svc.WaitUntilBucketExists(&s3.HeadBucketInput{
Bucket: aws.String(bucket),
})
if err != nil {
exitErrorf("Error occurred while waiting for bucket to be created, %v", bucket)
}

fmt.Printf("Bucket %q successfully created\n", bucket)
}

func exitErrorf(msg string, args ...interface{}) {
fmt.Fprintf(os.Stderr, msg+"\n", args...)
os.Exit(1)
}

 

# 실행 명령어 

go run 파일명.go [Bucket_Name]

 

 

버킷 삭제

package main

import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/aws/aws-sdk-go/aws/credentials"
"fmt"
"os"
)

func main() {
if len(os.Args) != 2 {
exitErrorf("bucket name required\nUsage: %s bucket_name", os.Args[0])
}

bucket := os.Args[1]

sess, err := session.NewSession(&aws.Config{
Endpoint: aws.String("Endpoint"),
Region: aws.String("default"),
Credentials: credentials.NewStaticCredentials("Access_Key", "Secret_Key", ""),
})

svc := s3.New(sess)

_, err = svc.DeleteBucket(&s3.DeleteBucketInput{
Bucket: aws.String(bucket),
})
if err != nil {
exitErrorf("Unable to delete bucket %q, %v", bucket, err)
}

fmt.Printf("Waiting for bucket %q to be deleted...\n", bucket)

err = svc.WaitUntilBucketNotExists(&s3.HeadBucketInput{
Bucket: aws.String(bucket),
})
if err != nil {
exitErrorf("Error occurred while waiting for bucket to be deleted, %v", bucket)
}

fmt.Printf("Bucket %q successfully deleted\n", bucket)
}

func exitErrorf(msg string, args ...interface{}) {
fmt.Fprintf(os.Stderr, msg+"\n", args...)
os.Exit(1)
}

 

# 실행 명령어 

go run 파일명.go [Bucket_Name]

 

 

버킷 리스트 확인

package main

import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/aws/aws-sdk-go/aws/credentials"
"log"
)

func main() {
sess, err := session.NewSession(&aws.Config{
Endpoint: aws.String("Endpoint"),
Region: aws.String("default"),
Credentials: credentials.NewStaticCredentials("Access_Key", "Secret_Key", ""),
})

svc := s3.New(sess)

result, err := svc.ListBuckets(&s3.ListBucketsInput{})
if err != nil {
log.Println("Failed to list buckets", err)
return
}

log.Println("Buckets:")

for _, bucket := range result.Buckets {
log.Printf("%s : %s\n", aws.StringValue(bucket.Name), bucket.CreationDate)
}
}

 

 

 

오브젝트 업로드

package main

import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3/s3manager"
"github.com/aws/aws-sdk-go/aws/credentials"
"fmt"
"os"
)

func main() {
if len(os.Args) != 3 {
exitErrorf("bucket and file name required\nUsage: %s bucket_name filename",
os.Args[0])
}

bucket := os.Args[1]
filename := os.Args[2]

file, err := os.Open(filename)
if err != nil {
exitErrorf("Unable to open file %q, %v", err)
}

defer file.Close()

sess, err := session.NewSession(&aws.Config{
Endpoint: aws.String("Endpoint"),
Region: aws.String("default"),
Credentials: credentials.NewStaticCredentials("Access_Key", "Secret_Key", ""),
})
uploader := s3manager.NewUploader(sess)


_, err = uploader.Upload(&s3manager.UploadInput{
Bucket: aws.String(bucket),


Key: aws.String(filename),


Body: file,
})
if err != nil {
// Print the error and exit.
exitErrorf("Unable to upload %q to %q, %v", filename, bucket, err)
}

fmt.Printf("Successfully uploaded %q to %q\n", filename, bucket)
}

func exitErrorf(msg string, args ...interface{}) {
fmt.Fprintf(os.Stderr, msg+"\n", args...)
os.Exit(1)
}

 

# 실행 명령어 

go run 파일명.go [Bucket_Name] [Path/File_Name] 

ex) go run object_upload.go iwinv-bucket /tmp/test.txt   

 

* 업로드시 디렉토리도 함께 버킷에 업로드됩니다. (해당 디렉토리에서 명령어 실행시에는 파일명만 입력 - 파일만 버킷에 업로드)

 

 

오브젝트 다운로드

package main

import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/aws/aws-sdk-go/service/s3/s3manager"
"github.com/aws/aws-sdk-go/aws/credentials"
"fmt"
"os"
)


func main() {
if len(os.Args) != 3 {
exitErrorf("Bucket and item names required\nUsage: %s bucket_name item_name",
os.Args[0])
}

bucket := os.Args[1]
item := os.Args[2]

file, err := os.Create(item)
if err != nil {
exitErrorf("Unable to open file %q, %v", item, err)
}

defer file.Close()

sess, err := session.NewSession(&aws.Config{
Endpoint: aws.String("Endpoint"),
Region: aws.String("default"),
Credentials: credentials.NewStaticCredentials("Access_Key", "Secret_Key", ""),
})

downloader := s3manager.NewDownloader(sess)

numBytes, err := downloader.Download(file,
&s3.GetObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(item),
})
if err != nil {
exitErrorf("Unable to download item %q, %v", item, err)
}

fmt.Println("Downloaded", file.Name(), numBytes, "bytes")
}

func exitErrorf(msg string, args ...interface{}) {
fmt.Fprintf(os.Stderr, msg+"\n", args...)
os.Exit(1)
}

 

# 실행 명령어 

go run 파일명.go [Bucket_Name] [Object_Name]

 

* 다운로드시 명령어를 실행한 디렉토리에 파일이 저장됩니다.

 

 

 

오브젝트 리스트 확인

package main

import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/aws/aws-sdk-go/aws/credentials"
"fmt"
"os"
)

func main() {
if len(os.Args) != 2 {
exitErrorf("Bucket name required\nUsage: %s bucket_name",
os.Args[0])
}

bucket := os.Args[1]

sess, err := session.NewSession(&aws.Config{
Endpoint: aws.String("Endpoint"),
Region: aws.String("default"),
Credentials: credentials.NewStaticCredentials("Access_Key", "Secret_Key", ""),
})

svc := s3.New(sess)

resp, err := svc.ListObjectsV2(&s3.ListObjectsV2Input{Bucket: aws.String(bucket)})
if err != nil {
exitErrorf("Unable to list items in bucket %q, %v", bucket, err)
}

for _, item := range resp.Contents {
fmt.Println("Name: ", *item.Key)
fmt.Println("Last modified:", *item.LastModified)
fmt.Println("Size: ", *item.Size)
fmt.Println("Storage class:", *item.StorageClass)
fmt.Println("")
}

fmt.Println("Found", len(resp.Contents), "items in bucket", bucket)
fmt.Println("")
}

func exitErrorf(msg string, args ...interface{}) {
fmt.Fprintf(os.Stderr, msg+"\n", args...)
os.Exit(1)
}

 

 

오브젝트 삭제

package main

import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/aws/aws-sdk-go/aws/credentials"
"fmt"
"os"
)

func main() {
if len(os.Args) != 3 {
exitErrorf("Bucket and object name required\nUsage: %s bucket_name object_name",
os.Args[0])
}

bucket := os.Args[1]
obj := os.Args[2]

sess, err := session.NewSession(&aws.Config{
Endpoint: aws.String("Endpoint"),
Region: aws.String("default"),
Credentials: credentials.NewStaticCredentials("Access_Key", "Secret_Key", ""),
})

svc := s3.New(sess)

_, err = svc.DeleteObject(&s3.DeleteObjectInput{Bucket: aws.String(bucket), Key: aws.String(obj)})
if err != nil {
exitErrorf("Unable to delete object %q from bucket %q, %v", obj, bucket, err)
}

err = svc.WaitUntilObjectNotExists(&s3.HeadObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(obj),
})
if err != nil {
exitErrorf("Error occurred while waiting for object %q to be deleted, %v", obj, err)
}

fmt.Printf("Object %q successfully deleted\n", obj)
}

func exitErrorf(msg string, args ...interface{}) {
fmt.Fprintf(os.Stderr, msg+"\n", args...)
os.Exit(1)
}

 

# 실행 명령어 

go run 파일명.go [Bucket_Name] [Object_Name]