tencent cloud

Cloud Object Storage

DocumentaçãoCloud Object Storage실습 튜토리얼데이터 보안데이터 오류 삭제 방지 및 삭제 복구 실천 방안

데이터 오류 삭제 방지 및 삭제 복구 실천 방안

Baixar
Modo Foco
Tamanho da Fonte
Última atualização: 2026-05-21 16:16:05

소개

클라우드 스토리지 분야에서 데이터 보안은 항상 최우선 과제입니다. Tencent Cloud 객체 스토리지 서비스(COS)는 오랜 기간 데이터 보안과 무결성을 보장하기 위해 데이터 보안에 대한 탐구와 실천을 지속해 왔습니다. 본 문서에서는 데이터의 오삭제 방지와 오삭제 후 복구 방법을 상세히 설명합니다.

데이터 오삭제 방지

배경

기업의 일상 운영에서 데이터 보안은 내부 직원의 오조작, 악성 소프트웨어 공격, 심지어 외부 해커 침입 등 다양한 위협에 직면하고 있습니다. 이러한 위험은 중요 데이터의 유실 또는 유출로 이어져 헤아릴 수 없는 손실을 초래할 수 있습니다.

상세 소개 및 조작 단계

COS는 접근 제어, 객체 잠금, MFA 작업 보호, 버전 관리, 버킷 복제 등의 기능으로 데이터 보안의 첫 번째 방어선을 구축하여 오삭제 위험을 줄입니다. 관련 기능의 소개와 작업 단계는 아래에서 자세히 설명합니다.
접근 제어는 인가된 사용자만 데이터 삭제와 같은 민감한 작업을 수행할 수 있도록 보장합니다.
객체 잠금은 데이터가 기록된 후에는 설정된 잠금 기간이 만료되지 않는 한 수정하거나 삭제할 수 없도록 보장합니다.
MFA 작업 보호는 사용자의 민감한 작업에 추가적인 보안 계층을 제공하며, 민감한 작업 시 시스템은 이차 인증을 요구합니다.
버전 관리버킷 복제는 데이터를 효과적으로 백업하고 오삭제 사건을 사전에 방지할 수 있습니다.




접근 제어

개요

기본적으로 COS 리소스(버킷 및 객체 포함)는 개인 읽기 권한으로 설정되어 있으며, 리소스 소유자 또는 권한이 부여된 사용자만 액세스할 수 있습니다. 누가 어떤 조건에서 어떤 리소스에 대해 어떤 작업을 수행할 수 있는지를 규정하려면 최소 권한 원칙에 따라 다양한 권한 설정 방식으로 접근 제어를 구현할 수 있습니다. 정책 설정 방식에 따라 리소스 기반사용자 기반으로 구분되며, 각각 버킷 정책, 버킷 ACL, 객체 ACL사용자 정책(CAM 정책)이 포함됩니다. 정책에 대한 자세한 내용은 접근 제어 기본 개념을 참조하십시오.



COS는 아래 작업을 통해 데이터의 안전성과 유연성을 보장하며, 사용자가 실제 비즈니스 요구에 따라 다른 사용자 및 애플리케이션 시나리오에 적합한 접근 권한을 구성할 수 있도록 지원합니다.




작업 가이드

버킷 정책
버킷 정책을 통해 CAM 서브 계정, 다른 루트 계정, 심지어 익명 사용자에게 버킷 및 객체 작업 권한을 부여할 수 있습니다. COS는 콘솔, API, SDK 등 다양한 방식으로 버킷 정책 추가를 지원합니다. 아래는 콘솔 그래픽 인터페이스의 작업 단계를 소개하며, 더 많은 사용 방법과 설명은 버킷 정책을 참조하십시오.
1. COS 콘솔에 로그인합니다.
2. 대상 버킷의 권한 관리로 이동하여 정책 권한 설정 > 그래픽 설정을 선택한 후 정책 추가를 클릭하고 팝업 창에서 정책을 구성합니다.
3. 템플릿 선택(선택 사항): COS는 다양한 정책 템플릿을 제공하여 버킷 정책을 빠르게 구성할 수 있도록 지원하며, 필요에 따라 선택할 수 있습니다. 자세한 작업 단계 및 구성 설명은 버킷 정책 추가를 참조하십시오.



4. 정책 구성: 추천 템플릿이 요구 사항에 부합하지 않는 경우, 이 단계에서 권한 부여된 사용자, 리소스 및 작업, 조건(선택 사항)을 추가하거나 삭제하여 정책 내용을 조정할 수 있습니다.



버킷 ACL 및 객체 ACL
ACL은 XML 언어로 기술되며, 리소스와 연관된 특정 권한 부여 대상자 및 부여 권한 목록으로, 익명 사용자 또는 다른 루트 계정에 기본 읽기/쓰기 권한을 부여하는 것을 지원합니다. 아래는 버킷 ACL 예시로, 버킷 소유자(사용자 UIN: 100000000001)의 완전 제어 권한을 설명합니다. 더 많은 내용과 예시는 ACL을 참조하십시오.
<AccessControlPolicy>
<Owner>
<ID>qcs::cam::uin/100000000001:uin/100000000001</ID>
</Owner>
<AccessControlList>
<Grant>
<Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="RootAccount">
<ID>qcs::cam::uin/100000000001:uin/100000000001</ID>
</Grantee>
<Permission>FULL_CONTROL</Permission>
</Grant>
</AccessControlList>
</AccessControlPolicy>
사용자 정책(CAM 정책)
CAM에서 루트 계정 아래의 서로 다른 유형의 사용자에게 각기 다른 권한을 부여할 수 있습니다. 사전 설정 정책을 연동하여 권한 부여하거나, 직접 사용자 정책을 작성한 후(정책 작성 방법은 요소 참조 참조) 지정된 신분에 연동하여 계정 소유 사용자의 접근 관리를 구현할 수 있습니다. 아래는 사전 설정 정책을 통해 사용자를 연동하는 작업 단계를 소개하며, 자세한 내용은 사용자 정책 문서를 참조하십시오.
1. CAM 콘솔에 로그인합니다.
2. 정책 페이지로 이동하여 사전 설정 정책을 선택하고 COS를 검색 필터링한 후 사용자 그룹/역할 연동을 클릭합니다.
3. 팝업 페이지에서 연동할 사용자를 선택하고 확인을 클릭하면 사용자 연동 작업이 완료됩니다.

