본문 바로가기
golang

[golang] aws-go-sdk-v2를 사용하여 s3 bucket lifecycle 적용하기(PutBucketLifecycleConfiguration 사용법)

by devjh 2022. 4. 15.
반응형

이번 게시글에서는 aws-go-sdk-v2를 사용하여 bucket의 lifecyle 적용방법을 정리합니다.

일반적으로 aws 서비스의 변경은 테라폼같은 IAC도구를 사용하지만

테라폼으로 관리하지 않는 버킷들까지 모두 추적하거나, 추가적인 로직이 필요한경우 sdk를 이용하여 자체 개발할 필요가 있습니다.

 

1. s3 lifecycle이란

aws s3 lifecycle은 버킷 내 object의 수명주기를 관리하기 위한 기능으로 버킷별로 lifecycle을 생성해놓으면 해당 버킷내에 생성된 object의 storage type을 변경하거나 삭제하는 등의 작업을 할 수 있습니다.(30일 뒤에 특정 조건에 맞는 object를 삭제하거나, 일주일 뒤에 storage type을 glacier로 하는 등으로 활용할 수 있습니다.)

 

2. aws-go-sdk-v2

일반적으로 클라이언트의 역활을 하는 라이브러리들은 공식문서에 소개된 json이나 xml과 비슷하게 request를 보내면 동작하게 됩니다

 

(아래는 aws의 유저가이드입니다)

 

Lifecycle configuration elements - Amazon Simple Storage Service

Amazon S3 maintains only the last modified date for each object. For example, the Amazon S3 console shows the Last Modified date in the object Properties pane. When you initially create a new object, this date reflects the date the object is created. If yo

docs.aws.amazon.com

저는 특정 버킷에 생성된 모든 오브젝트의 storagetype을 하루 뒤에 glacier로 변경하고 싶어서 찾아보니

 

버킷안에 있는 모든 오브젝트에 대해 lifecycle을 적용하려면 empty filter를 사용하라고 되어있는걸 확인할 수 있습니다.

 

You can specify an empty filter, in which case the rule applies to all objects in the bucket.
 
<LifecycleConfiguration>
    <Rule>
        <Filter>
        </Filter>
        <Status>Enabled</Status>
        transition/expiration actions.
    </Rule>
</LifecycleConfiguration>

이제 해당 xml의 형식에 맞게 sdk로 요청을 하면 됩니다.

 

3. 소스코드

func changeBucketLifeCycle(bucketName *string) error {
   ruleId := "my-rule-id"
   var nilValue string
   memberPrefix := types.LifecycleRuleFilterMemberPrefix{Value: nilValue}

   configurationInput := s3.PutBucketLifecycleConfigurationInput{
      Bucket: bucketName,
      LifecycleConfiguration: &types.BucketLifecycleConfiguration{
         Rules: []types.LifecycleRule{
            {
               Status: types.ExpirationStatusEnabled,
               Transitions: []types.Transition{
                  {
                     Days:         1,
                     StorageClass: types.TransitionStorageClassGlacier,
                  },
               },
               ID:     &ruleId,
               //Prefix: &nilValue,     // 이렇게 하시거나(deprecated로 추후 없어질 가능성이 있습니다)
               Filter: &memberPrefix, // 이렇게 하시면 됩니다.
            },
         },
      },
      ChecksumAlgorithm: types.ChecksumAlgorithmCrc32,
   }
   _, err := client.PutBucketLifecycleConfiguration(context.TODO(), &configurationInput)
   if err != nil {
      return err
   }
   return nil
}

모든 객체를 선택하기 위해 예전에는 filter 대신 prefix를 사용했다고 하는데 현재는 deprecated 되었다고 가이드 하고 있으니 Filter를 사용하도록 합니다.

 

새로나온 Filter는 조금더 풍부하게 prefix를 거는 방식입니다.

 

마찬가지로 filter를 걸지 않고 모든 객체를 선택하려면 비어있는 값을 넘기면 됩니다.

 

(그냥 filter를 안주면 모든 object에 적용됐으면 좋겠는데.. 꼭 필드를 만들고 nil을 넘겨줘야합니다.)

 

Filter의 value는 추상에 의존하고 있으므로 구현체가 구현된 LifecycleRuleFilterMemberPrefix에 Value를 nil을 줘서 사용하면 모든 객체를 선택하는 lifecycle을 생성할 수 있습니다.

반응형

댓글