2023. 3. 29. 01:04ㆍWannabe IT Geek/AWS
정말 아찔했다.
무려 3000장이 넘는 이미지 파일을 AWS S3 버킷에서 실수로 삭제했다.
평소에 그런 실수를 왜 하는거야? 라고 생각 했지만 그 이야기의 주인공이 나였다.
B버킷에서 데이터를 지우고, A버킷에서 데이터를 복사해서 B버킷에 넣는다는게
A버킷에서 데이터를 지우고, A버킷에서 데이터를 복사해서 B버킷에 넣고 있었다. (..어쩐지 안 들어가더라...)
AWS CLI를 사용해서 S3간 데이터를 복사해 넣고 있었는데, 역시 손으로 하다보니 휴먼에러가 발생했다.
빨리 데이터를 옮겨야 해서, 코드로 짜는 것보다 AWS CLI를 이용해서 옮기는 편이 더 빠르다고 생각했다.
(그리고 나는 실수 하지 않을거라는 자만이 더해졌다)
AWS CLI를 이용한 S3간 데이터 복사
우선 sync와 cp 두 가지 방식이 있다.
aws s3 sync 원본경로 타겟경로
aws s3 cp 원본경로 타겟경로
sync는 복사 전에 원본과 타겟 경로을 비교해, 새 파일과 업데이트된 파일만 복사한다.
cp는 타겟 경로에 파일이 존재하는지 여부에 상관 없이 모든 파일을 복사한다.
또 다른 점은 sync는 콕 키값을 하나 집어서 복사를 하지 않더라도, 경로 내의 모든 객체에 적용되는 명령이지만, cp는 어떤 일정 객체 하나에 해당되는 명령이기 때문에, 경로 내의 모든 객체에 적용하려면 --recursive라는 옵션이 따라와야 한다.
여러가지 옵션이 있겠지만 같은 계정에서 서로 다른 리전 간의 복사, 혹은 교차 계정간의 버킷 내 객체 복사라면 뒤에 --source-region, --region과 같은 옵션이 붙게 되고, 교차 계정 간에는 버킷 정책 또한 필요하다. 이 경우 해당하는 버킷의 버저닝(versioning)은 필수로 적용되어야 한다.
그리고 이 버저닝(versioning)이 나를 살렸다!!
AWS S3에서 삭제된 데이터 어찌저찌 복구하기
우선 버저닝이 활성화 되어 있다면,
아직 되돌릴 수 있는 방법은 있다. 물론 이 버저닝이 백업 전략은 아니다. 단지 도움을 줄 뿐.
자, 이제 버킷에 이미지를 넣고 삭제를 실수로 해버렸다고 가정하자.
그리고 불안해 하지 말고, s3 버킷에서 버전 표시 라고 되어 있는 토글을 누르자!
그러면 아래와 같이 두 가지의 버전이 나타난다.
하나는 삭제마커가 있는 삭제 버전 ID, 하나는 저장된 이미지 버전 ID이다. 이 두 가지 버전 중, 삭제 마커를 삭제하면, 이미지 버전만 남아서 삭제했던 파일들을 되돌릴 수 있다. 콘솔에서 하나를 선택해서 삭제해도 되지만, 나의 경우에는 몇 천개의 객체를 선택해야 했기 때문에 다른 방법을 찾았다.
AWS s3api CLI 사용하기
위에서는 AWS S3 CLI였지만, 이번에는 s3api CLI를 사용한다. AWS S3 CLI의 경우에는 객체와 버킷을 대상으로 하는 단순한 몇가지 명령어가 전부다. 실제 S3의 api를 사용하고 싶다면, s3api 명령을 활용해야 한다.
문제를 해결하기 위해서 첫번째로 어떤 것이 삭제 마커가 붙은 버전을 가지고 있는지 확인해야 했고, 두번째로는 그 삭제마커가 붙은 버전을 지워야 했다. 따라서 이번에는 list-object-version과 delete-object를 사용했다.
aws s3api list-object-versions --bucket DOC-EXAMPLE-BUCKET --prefix PREFIX
위와 같은 명령을 사용하면, 아래 캡쳐본과 같은 결과물을 볼 수 있다.
여기서 삭제 마커가 붙은 버전을 가지고 있으면, DeleteMarkers라는 배열을 볼 수 있다. 그러면 이러한 객체를 아래 명령을 통해 삭제할 수 있다.
aws s3api delete-object --bucket DOC-EXAMPLE-BUCKET --key KEY_NAME --version-id 'VERSION_ID'
따라서 이 두 가지를 합쳐서 다음과 같은 CLI 코드를 만들었다.
aws s3api list-object-versions --bucket DOC-EXAMPLE-BUCKET --prefix PREFIX/ --output json --query 'DeleteMarkers[?IsLatest==`true`].[Key, VersionId]' | jq -r '.[] | "--key '\''" + .[0] + "'\'' --version-id " + .[1]'| xargs -L1 aws s3api delete-object --bucket DOC-EXAMPLE-BUCKET | jq .
그리고 실행한 결과, 삭제되었던 객체의 삭제 마커 버전이 사라지면서, 원래 객체가 복구되는 것을 알 수 있었다.
물론 많은 객체를 하나씩 삭제마커를 지우는 방식이기 때문에, 더 많은 양의 데이터를 날려버렸다면 이렇게 하지 못하고 다른 방법을 찾아야 했을 거라고 생각한다. 몇 천장의 데이터를 이렇게 복구하는데 대략 30-40분 정도가 소요 되었다.
다시 한 번 언급하지만 이러한 버저닝을 통한 방식은 백업으로 적합한 방법은 아니고, 버저닝은 최소한의 가드라인이라고 생각한다. (AWS Backup 서비스가 있으며, 백업에 대한 내용은 공식 문서를 참조하자!)
오늘은 다행히 데이터를 복구 할 수 있었지만, 두 번의 요행은 없을 거라고 생각해서, 삭제 MFA도 설정해두었다.
'Wannabe IT Geek > AWS' 카테고리의 다른 글
AWS EKS JAM (1) | 2023.04.28 |
---|---|
SAM과 Lambda Function을 사용하여 슬랙봇 작업하기 (1) | 2022.09.11 |
AWS Game Day 졌잘싸 하기 위한 블로그 글 (2) | 2022.09.10 |
VPC Endpoint 사용하면 비용이 77% 줄어든다고?!?! (1) | 2022.09.10 |
VPC links, API gateway, Private integrations 이해하기 (2) | 2022.09.10 |