객체 잠금

개요

COS의 객체 잠금(WORM: Write Once Read More) 기능은 버킷 내 객체에 대한 데이터 보호 메커니즘을 제공합니다. 보존 시간 설정을 통해 해당 기간 동안 객체를 읽기 전용 상태로 잠그고, 덮어쓰기 또는 삭제를 금지합니다. 이 기능은 중요한 민감 데이터를 보호하는 데 매우 적합하며, 데이터가 업로드되면 일정 기간 동안 무결성과 안전성이 보장되어 권한 없는 변경 또는 삭제를 방지합니다.
설명:
해당 기능은 화이트리스트를 통해 제공됩니다. 기능을 활성화하려면 문의하기 바랍니다.




작업 가이드

COS 콘솔에서 객체 잠금을 활성화하는 작업 단계는 다음과 같습니다. 더 많은 설명 및 제한 사항은 객체 잠금 설정을 참조하십시오.
1. COS 콘솔에 로그인합니다.
2. 대상 버킷의 보안 관리에 진입하여 객체 잠금을 선택하고 편집을 클릭한 후 보존 시간 설정을 하고 저장을 클릭하면 객체 잠금 기능을 활성화할 수 있습니다.

MFA 작업 보호

개요

작업 보호는 사용자가 민감한 작업을 수행할 때 제공되는 추가 보안 계층으로, MFA는 그중 하나의 보호 유형입니다. MFA를 활성화하면 사용자가 데이터 삭제 또는 주요 구성 변경과 같은 민감한 작업을 수행할 때 추가 인증 정보를 제공해야 합니다. 이는 권한 없는 접근 또는 오조작으로 인한 오삭제를 방지하기 위한 중요한 보안 계층을 추가합니다. 자세한 내용은 작업 보호가상 MFA 장치 바인딩을 참조하십시오.

작업 가이드

1. 계정 센터 콘솔에 로그인하여 보안 설정 페이지로 이동합니다.
2. 기본 설정에서 MFA 장치를 찾아 바인딩을 클릭한 후 페이지 안내에 따라 인증을 완료합니다.

3. 필요에 따라 다른 MFA 장치를 선택하고 페이지 안내에 따라 계정 바인딩 작업을 완료한 후 작업 보호를 선택하고 제출을 클릭하면 바인딩을 완료할 수 있습니다.
4. 파일 목록 페이지로 진입하여 버킷 비우기를 클릭하면 MFA 검증 이차 확인 팝업이 표시되어 오삭제 위험을 추가로 방지합니다.

버전 관리

개요

버전 관리를 활성화하면 모든 동일한 이름의 파일에 대한 쓰기 작업은 새로운 버전 추가로 처리되며, 삭제 작업은 삭제 표시 추가와 동일합니다. 버전 ID를 지정하여 과거 버전의 데이터를 조회, 삭제 또는 복원할 수 있어 데이터의 롤백 작업이 가능합니다. 자세한 내용은 버전 관리 개요를 참조하십시오.




작업 가이드

COS는 콘솔, API, SDK 방식을 통해 버전 관리 기능을 활성화할 수 있습니다. 본 문서는 콘솔에서 버전 관리 활성화하는 단계만 소개하며, 기타 방식 및 설명은 버전 관리 구성을 참조하십시오.
1. COS 콘솔에 로그인합니다.
2. 대상 버킷의 내결함성 및 재해 복구 관리에 진입하여 버전 관리를 선택하고 편집을 클릭하여 상태를 활성화한 후 저장하면 버전 관리가 활성화됩니다. 자세한 작업 단계 및 제한 사항은 버전 관리 설정을 참조하십시오.
3. 활성화 후 파일 목록 페이지로 진입하여 이전 버전 나열을 클릭하면 모든 버전을 확인하고 관리할 수 있습니다.

버킷 복제

개요

COS의 버킷 복제 기능은 사용자가 모든 증분 파일을 전용 회선을 통해 다른 도시의 데이터 센터로 복제하여 이기간 재해 복구를 구현합니다. 동일 리전 및 교차 리전 백업을 지원합니다. 주 버킷의 데이터가 삭제된 경우 백업 버킷에서 일괄 복사 방식으로 데이터를 복구할 수 있습니다. 자세한 내용은 버킷 복제 개요를 참조하십시오.




작업 가이드

1. COS 콘솔에 로그인합니다.
2. 대상 버킷의 내결함성 및 재해 복구 관리에 진입하여 버킷 복제를 선택하고 규칙 추가를 클릭합니다. 구성 항목 설명은 버킷 복제 설정을 참조하십시오.
3. 전체 버킷 또는 지정 범위 내 객체를 대상 버킷에 복사할 수 있습니다.
4. 동일 리전 복제 및 교차 리전 복제를 지원하며, 확인을 클릭하면 버킷 복제 규칙 생성을 완료할 수 있습니다.
5. 목록에서 구성된 규칙을 확인할 수 있습니다. 구성 후 시스템은 규칙에 따라 소스 버킷의 증분 객체를 대상 버킷으로 자동 및 비동기로 복제합니다.

데이터 오삭제 복구

데이터 보안에 첫 번째 방어선이 있더라도 데이터 오삭제의 위협은 여전히 무시할 수 없습니다. 운영 실수든 시스템 장애로 인한 데이터 손실이든 기업에 심각한 영향을 미칠 수 있습니다. 이러한 상황에서 데이터의 추적 가능성이 매우 중요해집니다. COS는 로그 관리 기능을 제공하여 사용자가 매번의 데이터 접근을 실시간으로 추적, 기록 및 분석할 수 있도록 하여 이상 이벤트 추적을 용이하게 하고 데이터의 추적 가능성을 보장합니다.
로그 검색인벤토리를 통해 삭제 이벤트를 신속하게 찾는 방법을 소개합니다. 자세한 내용 및 단계는 로그 저장 설정, 로그 검색 설정인벤토리 설정을 참조하십시오.

