1. s3 delete marker란
s3에서는 bucket별로 버전관리 기능을 활성화하면
해당 bucket 내부의 object에 한해 버전관리를 할 수 있습니다.
버전관리를 하게되면 object별로 유니크한 versionId를 갖게되며
object에 변경이 생긴경우 기록되어 git처럼 과거 commit으로 돌아갈 수 있습니다.
그러나 무거운 파일의 과거 기록을 모두 보관하고 있게 되면 불필요한 aws 비용이 발생하게되니 주의해야 합니다.
버전관리를 하는 객체를 삭제하게되면 조금 특이한 현상이 발생합니다.
필요 없어진 object라 삭제더라도 버전관리 기능을 켜놓는다면 과거 내용을 모두 보관하게 됩니다.
(api cli나 sdk를 사용할때 versionId를 이용해 삭제하게 되면 정상적으로 삭제가 되지만
versionId없이 objectName으로 삭제하게 되면 모든 데이터가 삭제되는것이 아니라 가장 최근에 데이터 대신 삭제마커라는 데이터가 생기게 됩니다)
실수로 삭제한 데이터를 복구할 수 있다는건 장점일수도 있지만, 불필요한 비용청구는 막아야 합니다.
아래의 코드는 버전관리를 하는 object들의 올바른 삭제방법과, deletemarker를 삭제해서 복구하는 방법입니다.
(lifecycle을 이용해도 되지만 추가적인 로직이 필요하다면 sdk를 이용하여 자체 개발합니다)
2. 소스코드
func recoverObject() {
bucketName := "your bucket"
objectVersionsOutput, err := client.ListObjectVersions(context.TODO(), &s3.ListObjectVersionsInput{
Bucket: &bucketName,
})
if err != nil {
panic(err)
}
for _, deleteMarker := range objectVersionsOutput.DeleteMarkers {
deleteObjectWithVersionId(bucketName, *deleteMarker.Key, *deleteMarker.VersionId)
}
}
func deleteObjectWithVersionId(bucketName string, objectName string, versionId string) {
_, err := client.DeleteObjects(context.TODO(), &s3.DeleteObjectsInput{
Bucket: &bucketName,
Delete: &types.Delete{
Objects: []types.ObjectIdentifier{
{
Key: &objectName,
VersionId: &versionId,
},
},
},
})
if err != nil {
panic(err)
}
}
(1). deleteObjectWithVersionId()
해당 메서드에서는 versionId를 이용하여 object의 버전을 삭제하고 있습니다.
DeleteObjectInput에 versionId를 주지 않는다면 object 삭제 횟수만큼 delete marker만 생성되니 버전관리를 켜놓은 버킷의 object를 삭제할때는 꼭 versionId를 이용해서 삭제해줘야 합니다.
(2). recoverObject()
listObjectVersion은 version이 찍힌 object들을 가져옵니다.(디렉토리도 가져오니 주의)
response output으로 deletemarker와 일반적으로 version이 찍힌 object를 따로 제공해줍니다.
deletemarker의 버전ID를 이용해서 delete marker를 object 삭제해주듯이 삭제해주면
삭제하기 이전의 가장 최근의 s3 object로 복구됩니다.
'golang' 카테고리의 다른 글
[golang] go-sdk-v2 athena 사용법(go-sdk-v2 athena example) (2) | 2022.09.07 |
---|---|
[golang] aws-sdk-go-v2 aws resource 정보를 max value 이상 가져오기 (0) | 2022.04.28 |
[golang] aws-go-sdk-v2를 사용하여 s3 bucket lifecycle 적용하기(PutBucketLifecycleConfiguration 사용법) (0) | 2022.04.15 |
[golang] go언어 mockup을 통한 테스트 코드 작성법(go mock) (0) | 2022.04.11 |
[golang] aws-sdk-go-v2 의 s3 copyobject 사용법(copyobject example) (0) | 2022.04.11 |
댓글