tencent cloud

Cloud Object Storage

ドキュメントCloud Object Storage実践チュートリアルデータセキュリティ데이터 오류 삭제 방지 및 삭제 복구 실천 방안

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

ダウンロード
フォーカスモード
フォントサイズ
最終更新日: 2026-05-26 16:20:54

概要

クラウドストレージの分野において、データの安全性は常に最優先事項です。長年にわたり、Tencent Cloud COSサービスはデータセキュリティの探求と実践に取り組み、データの安全性と完全性を保証してきました。本記事では、誤削除を防止する方法誤削除後の復旧手段について詳しく説明します。

データ誤削除防止

背景

企業の日常運営において、データの安全性は内部要因による誤操作マルウェア攻撃、さらには外部ハッカーによる侵入など、様々な脅威に直面しています。これらのリスクは重要データの消失や漏洩を引き起こし、計り知れない損失をもたらす可能性があります。

詳細説明と操作手順

COSは、アクセス制御、オブジェクトロックMFA操作保護バージョニングバケットレプリケーションなどの機能により、データセキュリティの第一防衛線を構築し、誤削除リスクを低減します。関連機能の詳細説明と操作手順については、以下でご確認ください。
アクセス制御は、権限のあるユーザーのみが削除などのセンシティブな操作を実行できることを保証します。
オブジェクトロックは、データが一度書き込まれると、あらかじめ設定されたロック期間を除き、変更や削除ができません。
MFA操作保護はユーザーのセンシティブな操作に対して追加のセキュリティ保護を提供し、センシティブな操作の際にはシステムが二段階認証を要求します。
バージョニングバケットレプリケーションは、データを効果的にバックアップし、誤削除イベントの発生を事前に防ぐことができます。




アクセス制御

概要

デフォルトでは、COSリソース(バケットおよびオブジェクトを含む)はすべてプライベート権限となっており、リソース所有者または権限を付与されたユーザーのみがアクセスできます。どのような人が、どのような条件下で、どのリソースに対してどの操作を実行できるかを規定する場合、最小権限の原則に基づき、複数の権限設定方法を組み合わせてアクセス制御を実装できます。ポリシーの観点から、リソースベースユーザーベースの2つの方式に分類され、それぞれバケットポリシー、バケットACL、オブジェクトACLおよびユーザーポリシー(CAMポリシー)が含まれます。ポリシーに関する詳細は、アクセス制御の基本概念をご参照ください。



COSは以下の操作によりデータの安全性と柔軟性を確保し、実際のビジネスニーズに基づいて、異なるユーザーや応用シナリオに適切なアクセス権限を設定することを可能にします。




操作ガイド

バケットポリシー
バケットポリシーを使用して、CAMサブアカウント、他のルートアカウント、さらには匿名ユーザーに対し、バケットおよびオブジェクトの操作権限を付与できます。COSはコンソールAPISDKなど複数の方法によるバケットポリシーの追加をサポートします。以下ではコンソールのグラフィカルインターフェースでの操作手順を説明します。その他の使用方法や詳細については、バケットポリシーをご参照ください。
1. COSコンソールにログインします。
2. ターゲットバケットの権限管理に移動し、Policy権限設定 > グラフィカル設定を選択して、ポリシーの追加をクリックし、ポップアップウィンドウでポリシー設定を行います。
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で、ルートアカウント配下の異なるタイプのユーザーに対して、異なる権限を付与できます。プリセットポリシーを使用して権限を関連付けることも、独自にユーザーポリシーを作成(ポリシーの作成方法については要素リファレンスをご参照ください)して特定のIDに関連付けることもでき、これにより配下のユーザーに対するアクセス管理を実現します。以下ではプリセットポリシーをユーザーに関連付ける操作手順を説明します。詳細についてはユーザーポリシードキュメントをご参照ください。
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ファイルを1部保持し、いずれかのバケットにアップロードします。csvファイルのヘッダー形式は下図の通りです。
A列:バケット名をリストアップします。例:examplebucket-1250000000。
B列:復元対象のオブジェクト、すなわちオブジェクトキー(例:image.png)をリストアップします。
C列:復元対象のオブジェクトに対応するバージョンIDをリストアップします。

3. バッチ処理 > バッチタスクの作成をクリックします。
4. タスク作成画面で、タスク名を入力し、タスクタイプとしてバッチデータコピーを選択します。インベントリレポートで「あり」を選択し、インベントリパスには、手順2でアップロードしたcsvファイルの保存パスを選択します。その他の設定項目についてはバッチ処理を参照し、必要に応じて設定してください。
5. 情報に誤りがないことを確認し、作成と起動をクリックすることでバッチデータレプリケーションタスクの作成が完了します。
6. タスクリストで作成済みタスクのステータスを確認でき、またクローンまたはタスクのキャンセルをサポートします。

SDKによる復元