로그 검색을 통한 추적

1. COS 콘솔에 로그인합니다.
2. 로그 검색 페이지에 진입하여 검색 조건 추가를 선택하고 reqMethod에 DELETE 포함을 설정한 후 시간 범위를 선택합니다.
3. 검색을 클릭하면 DELETE 요청이 실행된 결과를 조회할 수 있습니다. 아래 그림과 같이 txttt 파일이 5월 16일 20시 22분에 사용자 100xxxxxxxxx에 의해 삭제되었습니다.


인벤토리 추적

삭제된 데이터를 인벤토리 기능으로 추적하려면 버킷에 버전 관리가 활성화되어 있어야 합니다.
1. COS 콘솔에 로그인합니다.
2. 인벤토리 설정 페이지에 진입하여 인벤토리 추가 또는 기존 인벤토리 선택으로 즉시 인벤토리를 생성합니다. 단계는 즉시 인벤토리 생성을 참조하십시오.
3. 인벤토리 보고서 저장 경로를 참조하여 필요에 따라 대상 버킷 및 인벤토리 보고서 생성 경로를 선택합니다. 추가된 인벤토리의 기본 구성 정보는 다음과 같습니다.



4. 인벤토리 구성 과정에서 실제 시나리오에 따라 필터 조건을 작성할 수 있으며, 객체 버전은 "모든 버전 포함"을 선택해야 합니다. 기타 매개변수 구성 설명은 인벤토리 설정을 참조하십시오. 다음은 일반적인 시나리오 예시입니다:
특정 접두사 객체를 삭제한 경우 파일 범위에서 "지정 파일 접두사"를 선택하고 해당 접두사를 작성하는 것이 좋습니다.
만약 데이터 삭제 작업이 특정 시점 이후 또는 지정된 범위 내에서 발생한 것을 알고 있다면, 필터 시간에서 "지정된 시점 이후의 모든 객체" 또는 "지정된 시간 범위 내의 객체"를 선택하고 범위를 작성하는 것이 좋습니다.

5. 인벤토리 작업 생성 후 인벤토리 미리 보기를 클릭합니다.

6. 날짜 및 인벤토리 디렉터리를 필터링한 후 필요한 인벤토리를 찾아 인벤토리 결과 보기를 클릭합니다.



7. 다운로드를 클릭하면 생성된 인벤토리 파일 정보를 다운로드할 수 있으며, 다운로드 후 압축 해제가 필요합니다.



8. 압축 해제 후 CSV 파일은 객체 정보를 설명하며, IsDeleteMarker 및 LastModifiedDate를 통해 삭제된 객체를 확인할 수 있습니다. CSV 파일의 필드 이름은 manifest.json 파일의 "fileSchema"에서 확인 가능하며, 추가 필드 의미 및 설명은 인벤토리 매개변수를 참조하십시오.




데이터 오류로 인한 삭제 복구

데이터의 복구 가능성다중 버전을 기반으로 버킷 복제 등 일련의 기능 및 방법을 제공하여 오삭제 복구 체계를 강화하는 것입니다. 최신 버전이 실수로 삭제되거나 덮어쓰여져도 이전 버전 중 어느 것으로든 복구할 수 있습니다. 위에서 이미 다중 버전 기반의 버전 관리, 버킷 복제를 소개했으므로 여기서는 더 이상 설명하지 않겠습니다.
COS는 다음 기능 또는 방법을 사용하여 실수로 삭제된 데이터를 복구할 수 있습니다: 버킷 복제+일괄 처리, 인벤토리+일괄 처리, SDK, API를 통해 데이터 복구를 구현할 수 있으며, 실제 비즈니스 시나리오에 따라 선택할 수 있습니다.

버킷 복제 + 일괄 처리 복구

데이터가 실수로 삭제된 경우, 이전에 소스 버킷에서 버킷 복제 규칙을 구성하고 데이터를 백업 버킷에 복제해 두었습니다. 이때 백업 버킷에서 일괄 데이터 복제 작업 생성을 통해 삭제된 데이터를 복구할 수 있습니다. 자세한 내용은 일괄 처리를 참조하십시오. 작업 단계는 다음과 같습니다:
1. COS 콘솔에 로그인합니다.
2. 일괄 처리 > 일괄 작업 생성를 클릭합니다.
3. 작업 생성 인터페이스에서 작업 이름을 작성하고 작업 유형으로 일괄 데이터 복제를 선택합니다. 기타 구성 항목은 일괄 처리 작업 단계를 참조하여 필요에 따라 구성하십시오.
4. 정보를 확인한 후 생성 및 시작을 클릭하면 일괄 데이터 복제 작업 생성을 완료할 수 있습니다.
5. 작업 목록에서 생성된 작업의 상태를 확인할 수 있으며, 복제 또는 작업 취소를 지원합니다.

인벤토리+일괄 처리를 통한 복구

인벤토리를 통해 삭제된 객체를 확인한 후, 동일하게 일괄 처리를 통해 삭제된 데이터를 복구할 수 있습니다. 자세한 내용은 일괄 처리를 참조하십시오. 작업 단계는 다음과 같습니다:
1. COS 콘솔에 로그인합니다.
2. 인벤토리를 통해 삭제된 객체를 확인한 후, csv 파일을 하나 보관하여 특정 버킷에 업로드합니다. csv 파일의 헤더 형식은 다음 그림과 같습니다.
A열: 버킷 이름을 나열합니다. 예를 들어 examplebucket-1250000000.
B열: 현재 버킷에서 복구 대상 객체, 즉 객체 키를 나열합니다. 예를 들어 image.png.
C열: 복구 대상 객체에 해당하는 버전 ID를 나열합니다.

