버전 관리로 덮어쓴 보고서 복구하기

AWSBeginner
지금 연습하기

소개

재무팀 보고서 키에 초안을 업로드하면 독자가 보는 승인된 내용이 교체됩니다. 버전 관리를 활성화하고 이 실수를 재현한 뒤 승인된 내용을 복구하고 복구를 확인한 후 연습용 기록을 삭제합니다.

먼저 키와 메타데이터로 문서 정리하기에서 객체 키, 속성, 다운로드, 정리를 익히세요. 새 VM에 CLI 연결과 승인된 파일 및 초안 파일이 제공됩니다. 버킷은 직접 생성합니다. 명령에는 Terminal을 사용하고 옆의 AWS View 탭에서 현재 객체와 기록을 비교하세요.

인증 시험 관련 주제

이 실습은 다음 시험 주제에 대한 실습 경험을 제공합니다.

게시하기 전에 버전 관리 활성화하기

이 단계에서는 빈 버킷을 생성하고 보고서를 업로드하기 전에 버전 관리를 활성화합니다.

cd(디렉터리 변경)로 작업 공간에 들어가세요.

cd /home/labex/project

mb(버킷 생성)로 보고서 버킷을 생성하세요.

aws s3 mb s3://labex-report-history

make_bucket: labex-report-history가 보여야 합니다. 버전 관리는 버킷 설정입니다. 활성화하면 이후 키에 쓰는 작업은 이전에 저장된 내용을 버리는 대신 버전 ID를 생성합니다. 실수로 덮어쓴 내용을 복구하는 데 유용하지만 특정 버전을 명시적으로 삭제하는 것을 막지는 않습니다.

aws s3api는 개별 S3 API 작업을 제공합니다. put-bucket-versioning은 이 설정을 업데이트합니다. --bucket은 컨테이너를 식별하고 --versioning-configuration Status=Enabled는 활성화 상태를 요청합니다.

aws s3api put-bucket-versioning --bucket labex-report-history --versioning-configuration Status=Enabled

업데이트에 성공해도 본문은 출력되지 않습니다. 출력이 없다는 것에만 의존하지 말고 설정을 다시 읽으세요.

aws s3api get-bucket-versioning --bucket labex-report-history
{
    "Status": "Enabled"
}

AWS View의 버킷에는 이제 Versioning: Enabled가 표시됩니다. 버킷은 여전히 비어 있습니다. 버전 관리를 켜도 보고서가 업로드되거나 이전 버전이 생성되지는 않습니다. 보호할 데이터가 기록되기 전에 설정을 활성화하세요.

원본 버전과 덮어쓴 버전 생성하기

이 단계에서는 승인된 보고서를 게시한 뒤 원본을 기록에 유지하면서 현재 내용을 초안으로 덮어씁니다.

내용을 출력하는 cat으로 준비된 파일을 확인하세요.

cat report-approved.txt
Monthly revenue: 42000
cat report-draft.txt
Monthly revenue: 00000

승인된 파일을 report.txt 키에 게시하세요. 원본 파일 이름과 객체 키는 달라도 됩니다.

aws s3 cp report-approved.txt s3://labex-report-history/report.txt

AWS View에서 report.txt를 열고 승인된 매출을 확인하세요. 기록에는 Current로 표시된 버전 하나가 있습니다.

이제 실수를 재현하세요. 같은 키에 초안을 업로드합니다.

aws s3 cp report-draft.txt s3://labex-report-history/report.txt

미리 보기는 Monthly revenue: 00000으로 바뀝니다. 현재 객체 키는 여전히 하나지만 기록에는 저장된 버전 두 개가 있습니다. 두 파일의 크기는 같습니다. 버전 관리는 크기만으로 변경을 추론하는 대신 쓰기 작업을 추적합니다.

list-object-versions는 현재 버전과 이전 기록을 함께 검색합니다.

aws s3api list-object-versions --bucket labex-report-history

Versions 배열에는 키가 report.txt이고 VersionId 값이 다른 항목 두 개가 있습니다. IsLatest: true는 초안이 현재 버전임을 나타내고 이전 승인 버전에는 IsLatest: false가 있습니다. ID와 타임스탬프는 달라집니다. 일반 객체 목록은 현재 키를 보여 주므로 덮어쓰기를 조사할 때는 버전 목록을 사용하세요.

