前提条件
确保需要设置保留策略的Bucket未开启版本控制。关于版本控制的更多信息,请参见版本控制介绍。
使用场景
OSS保留策略支持的WORM特性符合美国证券交易委员会(SEC)和金融业监管局(FINRA)的合规要求。适用于金融、保险、医疗、证券、日志数据等保审查等场景。
注意事项
目前仅支持针对Bucket级别设置保留策略。
同一个Bucket中,不建议同时开通OSS-HDFS服务并设置保留策略。
如果Bucket开通了OSS-HDFS服务并设置了保留策略,会导致通过OSS-HDFS提供的方式删除.dlsdata/
目录下的数据时提示删除成功,但在保留策略有效期内OSS仍将保留该目录下被删除的数据,且在保留策略失效后也无法识别并删除.dlsdata/
目录下相关的数据。
Bucket内的Object在保留策略生效期间,可通过设置生命周期规则进行存储类型转化,在保证合规性的前提下,降低存储成本。
操作方式
使用OSS控制台
创建保留策略。
登录OSS管理控制台。
单击Bucket 列表,然后单击目标Bucket名称。
在左侧导航栏,选择数据安全>保留策略。
在保留策略页面,单击创建策略。
在创建策略对话框,指定保留周期。
说明 保留周期以天为单位,取值范围为1~25,550。
单击确定。
说明 策略状态为待锁定。该状态的有效期为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保护天数为1天。*/
auto outcome = client.InitiateBucketWorm(InitiateBucketWormRequest(BucketName, 1));
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策略,ossutil的安装请参见安装ossutil。
以下命令用于在存储空间 examplebucket
中创建一条新的 WORM策略,并将WORM的保留期设置为 365 天。
ossutil api initiate-bucket-worm --bucket examplebucket --initiate-worm-configuration "{\"RetentionPeriodInDays\":\"365\"}"
关于该命令的更多信息,请参见initiate-bucket-worm。
相关API
以上操作方式底层基于API实现,如果您的程序自定义要求较高,您可以直接发起REST API请求。直接发起REST API请求需要手动编写代码计算签名。更多信息,请参见InitiateBucketWorm。
常见问题
保留策略有哪些优势?
保留策略提供数据合规存储,保护周期内数据不可删除或修改。相比之下,RAM policy和Bucket Policy保护的数据可能被修改或删除。
什么情况下需要设置保留策略?
当需要长期存储且不允许修改或删除的重要数据,如医疗档案、技术文件、合同文书等,建议在指定Bucket内开启保留策略。
是否支持取消保留策略?
是否支持取消保留策略取决于其状态。
未提交锁定:Bucket拥有者和授权用户可删除。
已提交锁定:任何人均无法删除。
是否支持针对Object设置保留策略?
仅支持针对Bucket设置保留策略,不支持目录或单个对象。
如何计算Object的保留时间?
结合Object的最后修改时间和保留策略的保留周期计算。例如,Bucket A的保留策略为10天,Object最后修改时间为2022年02月15日,则保留时间为2022年02月25日。
如果OSS欠费,但仍有Object处于保留策略的保护期内,这些Object会被保留么?
欠费情况下,阿里云会根据合同条款应用数据保留策略。
授权的RAM用户是否可以设置保留策略?
保留策略API已开放,支持RAM policy。授权的RAM用户可通过控制台、API、SDK等方式创建或删除保留策略。