3. 일괄 처리 > 일괄 작업 생성를 클릭합니다.
4. 작업 생성 인터페이스에서 작업 이름을 작성하고 작업 유형으로 일괄 데이터 복제를 선택합니다. 인벤토리 보고서는 "있음"을 선택하고, 인벤토리 경로는 2단계에서 업로드한 csv 파일 저장 경로를 선택합니다. 기타 구성 항목은 일괄 처리를 참조하여 필요에 따라 구성하십시오.
5. 정보를 확인한 후 생성 및 시작을 클릭하면 일괄 데이터 복제 작업 생성을 완료할 수 있습니다.
6. 작업 목록에서 생성된 작업의 상태를 확인할 수 있으며, 복제 또는 작업 취소를 지원합니다.

SDK를 통해 복원

COS SDK는 버전 관리를 기반으로 데이터를 신속하게 일괄 복구하는 방법을 제공합니다. 핵심 로직은 모든 대상 객체를 순회하여 첫 번째 삭제되지 않은 버전의 데이터 객체를 찾아 복사하는 것입니다. 따라서 이 방법을 구현하려면 버킷에서 버전 관리 기능이 활성화되어 있어야 합니다.
현재 Go SDK, Java SDK, Python SDK는 원본 버킷에서의 일괄 복구 및 백업 버킷에서의 일괄 복구 방식을 위한 예제 코드를 제공하고 있습니다. 더 많은 SDK가 지속적으로 최적화 중이니 기대해 주시기 바랍니다.

예시 코드

Go(원본 버킷에서 복구)
Go(백업 버킷에서 복구)
Java (원본 버킷 복구)
Java(백업 버킷에서 복구)
Python(원본 버킷에서 복구)
Python(백업 버킷에서 복구)
작업 단계는 다음과 같습니다.
1. COS의 XML Go SDK 소스 코드가 다운로드되었고 환경이 설치되었는지 확인하십시오. 자세한 내용은 Go SDK 빠른 시작을 참조하십시오.
2. 다음 코드를 복사하고, Git 예제를 확인하려면 GitHub를 방문하십시오.
package main

import (
"context"
"fmt"
"os"

"net/url"

"net/http"

"github.com/tencentyun/cos-go-sdk-v5"
"github.com/tencentyun/cos-go-sdk-v5/debug"
)

func log_status(err error) {
if err == nil {
return
}
if cos.IsNotFoundError(err) {
// WARN
fmt.Println("WARN: Resource is not existed: %v", err)
} else if e, ok := cos.IsCOSError(err); ok {
fmt.Printf("ERROR: Code: %v\\n", e.Code)
fmt.Printf("ERROR: Message: %v\\n", e.Message)
fmt.Printf("ERROR: Resource: %v\\n", e.Resource)
fmt.Printf("ERROR: RequestId: %v\\n", e.RequestID)
// ERROR
} else {
fmt.Printf("ERROR: %v\\n", err)
// ERROR
}
}

var (
srcBucket = "test-1259654469"
srcBucketRegion = "ap-guangzhou"

srcCosClient *cos.Client

copyObjs = map[string]struct{}{}
)

func newClient(bucket, region string) *cos.Client {
u, _ := url.Parse(fmt.Sprintf("https://%v.cos.%v.myqcloud.com", bucket, region))
b := &cos.BaseURL{
BucketURL: u,
}
return cos.NewClient(b, &http.Client{
Transport: &cos.AuthorizationTransport{
SecretID: os.Getenv("COS_SECRETID"),
SecretKey: os.Getenv("COS_SECRETKEY"),
Transport: &debug.DebugRequestTransport{
RequestHeader: false,
RequestBody: false,
ResponseHeader: false,
ResponseBody: false,
},
},
})
}

func recoverObj(key, versionId string) {
sourceURL := fmt.Sprintf("%v.cos.%v.myqcloud.com/%v?versionId=%v", srcBucket, srcBucketRegion, key, versionId)
_, _, err := srcCosClient.Object.MultiCopy(context.Background(), key, sourceURL, nil)
if err != nil {
log_status(err)
}
}

func main() {
srcCosClient = newClient(srcBucket, srcBucketRegion)

keyMarker := ""
versionIdMarker := ""
isTruncated := true
opt := &cos.BucketGetObjectVersionsOptions{
EncodingType: "url",
}
for isTruncated {
opt.KeyMarker = keyMarker
opt.VersionIdMarker = versionIdMarker
v, _, err := srcCosClient.Bucket.GetObjectVersions(context.Background(), opt)
if err != nil {
log_status(err)
break
}
for _, vc := range v.DeleteMarker {
if vc.IsLatest {
// 객체가 삭제되었으며, 복구가 필요합니다
copyObjs[vc.Key] = struct{}{}
}
}
for _, vc := range v.Version {
// 최신으로 복구
if _, ok := copyObjs[vc.Key]; ok {
delete(copyObjs, vc.Key)
key, _ := cos.DecodeURIComponent(vc.Key)
fmt.Printf("key: %v, versionId: %v\\n", key, vc.VersionId)
recoverObj(key, vc.VersionId)
}
}
keyMarker = v.NextKeyMarker
versionIdMarker = v.NextVersionIdMarker
isTruncated = v.IsTruncated
}
}
3. 실제 상황에 따라 지정된 매개변수를 작성하십시오: 소스 버킷 이름, 소스 버킷의 region, secretIdsecretKey를 포함합니다.
주의:
소스 버킷에서 버전 관리 기능이 활성화되어야 합니다.
4. object_recover2.go 파일을 실행하면 성공적으로 삭제된 데이터를 복구할 수 있습니다.
작업 단계는 다음과 같습니다.
1. COS의 XML Go SDK 소스 코드가 다운로드되었고 환경이 설치되었는지 확인하십시오. 자세한 내용은 Go SDK 빠른 시작을 참조하십시오.
2. 다음 코드를 복사하고, Git 예제를 확인하려면 GitHub를 방문하십시오.
package main

import (
"context"
"fmt"
"os"

"net/url"

"net/http"

"github.com/tencentyun/cos-go-sdk-v5"
"github.com/tencentyun/cos-go-sdk-v5/debug"
)