공식 S3 Console에서 Show versions는 객체 목록에 이러한 기록 항목을 표시합니다. 이 예시는 다른 객체와 더 많은 쓰기 작업을 보여 줍니다. Version ID 열을 알아보는 데 사용하세요. 이 실습에서는 Console 로그인이 필요하지 않습니다.

Show versions가 활성화된 공식 S3 Console

출처: AWS Storage Blog.

승인된 버전을 검색하고 게시하기

이 단계에서는 이전 승인 버전을 다운로드하고 바이트를 확인한 뒤 기록을 삭제하지 않고 그 내용을 다시 현재 버전으로 만듭니다.

이 시점에 report.txt의 버전은 정확히 두 개입니다. 이전 목록에서 IsLatest: false인 항목을 찾으세요. 이것이 승인된 원본입니다. VersionId를 복사하세요.

재사용할 수 있도록 ID를 셸 변수에 저장하세요. 아래의 PASTE_APPROVED_VERSION_ID를 복사한 값으로 바꾸고 따옴표는 유지하세요. 변수 할당에는 = 주위에 공백을 넣지 않습니다.

OLD_VERSION='PASTE_APPROVED_VERSION_ID'

사용하기 전에 값을 확인하세요.

echo "$OLD_VERSION"

자리 표시자가 아닌 이전 버전의 ID가 보여야 합니다. $OLD_VERSION은 변수를 읽고 큰따옴표는 값을 하나의 명령 인수로 유지합니다.

get-object는 객체 본문을 마지막에 지정한 로컬 경로로 다운로드합니다. --version-id는 현재 초안 대신 이전 사본을 선택합니다.

aws s3api get-object --bucket labex-report-history --key report.txt --version-id "$OLD_VERSION" recovered-report.txt

JSON 출력은 검색한 사본을 설명합니다. 내용을 읽으세요.

cat recovered-report.txt
Monthly revenue: 42000

cmp는 파일 바이트를 비교합니다. &&는 비교가 성공했을 때만 다음 메시지를 출력합니다.

cmp report-approved.txt recovered-report.txt && echo 'Approved historical content verified'

이전 버전을 검색해도 현재 버전으로 바뀌지는 않습니다. 버전을 지정하지 않은 키를 읽는 독자는 여전히 초안을 받습니다. 복구된 바이트를 그 키에 게시하세요.

aws s3 cp recovered-report.txt s3://labex-report-history/report.txt

이 작업은 승인된 보고서가 포함된 세 번째 버전을 생성합니다. 기존 승인 버전과 초안은 조사할 수 있도록 둘 다 남습니다. AWS View에는 승인된 내용이 현재 버전으로 표시되고 버전 기록 세 개가 있습니다. 기록을 나열하여 확인하세요.

aws s3api list-object-versions --bucket labex-report-history

새 항목은 IsLatest: true입니다. 실수의 증거를 지우는 대신 새 현재 버전을 기록하여 데이터를 복구했습니다.

이 예시는 복구된 보고서가 현재 버전이며 서로 다른 기록 항목 세 개가 있는 모습을 보여 줍니다. 표시된 버전 ID는 해당 세션의 예시입니다.

버전 기록을 유지한 복구 보고서

삭제 마커 이후 접근 복구하기

이 단계에서는 삭제 마커가 버전 관리 객체를 숨기는 방식을 관찰하고 마커를 제거하여 이전 현재 버전을 다시 표시합니다.

개념도: 삭제는 현재 마커를 추가하지만 저장된 보고서 버전 세 개는 유지됩니다. v1–v3 레이블은 실제 버전 ID가 아닌 쓰기 순서를 나타냅니다.

현재 버전과 기록

버전 관리가 활성화된 버킷에서 버전 ID 없이 삭제를 요청하면 **삭제 마커(delete marker)**가 생성됩니다. 이것은 키가 삭제되었음을 나타내는 현재 기록 항목입니다. 파일 바이트를 포함하지 않으며 이전 버전을 지우지도 않습니다. 일반 파일 명령으로 현재 키를 삭제하세요.

aws s3 rm s3://labex-report-history/report.txt

일반 목록에는 이제 현재 객체가 없습니다.

aws s3 ls s3://labex-report-history/

AWS View에서는 현재 객체가 사라지지만 기록에는 Version 행 세 개와 현재 Delete marker가 남습니다.

버전을 선택하지 않고 키를 다운로드해 보세요.

aws s3 cp s3://labex-report-history/report.txt unavailable-report.txt

