이번 게시글에서는 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의 유저가이드입니다)
<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을 생성할 수 있습니다.
'golang' 카테고리의 다른 글
[golang] aws-sdk-go-v2 aws resource 정보를 max value 이상 가져오기 (0) | 2022.04.28 |
---|---|
[golang] aws s3 deletemarker 삭제하기(s3 object 복구하기) (0) | 2022.04.28 |
[golang] go언어 mockup을 통한 테스트 코드 작성법(go mock) (0) | 2022.04.11 |
[golang] aws-sdk-go-v2 의 s3 copyobject 사용법(copyobject example) (0) | 2022.04.11 |
[golang] 고루틴 사용시 주의점(오버플로우 방지, 고루틴풀, 고루틴큐) (0) | 2022.03.08 |
댓글