func log_status(err error) {
if err == nil {
return
}
if cos.IsNotFoundError(err) {
// WARN
fmt.Println("WARN: Resource is not existed: %v", err)
} else if e, ok := cos.IsCOSError(err); ok {
fmt.Printf("ERROR: Code: %v\\n", e.Code)
fmt.Printf("ERROR: Message: %v\\n", e.Message)
fmt.Printf("ERROR: Resource: %v\\n", e.Resource)
fmt.Printf("ERROR: RequestId: %v\\n", e.RequestID)
// ERROR
} else {
fmt.Printf("ERROR: %v\\n", err)
// ERROR
}
}

var (
srcBucket = "test-1259654469"
dstBucket = "test2-1259654469"
srcBucketRegion = "ap-guangzhou"
dstBucketRegion = "ap-guangzhou"

srcCosClient *cos.Client
dstCosClient *cos.Client
)

func newClient(bucket, region string) *cos.Client {
u, _ := url.Parse(fmt.Sprintf("https://%v.cos.%v.myqcloud.com", bucket, region))
b := &cos.BaseURL{
BucketURL: u,
}
return cos.NewClient(b, &http.Client{
Transport: &cos.AuthorizationTransport{
SecretID: os.Getenv("COS_SECRETID"),
SecretKey: os.Getenv("COS_SECRETKEY"),
Transport: &debug.DebugRequestTransport{
RequestHeader: false,
RequestBody: false,
ResponseHeader: false,
ResponseBody: false,
},
},
})
}

func recoverObj(key, versionId string) {
sourceURL := fmt.Sprintf("%v.cos.%v.myqcloud.com/%v?versionId=%v", srcBucket, srcBucketRegion, key, versionId)
_, _, err := dstCosClient.Object.MultiCopy(context.Background(), key, sourceURL, nil)
if err != nil {
log_status(err)
}
}

func main() {
srcCosClient = newClient(srcBucket, srcBucketRegion)
dstCosClient = newClient(dstBucket, dstBucketRegion)

keyMarker := ""
versionIdMarker := ""
isTruncated := true
opt := &cos.BucketGetObjectVersionsOptions{
EncodingType: "url",
}
var preKey string
for isTruncated {
opt.KeyMarker = keyMarker
opt.VersionIdMarker = versionIdMarker
v, _, err := srcCosClient.Bucket.GetObjectVersions(context.Background(), opt)
if err != nil {
log_status(err)
break
}
for _, vc := range v.Version {
// 최신 deletemarker가 아닌 객체
if preKey != vc.Key {
preKey = vc.Key
key, _ := cos.DecodeURIComponent(vc.Key)
fmt.Printf("key: %v, versionId: %v, lastest: %v\\n", key, vc.VersionId, vc.IsLatest)
recoverObj(key, vc.VersionId)
}
}
keyMarker = v.NextKeyMarker
versionIdMarker = v.NextVersionIdMarker
isTruncated = v.IsTruncated
}
}
3. 실제 상황에 따라 지정된 매개변수를 작성하십시오: 백업 버킷 이름, 대상 버킷 이름, 백업 버킷의 region, 대상 버킷의 region, secretIdsecretKey를 포함합니다.
주의:
백업 버킷 및 대상 버킷 모두 버전 관리 기능이 활성화되어야 합니다.
4. object_recover.go 파일을 실행하면 성공적으로 삭제된 데이터를 복구할 수 있습니다.
작업 단계는 다음과 같습니다.
1. COS의 XML Java SDK 소스 코드가 다운로드되었고 환경이 설치되었는지 확인하십시오. 자세한 내용은 Java SDK 빠른 시작을 참조하십시오.
2. 다음 코드를 복사하고, Git 예제를 확인하려면 GitHub를 방문하십시오.
import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.exception.CosClientException;
import com.qcloud.cos.exception.CosServiceException;
import com.qcloud.cos.http.HttpProtocol;

import com.qcloud.cos.model.COSVersionSummary;
import com.qcloud.cos.model.CopyObjectRequest;
import com.qcloud.cos.model.CopyObjectResult;
import com.qcloud.cos.model.ListVersionsRequest;
import com.qcloud.cos.model.VersionListing;
import com.qcloud.cos.region.Region;

import java.util.List;
import java.util.Objects;

public class RecoverObjectsDemo {
private static String secretId = "************************************";
private static String secretKey = "************************************";
private static String bucketName = "examplebucket-12500000000";

private static String bucketRegion = "ap-guangzhou";

private static COSClient cosClient = createCli();

public static void main(String[] args) {
listAndRecoverObjs();
}

private static COSClient createCli() {
// 1 사용자 신원 정보 초기화(secretId, secretKey)
COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);

// 2 버킷의 지역을 설정합니다. COS 리전의 약칭은 https://www.qcloud.com/document/product/436/6224를 참조하십시오.
ClientConfig clientConfig = new ClientConfig(new Region(bucketRegion));

clientConfig.setHttpProtocol(HttpProtocol.https);
// cos 클라이언트 생성
return new COSClient(cred, clientConfig);
}

private static void listAndRecoverObjs() {
ListVersionsRequest listVersionsRequest = new ListVersionsRequest();
listVersionsRequest.setBucketName(bucketName);
listVersionsRequest.setPrefix("");
listVersionsRequest.setMaxResults(1000);

VersionListing versionListing = null;

String recover_key = "";
String recover_versionid = "";
boolean has_recovered = false;

do {
try {
versionListing = cosClient.listVersions(listVersionsRequest);
} catch (CosServiceException e) {
e.printStackTrace();
return;
} catch (CosClientException e) {
e.printStackTrace();
return;
}

List<COSVersionSummary> cosVersionSummaries = versionListing.getVersionSummaries();
for (COSVersionSummary cosVersionSummary : cosVersionSummaries) {
String key = cosVersionSummary.getKey();
String versionId = cosVersionSummary.getVersionId();
boolean isDeleteMarker = cosVersionSummary.isDeleteMarker();
boolean isLatest = cosVersionSummary.isLatest();
String msg = String.format("list obj, Key[%s], Version[%s], isDeleteMarker[%s], isLatest[%s]", key, versionId, isDeleteMarker, isLatest);
System.out.println(msg);
if (isDeleteMarker && isLatest) {
// 삭제 표시된 최신 versionid의 객체만 복구
recover_key = key;
has_recovered = false;
} else if (!isDeleteMarker && !isLatest && Objects.equals(key, recover_key) && !has_recovered) {
// 최신 버전도 아니고 삭제 표시도 아닌 경우, key가 recover_key와 같다면 복구할 데이터 버전을 찾았다는 의미입니다. 복구 로직을 실행합니다.
recover_versionid = versionId;
recoverObj(recover_key, recover_versionid);
has_recovered = true;
}
}

String keyMarker = versionListing.getNextKeyMarker();
String versionIdMarker = versionListing.getNextVersionIdMarker();

listVersionsRequest.setKeyMarker(keyMarker);
listVersionsRequest.setVersionIdMarker(versionIdMarker);

} while (versionListing.isTruncated());
}

