OSS保留策略具有WORM(Write Once Read Many)特性,滿足用戶以不可刪除、不可篡改方式保存和使用數據。如果您希望指定時間內任何用戶(包括資源擁有者)均不能修改和刪除OSS某個Bucket中的Object,您可以選擇為Bucket配置保留策略。在保留策略指定的Object保留時間到期之前,僅支持在Bucket中上傳和讀取Object。Object保留時間到期后,才可以修改或刪除Object。
前提條件
華東1(杭州)、華東2(上海)、華東6(福州-本地地域)、華北1(青島)、華北2(北京)、華北 3(張家口)、華北5(呼和浩特)、華北6(烏蘭察布)、華南1(深圳)、華南2(河源)、華南3(廣州)、西南1(成都)、中國香港、美國(硅谷)、日本(東京)、韓國(首爾)、新加坡、馬來西亞(吉隆坡)、印度尼西亞(雅加達)、菲律賓(馬尼拉)、泰國(曼谷)、德國(法蘭克福)、英國(倫敦)、阿聯酋(迪拜)地域支持設置保留策略。
確保需要設置保留策略的Bucket未開啟版本控制。關于版本控制的更多信息,請參見版本控制介紹。
使用場景
OSS保留策略支持的WORM特性符合美國證券交易委員會(SEC)和金融業監管局(FINRA)的合規要求。適用于金融、保險、醫療、證券、日志數據等保審查等場景。
OSS是目前已通過Cohasset Associates審計認證的云服務,可滿足嚴格的電子記錄保留要求,例如SEC Rule 17a-4(f)、FINRA 4511、CFTC 1.31等合規要求。更多信息,請參見OSS Cohasset Assessment Report。
注意事項
目前僅支持針對Bucket級別設置保留策略。
同一個Bucket中,不建議同時開通OSS-HDFS服務并設置保留策略。
如果Bucket開通了OSS-HDFS服務并設置了保留策略,會導致通過OSS-HDFS提供的方式刪除
.dlsdata/
目錄下的數據時提示刪除成功,但在保留策略有效期內OSS仍將保留該目錄下被刪除的數據,且在保留策略失效后也無法識別并刪除.dlsdata/
目錄下相關的數據。Bucket內的Object在保留策略生效期間,可通過設置生命周期規則進行存儲類型轉化,在保證合規性的前提下,降低存儲成本。
規則說明
生效規則
當基于時間的保留策略創建后,該策略默認處于InProgress狀態,且該狀態的有效期為24小時。在有效期24小時內,此策略對應的Bucket資源處于保護狀態。
啟動保留策略24小時內
如果24小時內未提交鎖定保留策略,則Bucket所有者以及授權用戶可以刪除該策略。
如果24小時內已提交鎖定保留策略,則不允許刪除該策略,且無法縮短策略保護周期,僅可以延長保護周期。
如果24小時內已提交鎖定保留策略,則Bucket內的數據處于被保護狀態時,如果您嘗試刪除或修改這些數據,OSS將返回
409 FileImmutable
的錯誤信息。
啟動保留策略24小時后
如果超過24小時未鎖定該保留策略,則該策略自動失效,您可以刪除該策略。
刪除規則
基于時間的保留策略是Bucket的一種Metadata屬性。當刪除某個Bucket時,該Bucket對應的保留策略也會被刪除。
啟動保留策略24小時內,如果該保留策略未提交鎖定,則Bucket所有者以及授權用戶可以刪除該策略。
如果Bucket內有Object處于保護周期內,那么您將無法刪除保留策略,同時也無法刪除Bucket。
規則示例
假設您在2022年06月01日為您賬號下的某個Bucket創建了保護周期為30天的保留策略,且該策略在創建后進入鎖定狀態。您在不同時間上傳了file1.txt、file2.txt、file3.txt三個Object。關于這三個Object的具體上傳時間以及對應的到期時間說明如下:
Object名稱
上傳時間
Object到期時間
file1.txt
2022年04月01日
2022年04月30日
file2.txt
2022年06月01日
2022年06月30日
file3.txt
2022年09月01日
2022年09月30日
操作步驟
使用OSS控制臺
創建保留策略。
登錄OSS管理控制臺。
單擊Bucket 列表,然后單擊目標Bucket名稱。
在左側導航欄,選擇數據安全>保留策略。
在保留策略頁面,單擊創建策略。
在創建策略對話框,指定保留周期。
說明保留周期以天為單位,取值范圍為1~25,550。
單擊確定。
說明策略狀態為待鎖定。該狀態的有效期為24小時。在有效期24小時內,該策略對應的Bucket資源處于保護狀態。如果您不希望保留該策略,您可以在有效期24小時內刪除策略。
鎖定保留策略。
單擊鎖定。
在彈出的對話框,單擊確定。
重要基于時間的保留策略被鎖定后,您將無法鎖定保留周期或者刪除保留策略,且在保留周期內無法修改或刪除Bucket中的數據。
(可選)修改保留周期。
單擊編輯。
在彈出的對話框,修改保留周期。
重要您可以延長保留周期,但無法縮短保留周期。
使用阿里云SDK
以下僅列舉常見SDK的設置保留策略的代碼示例。關于其他SDK的設置保留策略代碼示例,請參見SDK簡介。
Java
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.InitiateBucketWormRequest;
import com.aliyun.oss.model.InitiateBucketWormResult;
public class Demo {
public static void main(String[] args) throws Exception {
// Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填寫Bucket名稱,例如examplebucket。
String bucketName = "examplebucket";
// 填寫Bucket所在地域。以華東1(杭州)為例,Region填寫為cn-hangzhou。
String region = "cn-hangzhou";
// 創建OSSClient實例。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// 創建InitiateBucketWormRequest對象。
InitiateBucketWormRequest initiateBucketWormRequest = new InitiateBucketWormRequest(bucketName);
// 指定Object保護天數為1天。
initiateBucketWormRequest.setRetentionPeriodInDays(1);
// 創建合規保留策略。
InitiateBucketWormResult initiateBucketWormResult = ossClient.initiateBucketWorm(initiateBucketWormRequest);
// 查看合規保留策略ID。
String wormId = initiateBucketWormResult.getWormId();
System.out.println(wormId);
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
PHP
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
require_once __DIR__ . '/../vendor/autoload.php';
}
use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
use OSS\CoreOssException;
// 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$provider = new EnvironmentVariableCredentialsProvider();
// Endpoint以杭州為例,其它Region請按實際情況填寫。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
$bucket= "<yourBucketName>";
$config = array(
"provider" => $provider,
"endpoint" => $endpoint,
"signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
"region"=> "cn-hangzhou"
);
$ossClient = new OssClient($config);
try {
// 創建保留策略,指定Object保護天數為30天。
$wormId = $ossClient->initiateBucketWorm($bucket, 30);
// 查看保留策略ID。
print($wormId);
} catch (OssException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage() . "\n");
return;
}
print(__FUNCTION__ . ": OK" . "\n");
Node.js
const OSS = require('ali-oss');
const client = new OSS({
// yourregion填寫Bucket所在地域。以華東1(杭州)為例,Region填寫為oss-cn-hangzhou。
region: 'yourregion',
// 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
authorizationV4: true,
// yourBucketName填寫Bucket名稱。
bucket: 'yourBucketName',
});
// 創建保留策略。
async function initiateBucketWorm() {
// yourbucketname填寫存儲空間名稱。
const bucket = 'yourbucketname'
// 指定Object保護天數。
const days = '<Retention Days>'
const res = await client.initiateBucketWorm(bucket, days)
console.log(res.wormId)
}
initiateBucketWorm()
Python
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地域對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填寫Endpoint對應的Region信息,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數
region = "cn-hangzhou"
# yourBucketName填寫存儲空間名稱。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
# 新建保留策略,并指定Object保護天數為1天。
result = bucket.init_bucket_worm(1)
# 查看保留策略ID。
print(result.worm_id)
Go
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Error creating credentials provider: %v", err)
}
// 創建OSSClient實例。
// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
// yourRegion填寫Bucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設置簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Error creating OSS client: %v", err)
}
// 填寫待配置合規保留策略的Bucket名稱。
bucketName := "<yourBucketName>"
// 指定Object保護天數為60天。
result, err := client.InitiateBucketWorm(bucketName, 60)
if err != nil {
log.Fatalf("Error initiating bucket WORM: %v", err)
}
log.Println("WORM policy initiated successfully:", result)
}
C++
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* 初始化OSS賬號信息。*/
/* yourEndpoint填寫Bucket所在地域對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "yourEndpoint";
/* yourRegion填寫Bucket所在地域對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。*/
std::string Region = "yourRegion";
/* 填寫Bucket名稱,例如examplebucket。*/
std::string BucketName = "examplebucket";
/* 初始化網絡等資源。*/
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* 創建保留策略,指定Object保護天數為10天。*/
auto outcome = client.InitiateBucketWorm(InitiateBucketWormRequest(BucketName, 10));
if (outcome.isSuccess()) {
std::cout << " InitiateBucketWorm success " << std::endl;
std::cout << "WormId:" << outcome.result().WormId() << std::endl;
}
else {
/* 異常處理。*/
std::cout << "InitiateBucketWorm fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* 釋放網絡等資源。*/
ShutdownSdk();
return 0;
}
使用命令行工具ossutil
關于使用ossutil設置保留策略的具體步驟,請參見worm(保留策略)。
使用REST API
如果您的程序自定義要求較高,您可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。更多信息,請參見InitiateBucketWorm。
常見問題
保留策略有哪些優勢?
保留策略可提供數據合規存儲,數據在保留策略保護周期內,任何用戶都不能刪除和修改。而通過RAM policy和Bucket Policy保護的數據,則存在被修改和刪除可能。
什么情況下需要設置保留策略?
您需要長期存儲且不允許修改或刪除的重要數據,如醫療檔案、技術文件、合同文書等,可以存放在指定的Bucket內,并通過開啟保留策略保護您的重要數據。
是否支持取消保留策略?
視保留策略的狀態而定。
如果保留策略未提交鎖定,則Bucket擁有者以及授權用戶可以刪除該策略。
如果保留策略已提交鎖定,則任何人均無法刪除該策略。
是否支持針對Object設置保留策略?
僅支持針對Bucket設置保留策略,不支持針對目錄以及單個對象設置保留策略。
如何計算Object的保留時間?
您可以結合Bucket內Object的最后修改時間以及保留策略設置的保留周期計算出Object的保留時間。例如,Bucket A設置了保留時間為10天的保留策略,Object的最后修改時間為2022年02月15日,則該Object的保留時間為2022年02月25日。
如何刪除已開啟保留策略的Bucket ?
如果該Bucket內未存儲Object,可以直接刪除該Bucket。
如果該Bucket內已存儲Object,且所有Object均已過了保護期,刪除該Bucket會提示失敗。此時,您可以先刪除該Bucket內所有Object,再刪除Bucket。
如果該Bucket內已存儲Object,且還有Object處于保護期內,無法刪除該Bucket。
如果OSS欠費,但仍有Object處于保留策略的保護期內,這些Object會被保留么?
在未付款的情況下,阿里云會根據您簽署的合同條款和條件,應用對應的數據保留策略。
授權的RAM用戶是否可以設置保留策略?
保留策略相關API接口已全部對外開放,并且相關API操作已支持接入RAM policy。通過RAM Policy授權的RAM用戶可以通過控制臺、API、SDK等方式創建、刪除保留策略。