s3에서 버저닝 설정을 해놓게 되면 파일을 삭제시 완전히 삭제되는게 아니다.
해당 파일을 최신버전에 deletemarker가 생성되며
그 파일의 최신버전이 deletemarker일때 해당파일은 삭제상태가 되는것이다.
그러므로 삭제했던 파일도 최신버전의 deletemarker를 지우게되면 다시 이전 버전으로 살아나는 것이다.
위 사진처럼 파일을 삭제하면 딜리트마커가 쌓인다.
다른 경우로 덮어쓰게되면 삭제마커가 아닌 새로운 object가 이전 버전위에 쌓이는 것이다.
그리고 그 새로쌓인 마커가 최신버전이 되면서 해당 마커의 파일이 노출된다.
//////////////////////////////////
나는 버저닝 해놓았던 s3에서 실수로 어떤 폴더를 삭제하게 되었는데
해당 폴더를 살리기 위해 콘솔에서 딜리트마커를 지우던중 너무 귀찮아서(일일이 하나하나 클릭후에 삭제를 해줘야함)
boto3를 이용해 내가 살리고싶은 파일들을 되돌리는 python 소스를 짜게되었다.
import boto3.s3
bucket_name = "bucket_name_hahaha"
path = "2018/05/"
#삭제한 날짜 gmt +0 로 해주세용
date = '2018-05-11 06:42'
class recovery:
def start(self):
print("=" * 80 + "\nstart recovery run!!!\n" + "=" * 80)
self.client = boto3.client('s3', aws_access_key_id="엑세스키 입력하세용", aws_secret_access_key="시크릿키 입력하세용", region_name='ap-northeast-2')
self.do()
print("=" * 80 + "\nstart recovery end!!!\n" + "=" * 80)
def do(self):
response = self.client.list_object_versions(
Bucket=bucket_name,
EncodingType='url',
KeyMarker='',
MaxKeys=1000,
Prefix=path
)
print(response)
contents = response['DeleteMarkers']
versionIds = []
for version in contents:
if str(version["LastModified"]).find(date) == 0 and version["IsLatest"] is True and str(version["Key"]).endswith("/") is not True:
versionIds.append({'VersionId':version["VersionId"], "Key":version["Key"]})
print(version["Key"])
print("갯수 = " , len(versionIds) , "개")
#삭제 하기
response = self.client.delete_objects(
Bucket=bucket_name,
Delete={
'Objects': versionIds,
'Quiet': True
}
)
이렇게 bucket_name에는 s3버킷 이름을 써주면되고, path에는 복구하고싶은 경로를 설정하면되고 복구하고싶은 파일들이 지워진 날짜를 입력하면된다.
(스트링 비교이고 gmt +0기준이라 잘생각해서 써주면됨)
boto3.client에 엑세스키와 시크릿키, 리전을 입력한후에 실행하면
해당 경로에서 해당 날짜시간에 삭제한(deletemarker)를 찾아 그 마커가 라스트버전이면(삭제상태) 해당 마커를 지워서
파일을 이전 버전으로 되돌려준다.
'공부 > Aws' 카테고리의 다른 글
AWS SES Bounce 처리 (0) | 2018.11.17 |
---|---|
AWS cli s3 덮어쓰기 (0) | 2018.04.27 |
AWS cli s3 upload (0) | 2018.04.24 |
AWS cli config (0) | 2018.04.24 |
AWS s3 listObjects all (1) | 2018.04.12 |