private static void recoverObj(String srcKey, String srcVersionId) {
String dstKey = srcKey;
CopyObjectRequest copyObjectRequest = new CopyObjectRequest(new Region(bucketRegion), bucketName, srcKey, bucketName, dstKey);
copyObjectRequest.setSourceVersionId(srcVersionId);
try {
CopyObjectResult result = cosClient.copyObject(copyObjectRequest);
String msg = String.format("finish recover by copying obj, srcKey[%s], srcVersion[%s], dstKey[%s], dstVersion[%s]", srcKey, srcVersionId, dstKey, result.getVersionId());
System.out.println(msg);
} catch (CosServiceException cse) {
cse.printStackTrace();
} catch (CosClientException cce) {
cce.printStackTrace();
}
}
}
3. 실제 상황에 따라 지정된 매개변수를 작성하십시오: 소스 버킷 이름, 소스 버킷의 region, secretIdsecretKey를 포함합니다.
주의:
소스 버킷에서 버전 관리 기능이 활성화되어야 합니다.
4. RecoverObjectsDemo.java 파일을 실행합니다. 실행이 성공하면 삭제된 데이터를 복구할 수 있습니다.
작업 단계는 다음과 같습니다.
1. COS의 XML Java SDK 소스 코드가 다운로드되었고 환경이 설치되었는지 확인하십시오. 자세한 내용은 Java SDK 빠른 시작을 참조하십시오.
2. 다음 코드를 복사하고, Git 예제를 확인하려면 GitHub를 방문하십시오.
import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.exception.CosClientException;
import com.qcloud.cos.exception.CosServiceException;
import com.qcloud.cos.http.HttpProtocol;
import com.qcloud.cos.model.CopyObjectRequest;
import com.qcloud.cos.model.CopyObjectResult;
import com.qcloud.cos.model.COSVersionSummary;
import com.qcloud.cos.model.ListVersionsRequest;
import com.qcloud.cos.model.VersionListing;
import com.qcloud.cos.region.Region;

import java.util.ArrayList;
import java.util.List;

public class RecoverObjectsDemo2 {
private static String secretId = "************************************";
private static String secretKey = "************************************";
private static String srcbucketName = "examplebucket-backup-12500000000";
private static String dstbucketName = "examplebucket-dest-12500000000";
private static String srcbucketRegion = "ap-guangzhou";
private static String dstbucketRegion = "ap-shanghai";

private static List<String> copyobjs = new ArrayList<>();

private static COSClient srcCosClient = createCli(srcbucketRegion);
private static COSClient dstCosClient = createCli(dstbucketRegion);

public static void main(String[] args) {
listAndRecoverObjs();
}

private static COSClient createCli(String region) {
// 1 사용자 신원 정보 초기화(secretId, secretKey)
COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);

// 2 버킷의 지역을 설정합니다. COS 리전의 약칭은 https://www.qcloud.com/document/product/436/6224를 참조하십시오.
ClientConfig clientConfig = new ClientConfig(new Region(region));

clientConfig.setHttpProtocol(HttpProtocol.https);
// cos 클라이언트 생성
return new COSClient(cred, clientConfig);
}

private static void recoverObj(String srcKey, String srcVersionId) {
String dstKey = srcKey;
CopyObjectRequest copyObjectRequest = new CopyObjectRequest(new Region(srcbucketRegion), srcbucketName, srcKey, dstbucketName, dstKey);
copyObjectRequest.setSourceVersionId(srcVersionId);
try {
CopyObjectResult result = dstCosClient.copyObject(copyObjectRequest);
String msg = String.format("finish recover by copying obj, srcBucket[%s], srcKey[%s], srcVersion[%s], dstBucket[%s], dstKey[%s], dstVersion[%s]",
srcbucketName, srcKey, srcVersionId, dstbucketName, dstKey, result.getVersionId());
System.out.println(msg);
copyobjs.add(srcKey);
} catch (CosServiceException cse) {
cse.printStackTrace();
} catch (CosClientException cce) {
cce.printStackTrace();
}
}

