본문 바로가기
golang

[golang] aws-sdk-go-v2 의 s3 copyobject 사용법(copyobject example)

by devjh 2022. 4. 11.
반응형

이번 게시글에서는 aws-sdk-go-v2의 copyobject 사용법에 대해 정리합니다.

object의 설정을 관리하고 싶을때 lifecycle을 이용할수도 있지만, 추가적인 로직이 필요한경우 직접 개발해야 합니다.

그런 경우 copyobject를 사용해야 합니다.

1. aws-sdk-go-v2

aws 클라이언트 라이브러리입니다.

아래의 명령어로 관련 라이브러리를 다운받아 사용할 수 있습니다.

go get "github.com/aws/aws-sdk-go-v2/service/s3"
go get "github.com/aws/aws-sdk-go-v2/service/types"

 

2. copyobject란

aws s3의 object를 복사하는 기능을 제공합니다.

object를 복사하는 경우에도 사용할수 있지만

object의 설정을 변경할때 go-sdk에서 지원하지 않는 부분을 제어할때 유용하게 사용할 수 있습니다.

기존의 원본파일을 복사해서 덮어씌울때 object의 설정을 변경해서 덮어씌우는 방식입니다.

 

 

3. aws-sdk-go-v2 공식문서의 copyobject

aws 라이브러리 사용법은 공식문서를 참고하면 되지만, 공식문서가 조금 모호하게 되어있네요

 

aws 공식문서의 copyobejct example 입니다.

 

CopyObjectv2

The AWS SDK for Go V2 provides APIs and utilities that developers can use to build Go applications that use AWS services.

aws.github.io

현재는 아래와같이 표기되어있습니다.

Bucket에는 sourceBucket가

CopySource에는 destinationBucket가 들어갑니다.

마지막 log에도 sourceBucket에서 destinationBucket으로 copy했다는 로그를 찍도록 되어있습니다.

 

그러나 실제로 실행해보면 object를 제대로 찾지 못하는 현상이 나타납니다.

뭔가 이상한거 같아 포스팅합니다.

올바른 예제의 소스코드는 제 github레파지토리에 올려놓았습니다.

https://github.com/jaeho310/s3-copyobject

 

GitHub - jaeho310/s3-copyobject

Contribute to jaeho310/s3-copyobject development by creating an account on GitHub.

github.com

 

3. main.go

package main

import s3Service "s3-copyobject/s3-service"

func main() {
   err := s3Service.CopyS3Object()
   if err != nil {
      panic(err)
   }
}

 

4. s3-service/service.go

package s3_service

import (
   "context"
   "log"
   "net/url"

   "github.com/aws/aws-sdk-go-v2/config"
   "github.com/aws/aws-sdk-go-v2/service/s3"
)

var s3Client *s3.Client

func init() {
   log.Println("load config")
   cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithSharedConfigProfile("yourprofile"))
   if err != nil {
      log.Fatal(err)
   }
   log.Println("create s3 client")
   s3Client = s3.NewFromConfig(cfg)
}

func CopyS3Object() error {
   sourceBucket := url.PathEscape("my-foo-test2")                              // 복사한 오브젝트가 들어갈 버킷
   destinationBucket := url.PathEscape("my-foo-test1" + "/" + "my-object.txt") // 복사할 원본의 위치. 버킷/디렉토리/파일.확장자 풀네임으로 입력
   objectName := "my-copied-object"                                            // 복사한 오브젝트의 새로운 이름

   input := &s3.CopyObjectInput{
      Bucket:     &sourceBucket,
      CopySource: &destinationBucket,
      Key:        &objectName,
      // StorageClass: , copyobject는 storage타입 등 go-sdk에서 직접 제공하지 않는 설정을 바꿀때 사용할 수 있습니다.(동일위치, 동일이름으로 변경시 타입만 변경됩니다.)
   }
   _, err := s3Client.CopyObject(context.TODO(), input)
   if err != nil {
      return err
   }
   log.Println("Copied " + objectName + " from " + sourceBucket + " to " + destinationBucket)
   // sorceBucket이 카피된 object가 존재할 목적지버킷이고
   // destinationBucket이 기존의 object가 있던 위치입니다.
   // 공식문서에 있는 틀을 그대로 가져온건데 log만 봐도 뭔가 바뀐듯한 느낌이 듭니다.
   return nil
}

 

4. output

2022/04/11 11:24:34 load config
2022/04/11 11:24:34 create s3 client
2022/04/11 11:24:35 Copied my-copied-object from my-foo-test2 to my-foo-test1%2Fmy-object.txt

번역해보면 my-copied-object를 my-foo-test2에서 my-foo-test1로 복사했다는 로그가 나옵니다.

그러나 저는 my-foo-test1에서 my-foo-test2로 복사했습니다.

 

공식문서에 로그를 찍을때는 source버킷에서 copySource로 복사했다고 포맷팅을 해서 출력하도록 작성되어있지만

실제로는 copySource에서 sourceBucket으로 복사가 이루어집니다.

 

즉 sourceBucket에는 복사한 object가 들어갈 위치를

copySource에는 기존에 object의 위치를 넣어줘야 합니다.

 

5. test코드 작성

아래의 게시글에서 테스트코드 작성법을 포스팅 했습니다.

 

[golang] golang mockup을 통한 테스트 코드 작성법

이번 게시글에서는 mockup을 통한 테스트 코드 작성법에 대해서 정리합니다. 1. 테스트종류 프로그래밍의 테스트방식은 상태기반 테스트와 행위기반 테스트로 나뉩니다. (1). 상태기반테스트 db등

frozenpond.tistory.com

 

반응형

댓글