이 명령은 예상대로 실패하며 찾을 수 없다는 오류가 발생합니다. 현재 삭제 마커 때문에 일반 읽기는 객체가 없는 것처럼 동작합니다. 이는 이전 바이트가 지워졌다는 증거가 아닙니다.

전체 기록을 읽으세요.

aws s3api list-object-versions --bucket labex-report-history

응답에는 이제 Versions와 함께 DeleteMarkers가 포함됩니다. DeleteMarkers에서 유일한 항목을 찾아 VersionId를 복사하세요. 이 ID는 저장된 보고서가 아닌 마커를 식별합니다.

아래 자리 표시자를 마커 ID로 바꾸세요.

MARKER_VERSION='PASTE_DELETE_MARKER_ID'

delete-object로 정확히 그 마커를 제거하세요. --version-id를 제공하면 다른 마커를 생성하는 대신 선택한 기록 항목을 삭제합니다.

aws s3api delete-object --bucket labex-report-history --key report.txt --version-id "$MARKER_VERSION"

응답은 삭제된 마커를 식별합니다. 이전 승인 버전이 다시 현재 버전이 됩니다. 이 작업은 다른 보고서 버전을 업로드하지 않습니다. 키를 다운로드하여 일반 접근을 확인하세요.

aws s3 cp s3://labex-report-history/report.txt accessible-report.txt
cmp report-approved.txt accessible-report.txt && echo 'Current report accessible again'

비교가 성공합니다. AWS View에는 승인된 내용과 버전 세 개를 가진 report.txt가 다시 표시됩니다. 마커 제거는 접근을 복구하지만 데이터 버전을 영구 삭제하면 해당 사본이 지워집니다.

이전 버전과 버킷 삭제하기

이 단계에서는 빈 버킷을 삭제하기 전에 실습에 속한 모든 데이터 버전을 삭제합니다.

일반 객체 목록이 비어 있어도 버전 기록은 스토리지를 사용합니다. 단순한 aws s3 rm은 다른 삭제 마커를 생성하므로 버전 관리 버킷을 비우기에 충분하지 않습니다. 이전 단계의 마커는 이미 제거되었고 데이터 버전 세 개가 남아 있습니다.

영구 정리 전에 기록을 나열하세요.

aws s3api list-object-versions --bucket labex-report-history

Versions에 항목 세 개가 있고 DeleteMarkers는 없어야 합니다. 모든 항목은 이 일회성 보고서 연습에 속합니다.

세 항목 모두 report.txt에 속합니다. 이미 delete-object --version-id로 마커를 제거했습니다. 같은 작업으로 데이터 버전도 영구 삭제할 수 있습니다.

목록에서 VersionId 하나를 복사하여 아래 자리 표시자를 바꾸세요. 서로 다른 세 ID 각각에 대해 이 명령을 한 번씩 실행하세요. 영구 삭제는 되돌릴 수 없으므로 매번 버킷, 키, ID를 확인하세요.

aws s3api delete-object --bucket labex-report-history --key report.txt --version-id 'PASTE_VERSION_ID'

성공한 응답은 삭제된 버전을 식별합니다. 버전 ID는 키의 모든 버전이 아닌 이전 사본 하나를 선택합니다. 세 개를 모두 삭제한 뒤 버전이나 마커가 남지 않았는지 확인하세요.

aws s3api list-object-versions --bucket labex-report-history

성공한 응답에는 Versions나 DeleteMarkers 항목이 없습니다. 이제 rb로 빈 버킷을 삭제하세요.

aws s3 rb s3://labex-report-history

출력은 remove_bucket: labex-report-history입니다. 스토리지가 계속 응답하는지 확인하세요.

aws s3 ls

남은 버킷이 없고 AWS View에 No buckets가 표시됩니다. 로컬 보고서 파일은 계속 사용할 수 있습니다. 실습에 속한 S3 리소스와 기록만 삭제되었습니다.

요약

게시하기 전에 버킷 버전 관리를 활성화하고 현재 키와 이전 버전 ID를 구분했습니다. 이전 버전을 검색하여 바이트를 확인하고 게시함으로써 덮어쓴 보고서를 복구했습니다. 그런 다음 삭제 마커를 생성하고 제거하여 다른 버전을 업로드하지 않고 일반 접근을 복구했습니다.

버전 관리는 기록을 보존하지만 명시적인 버전 삭제를 되돌릴 수 있게 하지는 않습니다. 실습에 속한 모든 버전을 확인하고 영구 삭제한 뒤 남은 마커가 없는지 확인하고 빈 버킷을 삭제하며 마쳤습니다.