private static void listAndRecoverObjs() {
ListVersionsRequest listVersionsRequest = new ListVersionsRequest();
listVersionsRequest.setBucketName(srcbucketName);
listVersionsRequest.setPrefix("");

VersionListing versionListing = null;

do {
try {
versionListing = srcCosClient.listVersions(listVersionsRequest);
} catch (CosServiceException e) {
e.printStackTrace();
return;
} catch (CosClientException e) {
e.printStackTrace();
return;
}

List<COSVersionSummary> cosVersionSummaries = versionListing.getVersionSummaries();
for (COSVersionSummary cosVersionSummary : cosVersionSummaries) {
String key = cosVersionSummary.getKey();
String versionId = cosVersionSummary.getVersionId();
boolean isDeleteMarker = cosVersionSummary.isDeleteMarker();
boolean isLatest = cosVersionSummary.isLatest();
if (!isDeleteMarker) {
if (isLatest) {
System.out.println("latest object, will copy " + "key:" + key + ", versionId:" + versionId);
recoverObj(key, versionId);
} else {
if (!copyobjs.contains(key)) {
System.out.println("not latest object, will copy " + "key:" + key + ", versionId:" + versionId);
recoverObj(key, versionId);
}
}
}
}

String keyMarker = versionListing.getNextKeyMarker();
String versionIdMarker = versionListing.getNextVersionIdMarker();

listVersionsRequest.setKeyMarker(keyMarker);
listVersionsRequest.setVersionIdMarker(versionIdMarker);

} while (versionListing.isTruncated());
System.out.println("--------------------------------------");
}
}
3. 실제 상황에 따라 지정된 매개변수를 작성하십시오: 백업 버킷 이름, 대상 버킷 이름, 백업 버킷의 region, 대상 버킷의 region, secretIdsecretKey를 포함합니다.
주의:
백업 버킷 및 대상 버킷 모두 버전 관리 기능이 활성화되어야 합니다.
4. RecoverObjectsDemo2.java 파일을 실행합니다. 실행이 성공하면 삭제된 데이터를 복구할 수 있습니다.
작업 단계는 다음과 같습니다.
1. COS의 XML Python SDK 소스 코드가 다운로드되었고 환경이 설치되었는지 확인하십시오. 자세한 내용은 Python SDK 빠른 시작을 참조하십시오.
2. 다음 코드를 복사하고, Git 예제를 확인하려면 GitHub를 방문하십시오.

# -*- coding=utf-8

from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
import sys
import os
import logging

# logging.basicConfig(level=logging.INFO, stream=sys.stdout)


def _recover_main(src_region, src_bucket, secret_id, secret_key, prefix):

src_client = CosS3Client(CosConfig(Region=src_region, SecretId=secret_id, SecretKey=secret_key))

# 열거 작업의 페이징 매개변수
key_marker = ''
versionId_marker = ''
recovered_keys = set() # 복구된 객체를 기록하는 데 사용됩니다.

while True:
response = src_client.list_objects_versions(
Bucket=src_bucket,
Prefix=prefix,
KeyMarker=key_marker,
VersionIdMarker=versionId_marker,
)
delete_marker_keys = set()
# DeleteMarker에서 삭제된 객체 가져오기
if 'DeleteMarker' in response:
for version in response['DeleteMarker']:
if version['IsLatest'] == 'true':
delete_marker_keys.add(version['Key'])
if len(delete_marker_keys) == 0:
print('no delete markers found, no data to recover, continue listing')

# Version에서 복구용 객체 버전 가져오기
if 'Version' in response:
for version in response['Version']:
key = version['Key']
versionId = version['VersionId']
if key in delete_marker_keys and not key in recovered_keys:
print('recover from object: {src_bucket}/{key}(versionId:{versionId})'.format(
src_bucket=src_bucket, key=key, versionId=versionId))
try:
src_client.copy(
Bucket=src_bucket,
Key=key,
CopySource={
'Bucket': src_bucket,
'Key': key,
'Region': src_region,
'VersionId': versionId,
}
)
recovered_keys.add(key)
print("success recover object: {src_bucket}/{key}(versionId={versionId}) => {src_bucket}/{key}".format(
src_bucket=src_bucket, key=key, versionId=versionId))
except Exception as e:
print(e)
pass

if response['IsTruncated'] == 'false':
break

key_marker = response['NextKeyMarker']
versionId_marker = response['NextVersionIdMarker']


if __name__ == '__main__':
# 사용 시나리오:
# 소스 버킷 src_bucket의 삭제 표시를 통해 이전 버전에서 파일을 복구합니다.

# 소스 버킷 정보
src_region = 'ap-guangzhou' # 소스 리전
src_bucket = 'bucket-1250000000' # 소스 버킷 이름

# 환경 변수에서 비밀번호 가져오기
secret_id = os.environ['COS_SECRET_ID']
secret_key = os.environ['COS_SECRET_KEY']

prefix = '' # 복구할 객체의 접두사 설정, 예: 'docs/'. 기본값으로 빈 문자열은 모든 객체를 복구함을 의미합니다

_recover_main(
src_region=src_region,
src_bucket=src_bucket,
secret_id=secret_id,
secret_key=secret_key,
prefix=prefix
)
3. 실제 상황에 따라 지정된 매개변수를 작성하십시오: 소스 버킷 이름, 소스 버킷의 region, secretIdsecretKey를 포함합니다.
주의:
소스 버킷에서 버전 관리 기능이 활성화되어야 합니다.
4. disaster_recovery_demo.py 파일을 실행합니다. 실행이 성공하고 이상 로그 출력이 없으면 삭제된 데이터를 복구할 수 있습니다.
작업 단계는 다음과 같습니다.
1. COS의 XML Python SDK 소스 코드가 다운로드되었고 환경이 설치되었는지 확인하십시오. 자세한 내용은 Python SDK 빠른 시작을 참조하십시오.
2. 다음 코드를 복사하고, Git 예제를 확인하려면 GitHub를 방문하십시오.

# -*- coding=utf-8

from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
import sys
import os
import logging

# logging.basicConfig(level=logging.INFO, stream=sys.stdout)


def _recover_main(src_region, src_bucket, dst_region, dst_bucket, secret_id, secret_key, prefix):

src_client = CosS3Client(CosConfig(Region=src_region, SecretId=secret_id, SecretKey=secret_key))
dst_client = CosS3Client(CosConfig(Region=dst_region, SecretId=secret_id, SecretKey=secret_key))

# 열거 작업의 페이징 매개변수
key_marker = ''
versionId_marker = ''

recovered_keys = set() # 복구된 객체를 기록합니다.

while True:
response = src_client.list_objects_versions(
Bucket=src_bucket,
Prefix=prefix,
KeyMarker=key_marker,
VersionIdMarker=versionId_marker,
)