COSのSDKはバージョニングに基づいてデータを迅速に一括復元する方法を提供しており、その中核ロジックは全ての対象オブジェクトを走査し、最初の非削除バージョンのデータオブジェクトをコピーすることです。したがって、この方法を実装するには、バケットでバージョニング機能が有効化されている必要があります。
現在、Go SDK、Java SDK、Python SDKでは、ソースバケットからの一括復元とバックアップバケットからの一括復元の2種類のサンプルコードを提供しています。その他の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、secretIdおよびsecretKeyなどの指定パラメータを入力します。
注意:
ソースバケットでバージョニング機能を有効化する必要があります。
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、secretIdおよびsecretKeyなどの指定パラメータを入力します。
注意:
バックアップバケットとターゲットバケットの両方でバージョニング機能を有効化する必要があります。
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 bucketのリージョンを設定します。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、secretIdおよびsecretKeyなどの指定パラメータを入力します。
注意:
ソースバケットでバージョニング機能を有効化する必要があります。
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 bucketのリージョンを設定します。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、secretIdおよびsecretKeyなどの指定パラメータを入力します。
注意:
バックアップバケットとターゲットバケットの両方でバージョニング機能を有効化する必要があります。
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、secretIdおよびsecretKeyなどの指定パラメータを入力します。
注意:
ソースバケットでバージョニング機能を有効化する必要があります。
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、secretIdおよびsecretKeyなどの指定パラメータを入力します。
注意:
バックアップバケットとターゲットバケットの両方でバージョニング機能を有効化する必要があります。
4. disaster_recovery_demo2.pyファイルを実行します。実行が成功しエラーログ出力がない場合、削除されたデータをリストアできます。

APIを通じてリストアする

バージョニングを有効化すると、削除リクエストは実際にオブジェクトを削除するのではなく、最新バージョンとして削除マーカーを生成します。したがって、削除された過去のバージョンを復元するには、過去のバージョンを再度最新バージョンにする必要があります。方法は2つあります:
1. 削除マーカーを削除します。DeleteObjectインターフェースを呼び出し、最上位の削除マーカーを削除すると、過去のバージョンが最新バージョンになります。クイックジャンプをクリックして操作ガイドに移動します。
2. 過去のバージョンを再コピーします。PutObject-Copyインターフェースを呼び出し、必要な過去のバージョンを再度コピーすると、新しいバージョンが生成されます。クイックジャンプをクリックして操作ガイドに移動します。

方法1: 削除マーカーを削除する

DeleteObjectインターフェースを呼び出し、最上位の削除マーカーを削除すると、履歴バージョンが最新バージョンになります。
注意:
DeleteObjectインターフェースを呼び出す際には、必ずversionIdパラメータを指定し、削除マーカーのバージョン番号を入力してください。
以下に、APIを使用した方法とSDKを使用した方法の2つをそれぞれ紹介します。
1. APIを使用する場合、インターフェースドキュメントは削除マーカーを完全に削除を参照できます。以下はAPIの例です:
2. SDKを使用する場合、Pythonを例として、サンプルコードは以下の通りです。注意:必ず削除マーカーのversionIdを指定してください。詳細はPython SDKドキュメントをご参照ください。
3. 最終的な効果は下図の通りです。削除マーカーが完全に削除され、元の過去のバージョンが自動的に最新バージョンとなり、復元が達成されます。




方法2:過去のバージョンを再度コピーする

PutObject-Copyインターフェースを呼び出し、必要な過去のバージョンを再度コピーすると、新しいバージョンが生成されます。この新しいバージョンは最上位に位置し、復元効果が得られます。注意:コピーインターフェースを呼び出す際、x-cos-copy-sourceでコピー対象の過去のバージョンのバージョン番号を明示的に指定してください。以下では、APIを使用する方法とSDKを使用する方法の2つをそれぞれ紹介します:
1. APIを使用する場合、インターフェースドキュメントは以下を参照してください:ソースオブジェクトのバージョンを指定してコピー。注意:copy-sourceには必ずバージョン番号を含めてください。リクエストの例は以下の通りです:
2. SDKを使用する場合、Pythonを例として、サンプルコードは以下の通りです。注意:必ず復元するバージョンのversionIdを指定してください。詳細はPython SDKドキュメントをご参照ください。
3. 最終的な効果は下図の通りです。新しいバージョンが最上位に生成され、復元効果が得られます。




まとめ

COSサービスは、アクセス制御、オブジェクトロック、MFA操作保護、バージョニング、バケットレプリケーション、ログ管理、インベントリ、バッチ処理などの機能を通じて、豊富なデータ保護ソリューションを提供します。誤削除防止から誤削除復旧まで、データ紛失リスクを最小限に抑えることに取り組んでおり、企業が安全で信頼性の高い環境下で事業を発展させられるよう支援します。ご利用中にご提案やお問い合わせがございましたら、お気軽にご連絡ください

ヘルプとサポート

この記事はお役に立ちましたか?

フィードバック