# Version에서 복구용 객체 버전 가져오기
if 'Version' in response:
for version in response['Version']:
key = version['Key']
versionId = version['VersionId']
if not key in recovered_keys:
print('recover from object: {src_bucket}/{key}(versionId={versionId})'.format(
src_bucket=src_bucket, key=key, versionId=versionId))
try:
dst_client.copy(
Bucket=dst_bucket,
Key=key,
CopySource={
'Bucket': src_bucket,
'Key': key,
'Region': src_region,
'VersionId': versionId,
}
)
recovered_keys.add(key)
print("success recover object: {src_bucket}/{key}(versionId={versionId}) => {dst_bucket}/{key}".format(
src_bucket=src_bucket, key=key, versionId=versionId, dst_bucket=dst_bucket))
except Exception as e:
print(e)
pass
if response['IsTruncated'] == 'false':
break

key_marker = response['NextKeyMarker']
versionId_marker = response['NextVersionIdMarker']


if __name__ == '__main__':
# 사용 시나리오:
# src_bucket: 백업 버킷
# dst_bucket: 대상 버킷
# 대상 버킷(dst_bucket)의 객체가 실수로 삭제된 경우, 백업 버킷(src_bucket)의 객체를 순회하여 삭제 표시가 없는 현재 버전 객체를 선택한 후 대상 버킷(dst_bucket)으로 복사하여 복구를 완료합니다.

# 백업 버킷 정보
src_region = 'ap-guangzhou'
src_bucket = 'bucket-backup-1250000000'

# 대상 버킷 정보
dst_region = 'ap-guangzhou'
dst_bucket = 'bucket-1250000000'

# 환경 변수에서 비밀번호 가져오기
secret_id = os.environ['COS_SECRET_ID']
secret_key = os.environ['COS_SECRET_KEY']

prefix = '' # 복구할 객체의 접두사 설정, 예: 'docs/'. 기본값으로 빈 문자열은 모든 객체를 복구함을 의미합니다

_recover_main(
src_region=src_region,
src_bucket=src_bucket,
dst_region=dst_region,
dst_bucket=dst_bucket,
secret_id=secret_id,
secret_key=secret_key,
prefix=prefix
)
3. 실제 상황에 따라 지정된 매개변수를 작성하십시오: 백업 버킷 이름, 대상 버킷 이름, 백업 버킷의 region, 대상 버킷의 region, secretIdsecretKey를 포함합니다.
주의:
백업 버킷 및 대상 버킷 모두 버전 관리 기능이 활성화되어야 합니다.
4. disaster_recovery_demo2.py 파일을 실행합니다. 실행이 성공적으로 완료되고 예외 로그가 출력되지 않으면 삭제된 데이터를 복구할 수 있습니다.

API를 통해 복구

버전 관리가 활성화된 후 삭제 요청은 객체를 실제로 삭제하지 않고 최신 버전으로 삭제 표시를 생성합니다. 따라서 삭제된 이전 버전을 복구하는 것은 해당 버전을 다시 최신 버전으로 만드는 것을 의미합니다. 2가지 방법이 있습니다:
1. '삭제 표시'를 삭제합니다. DeleteObject 인터페이스를 호출하여 최상위 삭제 표시를 제거하면 이전 버전이 최신 버전이 됩니다. 빠른 이동을 클릭하여 작업 안내로 이동합니다.
2. 이전 버전을 다시 복사합니다. PutObject-Copy 인터페이스를 호출하여 필요한 이전 버전을 다시 복사하면 새 버전이 생성됩니다. 빠른 이동을 클릭하여 작업 안내로 이동합니다.

방법 1: '삭제 표시' 삭제

DeleteObject 인터페이스를 호출하여 최상위 삭제 표시를 제거하면 이전 버전이 최신 버전이 됩니다.
주의:
DeleteObject 인터페이스를 호출할 때는 반드시 versionId 매개변수를 포함하고 삭제 표시의 버전 ID를 입력해야 합니다.
다음은 API 사용 및 SDK 사용 두 가지 방식을 각각 소개합니다:
1. API를 사용하는 경우, 인터페이스 문서는 영구 삭제 표시를 참조할 수 있습니다. 다음은 API 예시입니다:
2. SDK를 사용하는 경우, python을 예로 들면 예시 코드는 다음과 같습니다. 주의: 반드시 삭제 표시의 versionId를 지정해야 합니다. 자세한 내용은 Python SDK 문서를 참조하십시오.
3. 최종 효과는 아래 그림과 같습니다. 삭제 표시가 완전히 제거되고 기존 이전 버전이 자동으로 최신 버전이 되어 복구 효과를 달성합니다.




방법 2: 이전 버전을 다시 한 번 복사합니다

PutObject-Copy 인터페이스를 호출하여 필요한 이전 버전을 다시 복사하면 새 버전이 생성됩니다. 이 새 버전은 최상위에 위치하여 복구 효과를 달성합니다. 주의: 복사 인터페이스를 호출할 때 x-cos-copy-source 매개변수에서 복사할 이전 버전의 버전 ID를 명확하게 지정해야 합니다. 다음은 API 사용 및 SDK 사용 두 가지 방식을 각각 소개합니다:
1. API 사용, 인터페이스 문서 참조: 복사 시 소스 객체의 버전 지정. 주의: copy-source에 반드시 버전 번호를 포함해야 합니다. 요청 예시는 다음과 같습니다:
2. SDK를 사용하는 경우, python을 예로 들면 예시 코드는 다음과 같습니다. 주의: 반드시 복구해야 할 버전의 versionId를 지정해야 합니다. 자세한 내용은 Python SDK 문서를 참조하십시오.
3. 최종 효과는 아래 그림과 같이 최상위에 새 버전이 생성되어 복구 효과를 달성하게 됩니다.




요약

COS(Object Storage Service)는 접근 제어, 객체 잠금, MFA 작업 보호, 버전 관리, 버킷 복제, 로그 관리, 인벤토리, 일괄 처리 등의 기능을 통해 포괄적인 데이터 보호 솔루션을 제공합니다. 오삭제 방지부터 오삭제 복구까지 데이터 손실 위험을 최소화하기 위해 노력하며, 기업이 안전하고 신뢰할 수 있는 환경에서 성장할 수 있도록 지원합니다. 사용 중 제안 사항이나 문의 사항이 있으시면 언제든지 문의하기를 이용해 주십시오.

Ajuda e Suporte

Esta página foi útil?

comentários