轉(zhuǎn)換文件存儲(chǔ)類型
本文中含有需要您注意的重要提示信息,忽略該信息可能對(duì)您的業(yè)務(wù)造成影響,請(qǐng)務(wù)必仔細(xì)閱讀。
OSS支持標(biāo)準(zhǔn)、低頻訪問、歸檔、冷歸檔、深度冷歸檔多種存儲(chǔ)類型,您可以通過生命周期規(guī)則或者CopyObject的方式隨時(shí)轉(zhuǎn)換文件(Object)的存儲(chǔ)類型。
對(duì)開通了OSS-HDFS服務(wù)的Bucket,建議不要修改OSS-HDFS的數(shù)據(jù)存儲(chǔ)目錄.dlsdata/
下任意Object的存儲(chǔ)類型。
如果您將.dlsdata/
下任意Object的存儲(chǔ)類型修改為低頻類型時(shí),通過OSS-HDFS可正常訪問數(shù)據(jù)。如果您將Object存儲(chǔ)類型修改為歸檔、冷歸檔、深度冷歸檔后,通過OSS-HDFS無法訪問數(shù)據(jù)。如需訪問,您需要對(duì)數(shù)據(jù)進(jìn)行解凍操作,解凍完成后再嘗試訪問數(shù)據(jù)。
通過生命周期規(guī)則自動(dòng)轉(zhuǎn)換Object的存儲(chǔ)類型
基于最后一次修改時(shí)間的存儲(chǔ)類型轉(zhuǎn)換
本地冗余存儲(chǔ)(LRS)
本地冗余類型文件轉(zhuǎn)換規(guī)則如下:
標(biāo)準(zhǔn)存儲(chǔ)(LRS)類型可轉(zhuǎn)換為低頻訪問(LRS)、歸檔存儲(chǔ)(LRS)、冷歸檔存儲(chǔ)(LRS)或者深度冷歸檔存儲(chǔ)(LRS)類型。
低頻訪問(LRS)類型可轉(zhuǎn)換為歸檔存儲(chǔ)(LRS)、冷歸檔存儲(chǔ)(LRS)類型或者深度冷歸檔存儲(chǔ)(LRS)類型。
歸檔存儲(chǔ)(LRS)類型可轉(zhuǎn)換為冷歸檔存儲(chǔ)(LRS)類型或者深度冷歸檔存儲(chǔ)(LRS)類型。
冷歸檔存儲(chǔ)(LRS)類型可轉(zhuǎn)換為深度冷歸檔存儲(chǔ)(LRS)類型。
當(dāng)Bucket同時(shí)配置了轉(zhuǎn)換為低頻訪問、轉(zhuǎn)換為歸檔存儲(chǔ)、轉(zhuǎn)換為冷歸檔存儲(chǔ)以及轉(zhuǎn)換為深度冷歸檔存儲(chǔ)的策略,其轉(zhuǎn)換周期必須滿足以下條件:
轉(zhuǎn)換為低頻訪問的周期<轉(zhuǎn)換為歸檔的周期<轉(zhuǎn)換為冷歸檔的周期<轉(zhuǎn)換為深度冷歸檔的周期
同城冗余存儲(chǔ)(ZRS)
同城冗余類型文件轉(zhuǎn)換規(guī)則如下:
標(biāo)準(zhǔn)存儲(chǔ)(ZRS)類型可轉(zhuǎn)換為低頻訪問(ZRS)類型、歸檔存儲(chǔ)(ZRS)類型、冷歸檔存儲(chǔ)(LRS)類型和深度冷歸檔存儲(chǔ)(LRS)類型。
低頻訪問(ZRS)類型可轉(zhuǎn)換為歸檔存儲(chǔ)(ZRS)類型、冷歸檔存儲(chǔ)(LRS)類型和深度冷歸檔存儲(chǔ)(LRS)類型。
歸檔存儲(chǔ)(ZRS)類型可轉(zhuǎn)換為冷歸檔存儲(chǔ)(LRS)類型和深度冷歸檔存儲(chǔ)(LRS)類型。
冷歸檔存儲(chǔ)(LRS)類型可轉(zhuǎn)換為深度冷歸檔存儲(chǔ)(LRS)類型。
更多信息,請(qǐng)參見基于最后一次修改時(shí)間的生命周期規(guī)則。
基于最后一次訪問時(shí)間的存儲(chǔ)類型轉(zhuǎn)換
如果您需要將Object從標(biāo)準(zhǔn)存儲(chǔ)或低頻訪問類型轉(zhuǎn)換為歸檔、冷歸檔或深度冷歸檔存儲(chǔ)類型,請(qǐng)提交工單申請(qǐng)轉(zhuǎn)換為歸檔、冷歸檔或深度冷歸檔類型的權(quán)限,申請(qǐng)通過后您需要指定轉(zhuǎn)換的目標(biāo)存儲(chǔ)類型。
工單申請(qǐng)通過后,如果您基于最后一次訪問時(shí)間策略將Object從標(biāo)準(zhǔn)存儲(chǔ)或低頻訪問類型轉(zhuǎn)為歸檔、冷歸檔或深度冷歸檔類型,則Bucket中歸檔、冷歸檔或深度冷歸檔類型Object的最后一次訪問時(shí)間默認(rèn)為該Bucket開啟訪問跟蹤的時(shí)間。
本地冗余存儲(chǔ)(LRS)
本地冗余類型文件轉(zhuǎn)換規(guī)則如下:
標(biāo)準(zhǔn)存儲(chǔ)(LRS)類型可轉(zhuǎn)換為低頻訪問(LRS)、歸檔存儲(chǔ)(LRS)、冷歸檔存儲(chǔ)(LRS)或者深度冷歸檔存儲(chǔ)(LRS)類型。
標(biāo)準(zhǔn)存儲(chǔ)(LRS)類型轉(zhuǎn)為低頻訪問(LRS)后,還可以選擇當(dāng)Object被訪問后是否自動(dòng)轉(zhuǎn)回標(biāo)準(zhǔn)存儲(chǔ)(LRS)類型。
低頻訪問(LRS)類型可轉(zhuǎn)換為歸檔存儲(chǔ)(LRS)、冷歸檔存儲(chǔ)(LRS)類型或者深度冷歸檔存儲(chǔ)(LRS)類型。
歸檔存儲(chǔ)(LRS)類型可轉(zhuǎn)換為冷歸檔存儲(chǔ)(LRS)類型或者深度冷歸檔存儲(chǔ)(LRS)類型。
冷歸檔存儲(chǔ)(LRS)類型可轉(zhuǎn)換為深度冷歸檔存儲(chǔ)(LRS)類型。
同城冗余存儲(chǔ)(ZRS)
同城冗余類型文件轉(zhuǎn)換規(guī)則如下:
標(biāo)準(zhǔn)存儲(chǔ)(ZRS)類型可轉(zhuǎn)換為低頻訪問(ZRS)類型、歸檔存儲(chǔ)(ZRS)類型、冷歸檔存儲(chǔ)(LRS)類型和深度冷歸檔存儲(chǔ)(LRS)類型。
標(biāo)準(zhǔn)存儲(chǔ)(ZRS)類型轉(zhuǎn)為低頻訪問(ZRS)后,還可以選擇當(dāng)Object被訪問后是否自動(dòng)轉(zhuǎn)回標(biāo)準(zhǔn)存儲(chǔ)(ZRS)類型。
低頻訪問(ZRS)類型可轉(zhuǎn)換為歸檔存儲(chǔ)(ZRS)類型、冷歸檔存儲(chǔ)(LRS)類型和深度冷歸檔存儲(chǔ)(LRS)類型。
歸檔存儲(chǔ)(ZRS)類型可轉(zhuǎn)換為冷歸檔存儲(chǔ)(LRS)類型和深度冷歸檔存儲(chǔ)(LRS)類型。
冷歸檔存儲(chǔ)(LRS)類型可轉(zhuǎn)換為深度冷歸檔存儲(chǔ)(LRS)類型。
更多信息,請(qǐng)參見基于最后一次訪問時(shí)間的生命周期規(guī)則。
通過生命周期規(guī)則轉(zhuǎn)換存儲(chǔ)類型操作方式
您可以通過多種方式設(shè)置生命周期規(guī)則。生命周期規(guī)則可用于將多個(gè)Object在指定時(shí)間內(nèi)轉(zhuǎn)儲(chǔ)為指定存儲(chǔ)類型,或者將過期的Object和碎片刪除。您可以結(jié)合以下示例按需選擇通過生命周期規(guī)則將Object轉(zhuǎn)儲(chǔ)為指定存儲(chǔ)類型。
單擊Bucket 列表,然后單擊目標(biāo)Bucket名稱。
在左側(cè)導(dǎo)航欄, 選擇
。可選:如果您需要?jiǎng)?chuàng)建基于最后一次訪問時(shí)間策略的生命周期規(guī)則,請(qǐng)?jiān)?b id="uicontrol-w4g-dve-lf8" data-tag="uicontrol" data-isbold="true" class="uicontrol">生命周期頁面,打開啟用訪問跟蹤開關(guān)。
在生命周期頁面,單擊創(chuàng)建規(guī)則。
在創(chuàng)建生命周期規(guī)則面板,按如下說明配置生命周期規(guī)則。
存儲(chǔ)空間未開啟版本控制
區(qū)域
配置項(xiàng)
說明
基礎(chǔ)設(shè)置
狀態(tài)
設(shè)置生命周期規(guī)則的狀態(tài),可選擇啟動(dòng)或禁用。
啟動(dòng)生命周期規(guī)則后,將按照配置的生命周期規(guī)則轉(zhuǎn)換數(shù)據(jù)存儲(chǔ)類型或刪除數(shù)據(jù)。
禁用生命周期規(guī)則后,將中斷生命周期任務(wù)。
策略
選擇生命周期規(guī)則作用的Object。您可以選擇按前綴匹配或配置到整個(gè)Bucket。
說明選擇按前綴匹配時(shí),需要填寫前綴的完整路徑。例如,您希望僅作用于src/dir1下的所有文件,則前綴需要填寫為src/dir1,僅填寫dir1則不生效。
是否允許前綴重疊
OSS默認(rèn)會(huì)檢查各個(gè)生命周期規(guī)則的前綴是否重疊。例如,您設(shè)置了以下兩條包含重疊前綴的生命周期規(guī)則:
規(guī)則1
指定該Bucket內(nèi)所有前綴為dir1/的Object在距離最后一次修改時(shí)間180天后刪除。
規(guī)則2
指定該Bucket內(nèi)所有前綴為dir1/dir2/的Object在距離最后一次修改時(shí)間30天后轉(zhuǎn)低頻訪問類型,60天后刪除。
在配置規(guī)則2時(shí)未選中該選項(xiàng)的情況下,因后臺(tái)檢測到dir1/dir2/目錄下的Object同時(shí)匹配兩條刪除規(guī)則,因此會(huì)拒絕設(shè)置規(guī)則2,并報(bào)錯(cuò)Overlap for same action type Expiration.。
在配置規(guī)則2時(shí)選中該選項(xiàng)的情況下,dir1/dir2/下的Object會(huì)在30天后轉(zhuǎn)低頻訪問類型,60天后刪除。dir1/下的其他Object會(huì)在180天刪除。
說明如果配置了多條規(guī)則,且其中一條為基于整個(gè)Bucket的規(guī)則時(shí),會(huì)被視為前綴重疊的情況。
前綴
輸入規(guī)則要匹配的Object名稱的前綴。
前綴設(shè)置為img,表示匹配名稱以img開頭的所有Object,例如imgtest.png、img/example.jpg等。
前綴設(shè)置為img/,表示匹配名稱以img/開頭的所有Object,例如img/example.jpg、img/test.jpg等。
標(biāo)簽
生命周期規(guī)則僅針對(duì)擁有指定標(biāo)簽Object生效。
如果沒有設(shè)置前綴,只設(shè)置了標(biāo)簽,且標(biāo)簽的key為a,value為1。則該規(guī)則將匹配Bucket內(nèi)所有標(biāo)簽為a=1的Object。
如果設(shè)置了前綴,前綴設(shè)置為img,同時(shí)設(shè)置了標(biāo)簽,標(biāo)簽的key為a,value為1,則該規(guī)則將匹配Bucket內(nèi)所有名稱以img開頭,標(biāo)簽為a=1的Object。
更多信息,請(qǐng)參見對(duì)象標(biāo)簽。
NOT
NOT選項(xiàng)用于設(shè)置生命周期規(guī)則對(duì)指定前綴和標(biāo)簽的Object不生效。
重要開啟NOT選項(xiàng)時(shí),前綴和標(biāo)簽必須至少存在一項(xiàng),即同時(shí)設(shè)置前綴和標(biāo)簽或者只設(shè)置前綴或標(biāo)簽。
NOT語義定義標(biāo)簽中的key不支持與標(biāo)簽配置項(xiàng)中定義的key相同。
開啟NOT選項(xiàng)后,不支持設(shè)置碎片過期策略。
文件大小
指定生命周期規(guī)則生效的文件大小。
指定最小文件:生命周期規(guī)則對(duì)大于該值的文件大小生效。取值大于0 B,小于5 TB。
指定最大文件:生命周期規(guī)則對(duì)小于該值的文件大小生效。取值大于0 B,小于等于5 TB。
重要如果在同一條生命周期中,同時(shí)配置了指定最小文件和指定最大文件:
確保指定最大文件的值大于指定最小文件的值。
不支持配置碎片執(zhí)行策略。
不支持配置清除刪除標(biāo)記策略。
文件執(zhí)行策略設(shè)置
文件時(shí)間策略
選擇Object過期策略,可選擇指定天數(shù)、指定日期和不啟用。選擇不啟用時(shí),文件過期策略不生效。
生命周期管理規(guī)則
配置轉(zhuǎn)換Object存儲(chǔ)類型或者刪除過期Object的規(guī)則,可選擇低頻訪問、歸檔存儲(chǔ)、冷歸檔存儲(chǔ)、深度冷歸檔存儲(chǔ)和數(shù)據(jù)刪除。
例如,當(dāng)您將文件時(shí)間策略設(shè)置為指定日期,并將日期設(shè)置為2023年9月24日,則最后一次修改時(shí)間在2023年9月24日之前的Object會(huì)被自動(dòng)刪除,且刪除后不可恢復(fù)。
碎片執(zhí)行策略設(shè)置
碎片過期策略
配置碎片執(zhí)行策略。如果選中了標(biāo)簽,則無法配置該選項(xiàng)。您可以選擇按指定天數(shù)或指定日期執(zhí)行碎片過期策略,也可以選擇不啟用碎片過期策略。當(dāng)選擇不啟用時(shí),碎片過期策略不生效。
重要生命周期規(guī)則至少包含文件過期策略或碎片過期策略。
碎片規(guī)則
根據(jù)碎片過期策略選擇的過期天數(shù)或過期日期設(shè)定碎片何時(shí)過期,碎片過期后會(huì)被自動(dòng)刪除,且刪除后不可恢復(fù)。
存儲(chǔ)空間已開啟版本控制
開啟版本控制后,基礎(chǔ)設(shè)置與碎片執(zhí)行策略設(shè)置區(qū)域涉及的配置項(xiàng),與未開啟版本控制的配置方法相同。以下表格僅介紹與未開啟版本控制相比,開啟版本控制后配置項(xiàng)存在的差異。
區(qū)域
配置項(xiàng)
說明
當(dāng)前版本文件執(zhí)行策略設(shè)置
清理對(duì)象刪除標(biāo)記
開啟版本控制后,清除策略中增加了清理對(duì)象刪除標(biāo)記選項(xiàng),其他選項(xiàng)與未開啟版本控制時(shí)相同。
選擇此選項(xiàng)后,如果當(dāng)前Object僅有一個(gè)版本且為刪除標(biāo)記時(shí),則OSS將刪除過期Object的刪除標(biāo)記。如果當(dāng)前Object有多個(gè)版本,且Object的最新版本為刪除標(biāo)記時(shí),則OSS將保留該刪除標(biāo)記。關(guān)于刪除標(biāo)記的更多信息,請(qǐng)參見刪除標(biāo)記。
重要當(dāng)有歷史版本存在時(shí),該規(guī)則不會(huì)清理對(duì)象刪除標(biāo)記。因此建議及時(shí)清理對(duì)象刪除標(biāo)記和非必要的歷史版本,否則Bucket內(nèi)因存儲(chǔ)過多的刪除標(biāo)記,導(dǎo)致List性能下降。
歷史版本文件執(zhí)行策略設(shè)置
文件時(shí)間策略
設(shè)置歷史版本文件的過期策略,可選擇指定天數(shù)和不啟用。當(dāng)選擇不啟用時(shí),文件過期策略不生效。
生命周期管理規(guī)則
設(shè)定一個(gè)過期天數(shù)N,歷史版本的Object會(huì)在其被轉(zhuǎn)換為歷史版本的N天后過期,并在過期的第二天執(zhí)行指定操作。例如設(shè)置為30,則在2023年09月01日被轉(zhuǎn)為歷史版本的Object會(huì)在2023年10月01日被轉(zhuǎn)換為指定存儲(chǔ)類型或被刪除。
重要您可以通過Object下一個(gè)版本的最后一次修改時(shí)間確定 Object被轉(zhuǎn)為歷史版本的時(shí)間。
單擊確定。
生命周期規(guī)則保存成功后,您可以在策略列表中查看已設(shè)置的生命周期規(guī)則。
以下僅列舉常見SDK的配置生命周期規(guī)則的代碼示例。關(guān)于其他SDK的配置生命周期規(guī)則的代碼示例,請(qǐng)參見簡介。
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.common.utils.DateUtil;
import com.aliyun.oss.model.LifecycleRule;
import com.aliyun.oss.model.SetBucketLifecycleRequest;
import com.aliyun.oss.model.StorageClass;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Demo {
public static void main(String[] args) throws Exception {
// Endpoint以華東1(杭州)為例,其它Region請(qǐng)按實(shí)際情況填寫。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填寫B(tài)ucket名稱,例如examplebucket。
String bucketName = "examplebucket";
// 填寫B(tài)ucket所在地域。以華東1(杭州)為例,Region填寫為cn-hangzhou。
String region = "cn-hangzhou";
// 創(chuàng)建OSSClient實(shí)例。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// 創(chuàng)建SetBucketLifecycleRequest。
SetBucketLifecycleRequest request = new SetBucketLifecycleRequest(bucketName);
// 設(shè)置規(guī)則ID。
String ruleId0 = "rule0";
// 設(shè)置文件匹配前綴。
String matchPrefix0 = "A0/";
// 設(shè)置要匹配的標(biāo)簽。
Map<String, String> matchTags0 = new HashMap<String, String>();
// 依次填寫要匹配標(biāo)簽的鍵(例如owner)和值(例如John)。
matchTags0.put("owner", "John");
String ruleId1 = "rule1";
String matchPrefix1 = "A1/";
Map<String, String> matchTags1 = new HashMap<String, String>();
matchTags1.put("type", "document");
String ruleId2 = "rule2";
String matchPrefix2 = "A2/";
String ruleId3 = "rule3";
String matchPrefix3 = "A3/";
String ruleId4 = "rule4";
String matchPrefix4 = "A4/";
String ruleId5 = "rule5";
String matchPrefix5 = "A5/";
String ruleId6 = "rule6";
String matchPrefix6 = "A6/";
// 距最后修改時(shí)間3天后過期。
LifecycleRule rule = new LifecycleRule(ruleId0, matchPrefix0, LifecycleRule.RuleStatus.Enabled, 3);
rule.setTags(matchTags0);
request.AddLifecycleRule(rule);
// 指定日期之前創(chuàng)建的文件過期。
rule = new LifecycleRule(ruleId1, matchPrefix1, LifecycleRule.RuleStatus.Enabled);
rule.setCreatedBeforeDate(DateUtil.parseIso8601Date("2022-10-12T00:00:00.000Z"));
rule.setTags(matchTags1);
request.AddLifecycleRule(rule);
// 分片3天后過期。
rule = new LifecycleRule(ruleId2, matchPrefix2, LifecycleRule.RuleStatus.Enabled);
LifecycleRule.AbortMultipartUpload abortMultipartUpload = new LifecycleRule.AbortMultipartUpload();
abortMultipartUpload.setExpirationDays(3);
rule.setAbortMultipartUpload(abortMultipartUpload);
request.AddLifecycleRule(rule);
// 指定日期之前的分片過期。
rule = new LifecycleRule(ruleId3, matchPrefix3, LifecycleRule.RuleStatus.Enabled);
abortMultipartUpload = new LifecycleRule.AbortMultipartUpload();
abortMultipartUpload.setCreatedBeforeDate(DateUtil.parseIso8601Date("2022-10-12T00:00:00.000Z"));
rule.setAbortMultipartUpload(abortMultipartUpload);
request.AddLifecycleRule(rule);
// 距最后修改時(shí)間10天后轉(zhuǎn)低頻訪問存儲(chǔ)類型,距最后修改時(shí)間30天后轉(zhuǎn)歸檔存儲(chǔ)類型。
rule = new LifecycleRule(ruleId4, matchPrefix4, LifecycleRule.RuleStatus.Enabled);
List<LifecycleRule.StorageTransition> storageTransitions = new ArrayList<LifecycleRule.StorageTransition>();
LifecycleRule.StorageTransition storageTransition = new LifecycleRule.StorageTransition();
storageTransition.setStorageClass(StorageClass.IA);
storageTransition.setExpirationDays(10);
storageTransitions.add(storageTransition);
storageTransition = new LifecycleRule.StorageTransition();
storageTransition.setStorageClass(StorageClass.Archive);
storageTransition.setExpirationDays(30);
storageTransitions.add(storageTransition);
rule.setStorageTransition(storageTransitions);
request.AddLifecycleRule(rule);
// 指定最后修改日期在2022年10月12日之前的文件轉(zhuǎn)為歸檔存儲(chǔ)。
rule = new LifecycleRule(ruleId5, matchPrefix5, LifecycleRule.RuleStatus.Enabled);
storageTransitions = new ArrayList<LifecycleRule.StorageTransition>();
storageTransition = new LifecycleRule.StorageTransition();
storageTransition.setCreatedBeforeDate(DateUtil.parseIso8601Date("2022-10-12T00:00:00.000Z"));
storageTransition.setStorageClass(StorageClass.Archive);
storageTransitions.add(storageTransition);
rule.setStorageTransition(storageTransitions);
request.AddLifecycleRule(rule);
// rule6針對(duì)版本控制狀態(tài)下的Bucket。
rule = new LifecycleRule(ruleId6, matchPrefix6, LifecycleRule.RuleStatus.Enabled);
// 設(shè)置Object相對(duì)最后修改時(shí)間365天之后自動(dòng)轉(zhuǎn)為歸檔文件。
storageTransitions = new ArrayList<LifecycleRule.StorageTransition>();
storageTransition = new LifecycleRule.StorageTransition();
storageTransition.setStorageClass(StorageClass.Archive);
storageTransition.setExpirationDays(365);
storageTransitions.add(storageTransition);
rule.setStorageTransition(storageTransitions);
// 設(shè)置自動(dòng)移除過期刪除標(biāo)記。
rule.setExpiredDeleteMarker(true);
// 設(shè)置非當(dāng)前版本的object距最后修改時(shí)間10天之后轉(zhuǎn)為低頻訪問類型。
LifecycleRule.NoncurrentVersionStorageTransition noncurrentVersionStorageTransition =
new LifecycleRule.NoncurrentVersionStorageTransition().withNoncurrentDays(10).withStrorageClass(StorageClass.IA);
// 設(shè)置非當(dāng)前版本的Object距最后修改時(shí)間20天之后轉(zhuǎn)為歸檔類型。
LifecycleRule.NoncurrentVersionStorageTransition noncurrentVersionStorageTransition2 =
new LifecycleRule.NoncurrentVersionStorageTransition().withNoncurrentDays(20).withStrorageClass(StorageClass.Archive);
// 設(shè)置非當(dāng)前版本Object 30天后刪除。
LifecycleRule.NoncurrentVersionExpiration noncurrentVersionExpiration = new LifecycleRule.NoncurrentVersionExpiration().withNoncurrentDays(30);
List<LifecycleRule.NoncurrentVersionStorageTransition> noncurrentVersionStorageTransitions = new ArrayList<LifecycleRule.NoncurrentVersionStorageTransition>();
noncurrentVersionStorageTransitions.add(noncurrentVersionStorageTransition2);
rule.setStorageTransition(storageTransitions);
rule.setNoncurrentVersionExpiration(noncurrentVersionExpiration);
rule.setNoncurrentVersionStorageTransitions(noncurrentVersionStorageTransitions);
request.AddLifecycleRule(rule);
// 發(fā)起設(shè)置生命周期規(guī)則請(qǐng)求。
ossClient.setBucketLifecycle(request);
// 查看生命周期規(guī)則。
List<LifecycleRule> listRules = ossClient.getBucketLifecycle(bucketName);
for(LifecycleRule rules : listRules){
System.out.println("ruleId="+rules.getId()+", matchPrefix="+rules.getPrefix());
}
} 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;
use OSS\Model\LifecycleConfig;
use OSS\Model\LifecycleRule;
use OSS\Model\LifecycleAction;
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$provider = new EnvironmentVariableCredentialsProvider();
// Endpoint以華東1(杭州)為例,其它Region請(qǐng)按實(shí)際情況填寫。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 填寫存儲(chǔ)空間名稱。
$bucket= "examplebucket";
// 設(shè)置規(guī)則ID和文件前綴。
$ruleId0 = "rule0";
$matchPrefix0 = "A0/";
$ruleId1 = "rule1";
$matchPrefix1 = "A1/";
$lifecycleConfig = new LifecycleConfig();
$actions = array();
// 距最后修改時(shí)間3天后過期。
$actions[] = new LifecycleAction(OssClient::OSS_LIFECYCLE_EXPIRATION, OssClient::OSS_LIFECYCLE_TIMING_DAYS, 3);
$lifecycleRule = new LifecycleRule($ruleId0, $matchPrefix0, "Enabled", $actions);
$lifecycleConfig->addRule($lifecycleRule);
$actions = array();
// 指定日期之前創(chuàng)建的文件過期。
$actions[] = new LifecycleAction(OssClient::OSS_LIFECYCLE_EXPIRATION, OssClient::OSS_LIFECYCLE_TIMING_DATE, '2022-10-12T00:00:00.000Z');
$lifecycleRule = new LifecycleRule($ruleId1, $matchPrefix1, "Enabled", $actions);
$lifecycleConfig->addRule($lifecycleRule);
try {
$config = array(
"provider" => $provider,
"endpoint" => $endpoint,
"signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
"region"=> "cn-hangzhou"
);
$ossClient = new OssClient($config);
$ossClient->putBucketLifecycle($bucket, $lifecycleConfig);
} 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填寫B(tài)ucket所在地域。以華東1(杭州)為例,Region填寫為oss-cn-hangzhou。
region: 'yourregion',
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
authorizationV4: true,
// 填寫存儲(chǔ)空間名稱。
bucket: 'yourbucketname'
});
async function getBucketLifecycle () {
try {
const result = await client.getBucketLifecycle('Yourbucketname');
console.log(result.rules); // 獲取生命周期規(guī)則。
rules.forEach(rule => {
console.log(rule.id) // 查看生命周期規(guī)則ID。
console.log(rule.status) // 查看生命周期規(guī)則狀態(tài)。
console.log(rule.tags) // 查看生命周期規(guī)則標(biāo)簽。
console.log(rule.expiration.days) // 查看過期天數(shù)規(guī)則。
console.log(rule.expiration.createdBeforeDate) // 查看過期日期規(guī)則。
// 查看過期分片規(guī)則。
console.log(rule.abortMultipartUpload.days || rule.abortMultipartUpload.createdBeforeDate)
// 查看存儲(chǔ)類型轉(zhuǎn)換規(guī)則。
console.log(rule.transition.days || rule.transition.createdBeforeDate) // 查看存儲(chǔ)類型轉(zhuǎn)換時(shí)間。
console.log(rule.transition.storageClass) // 轉(zhuǎn)換存儲(chǔ)類型。
// 查看是否自動(dòng)刪除過期刪除標(biāo)記。
console.log(rule.transition.expiredObjectDeleteMarker)
// 查看非當(dāng)前版本Object存儲(chǔ)類型轉(zhuǎn)換規(guī)則。
console.log(rule.noncurrentVersionTransition.noncurrentDays) // 查看非當(dāng)前版本Object存儲(chǔ)類型轉(zhuǎn)換時(shí)間。
console.log(rule.noncurrentVersionTransition.storageClass) // 查看非當(dāng)前版本Object轉(zhuǎn)換的存儲(chǔ)類型。
})
} catch (e) {
console.log(e);
}
}
getBucketLifecycle();
Python
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
import datetime
from oss2.models import (LifecycleExpiration, LifecycleRule,
BucketLifecycle, AbortMultipartUpload,
TaggingRule, Tagging, StorageTransition,
NoncurrentVersionStorageTransition,
NoncurrentVersionExpiration)
# 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填寫Endpoint對(duì)應(yīng)的Region信息,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數(shù)
region = "cn-hangzhou"
# examplebucket填寫存儲(chǔ)空間名稱。
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)
# 設(shè)置Object距其最后修改時(shí)間3天后過期。
rule1 = LifecycleRule('rule1', 'tests/',
status=LifecycleRule.ENABLED,
expiration=LifecycleExpiration(days=3))
# 設(shè)置Object過期規(guī)則,指定日期之前創(chuàng)建的文件過期。
rule2 = LifecycleRule('rule2', 'tests2/',
status=LifecycleRule.ENABLED,
expiration = LifecycleExpiration(created_before_date=datetime.date(2023, 12, 12)))
# 設(shè)置分片過期規(guī)則,分片3天后過期。
rule3 = LifecycleRule('rule3', 'tests3/',
status=LifecycleRule.ENABLED,
abort_multipart_upload=AbortMultipartUpload(days=3))
# 設(shè)置分片過期規(guī)則,指定日期之前的分片過期。
rule4 = LifecycleRule('rule4', 'tests4/',
status=LifecycleRule.ENABLED,
abort_multipart_upload = AbortMultipartUpload(created_before_date=datetime.date(2022, 12, 12)))
# 設(shè)置存儲(chǔ)類型轉(zhuǎn)換規(guī)則,指定Object在其最后修改時(shí)間20天之后轉(zhuǎn)為低頻訪問類型,在其最后修改時(shí)間30天之后轉(zhuǎn)為歸檔類型。
rule5 = LifecycleRule('rule5', 'tests5/',
status=LifecycleRule.ENABLED,
storage_transitions=[StorageTransition(days=20,storage_class=oss2.BUCKET_STORAGE_CLASS_IA),
StorageTransition(days=30,storage_class=oss2.BUCKET_STORAGE_CLASS_ARCHIVE)])
# 設(shè)置匹配的標(biāo)簽。
tagging_rule = TaggingRule()
tagging_rule.add('key1', 'value1')
tagging_rule.add('key2', 'value2')
tagging = Tagging(tagging_rule)
# 設(shè)置存儲(chǔ)類型轉(zhuǎn)換規(guī)則,指定Object在其最后修改時(shí)間超過365天后轉(zhuǎn)為ARCHIVE類型。
# rule6與以上幾個(gè)規(guī)則不同的是它指定了匹配的標(biāo)簽,同時(shí)擁有key1=value1,key2=value2兩個(gè)標(biāo)簽的object才會(huì)匹配此規(guī)則。
rule6 = LifecycleRule('rule6', 'tests6/',
status=LifecycleRule.ENABLED,
storage_transitions=[StorageTransition(created_before_date=datetime.date(2022, 12, 12),storage_class=oss2.BUCKET_STORAGE_CLASS_IA)],
tagging = tagging)
# rule7針對(duì)版本控制狀態(tài)下的Bucket。
# 設(shè)置Object在其最后修改時(shí)間365天之后自動(dòng)轉(zhuǎn)為ARCHIVE類型。
# 設(shè)置自動(dòng)移除過期刪除標(biāo)記。
# 設(shè)置非當(dāng)前版本Object 12天后轉(zhuǎn)為IA類型。
# 設(shè)置非當(dāng)前版本Object 20天后轉(zhuǎn)為ARCHIVE類型。
# 設(shè)置非當(dāng)前版本Object 30天后刪除。
rule7 = LifecycleRule('rule7', 'tests7/',
status=LifecycleRule.ENABLED,
storage_transitions=[StorageTransition(days=365, storage_class=oss2.BUCKET_STORAGE_CLASS_ARCHIVE)],
expiration=LifecycleExpiration(expired_detete_marker=True),
noncurrent_version_sotrage_transitions =
[NoncurrentVersionStorageTransition(12, oss2.BUCKET_STORAGE_CLASS_IA),
NoncurrentVersionStorageTransition(20, oss2.BUCKET_STORAGE_CLASS_ARCHIVE)],
noncurrent_version_expiration = NoncurrentVersionExpiration(30))
lifecycle = BucketLifecycle([rule1, rule2, rule3, rule4, rule5, rule6, rule7])
bucket.put_bucket_lifecycle(lifecycle)
C#
using Aliyun.OSS;
using Aliyun.OSS.Common;
// 填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// 填寫B(tài)ucket名稱,例如examplebucket。
var bucketName = "examplebucket";
// 填寫B(tài)ucket所在地域?qū)?yīng)的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。
const string region = "cn-hangzhou";
// 創(chuàng)建ClientConfiguration實(shí)例,按照您的需要修改默認(rèn)參數(shù)。
var conf = new ClientConfiguration();
// 設(shè)置v4簽名。
conf.SignatureVersion = SignatureVersion.V4;
// 創(chuàng)建OssClient實(shí)例。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
c.SetRegion(region);
try
{
var setBucketLifecycleRequest = new SetBucketLifecycleRequest(bucketName);
// 創(chuàng)建第1條生命周期規(guī)則。
LifecycleRule lcr1 = new LifecycleRule()
{
ID = "delete obsoleted files",
Prefix = "obsoleted/",
Status = RuleStatus.Enabled,
ExpriationDays = 3,
Tags = new Tag[1]
};
// 設(shè)置標(biāo)簽。
var tag1 = new Tag
{
Key = "project",
Value = "projectone"
};
lcr1.Tags[0] = tag1;
// 創(chuàng)建第2條生命周期規(guī)則。
LifecycleRule lcr2 = new LifecycleRule()
{
ID = "delete temporary files",
Prefix = "temporary/",
Status = RuleStatus.Enabled,
ExpriationDays = 20,
Tags = new Tag[1]
};
// 設(shè)置標(biāo)簽。
var tag2 = new Tag
{
Key = "user",
Value = "jsmith"
};
lcr2.Tags[0] = tag2;
// 設(shè)置碎片在距最后修改時(shí)間30天后過期。
lcr2.AbortMultipartUpload = new LifecycleRule.LifeCycleExpiration()
{
Days = 30
};
LifecycleRule lcr3 = new LifecycleRule();
lcr3.ID = "only NoncurrentVersionTransition";
lcr3.Prefix = "test1";
lcr3.Status = RuleStatus.Enabled;
lcr3.NoncurrentVersionTransitions = new LifecycleRule.LifeCycleNoncurrentVersionTransition[2]
{
// 設(shè)置非當(dāng)前版本的Object距最后修改時(shí)間90天之后轉(zhuǎn)為低頻訪問類型。
new LifecycleRule.LifeCycleNoncurrentVersionTransition(){
StorageClass = StorageClass.IA,
NoncurrentDays = 90
},
// 設(shè)置非當(dāng)前版本的Object距最后修改時(shí)間180天之后轉(zhuǎn)為歸檔類型。
new LifecycleRule.LifeCycleNoncurrentVersionTransition(){
StorageClass = StorageClass.Archive,
NoncurrentDays = 180
}
};
setBucketLifecycleRequest.AddLifecycleRule(lcr1);
setBucketLifecycleRequest.AddLifecycleRule(lcr2);
setBucketLifecycleRequest.AddLifecycleRule(lcr3);
// 設(shè)置生命周期規(guī)則。
client.SetBucketLifecycle(setBucketLifecycleRequest);
Console.WriteLine("Set bucket:{0} Lifecycle succeeded ", bucketName);
}
catch (OssException ex)
{
Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}
Android-Java
PutBucketLifecycleRequest request = new PutBucketLifecycleRequest();
request.setBucketName("examplebucket");
BucketLifecycleRule rule1 = new BucketLifecycleRule();
// 設(shè)置規(guī)則ID和文件前綴。
rule1.setIdentifier("1");
rule1.setPrefix("A");
// 設(shè)置是否執(zhí)行生命周期規(guī)則。如果值為true,則OSS會(huì)定期執(zhí)行該規(guī)則;如果值為false,則OSS會(huì)忽略該規(guī)則。
rule1.setStatus(true);
// 距最后修改時(shí)間200天后過期。
rule1.setDays("200");
// 30天后自動(dòng)轉(zhuǎn)為歸檔存儲(chǔ)類型(Archive)
rule1.setArchiveDays("30");
// 未完成分片3天后過期。
rule1.setMultipartDays("3");
// 15天后自動(dòng)轉(zhuǎn)為低頻存儲(chǔ)類型(IA)。
rule1.setIADays("15");
BucketLifecycleRule rule2 = new BucketLifecycleRule();
rule2.setIdentifier("2");
rule2.setPrefix("B");
rule2.setStatus(true);
rule2.setDays("300");
rule2.setArchiveDays("30");
rule2.setMultipartDays("3");
rule2.setIADays("15");
ArrayList<BucketLifecycleRule> lifecycleRules = new ArrayList<BucketLifecycleRule>();
lifecycleRules.add(rule1);
lifecycleRules.add(rule2);
request.setLifecycleRules(lifecycleRules);
OSSAsyncTask task = oss.asyncPutBucketLifecycle(request, new OSSCompletedCallback<PutBucketLifecycleRequest, PutBucketLifecycleResult>() {
@Override
public void onSuccess(PutBucketLifecycleRequest request, PutBucketLifecycleResult result) {
OSSLog.logInfo("code::"+result.getStatusCode());
}
@Override
public void onFailure(PutBucketLifecycleRequest request, ClientException clientException, ServiceException serviceException) {
OSSLog.logError("error: "+serviceException.getRawMessage());
}
});
task.waitUntilFinished();
Go
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 創(chuàng)建OSSClient實(shí)例。
// yourEndpoint填寫B(tài)ucket對(duì)應(yīng)的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請(qǐng)按實(shí)際情況填寫。
// yourRegion填寫B(tài)ucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請(qǐng)按實(shí)際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設(shè)置簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 填寫存儲(chǔ)空間名稱。
bucketName := "examplebucket"
// 指定生命周期規(guī)則1,并在規(guī)則中指定前綴為foo的文件在距離最后一次修改時(shí)間3天后過期。
rule1 := oss.BuildLifecycleRuleByDays("rule1", "foo/", true, 3)
// 在受版本控制狀態(tài)下的Object僅有刪除標(biāo)記的情況下,自動(dòng)刪除刪除標(biāo)記。
deleteMark := true
expiration := oss.LifecycleExpiration{
ExpiredObjectDeleteMarker: &deleteMark,
}
// 非當(dāng)前版本Object超過30天后過期刪除。
versionExpiration := oss.LifecycleVersionExpiration{
NoncurrentDays: 30,
}
// 非當(dāng)前版本Object超過10天后轉(zhuǎn)為IA存儲(chǔ)類型。
versionTransition := oss.LifecycleVersionTransition{
NoncurrentDays: 10,
StorageClass: "IA",
}
// 指定生命周期規(guī)則2。
rule2 := oss.LifecycleRule{
ID: "rule2",
Prefix: "yourObjectPrefix",
Status: "Enabled",
Expiration: &expiration,
NonVersionExpiration: &versionExpiration,
NonVersionTransitions: []oss.LifecycleVersionTransition{
versionTransition,
},
}
// 指定生命周期規(guī)則3,對(duì)標(biāo)簽鍵為tag1、標(biāo)簽值為value1的文件,距文件最后一次修改時(shí)間3天后過期。
rule3 := oss.LifecycleRule{
ID: "rule3",
Prefix: "",
Status: "Enabled",
Tags: []oss.Tag{
oss.Tag{
Key: "tag1",
Value: "value1",
},
},
Expiration: &oss.LifecycleExpiration{Days: 3},
}
// 設(shè)置生命周期規(guī)則。
rules := []oss.LifecycleRule{rule1, rule2, rule3}
err = client.SetBucketLifecycle(bucketName, rules)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
}
C++
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/*初始化OSS賬號(hào)信息。*/
/* yourEndpoint填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "yourEndpoint";
/* yourRegion填寫B(tài)ucket所在地域?qū)?yīng)的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。*/
std::string Region = "yourRegion";
/*填寫B(tài)ucket名稱,例如examplebucket。*/
std::string BucketName = "examplebucket";
/*初始化網(wǎng)絡(luò)等資源。*/
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
SetBucketLifecycleRequest request(BucketName);
std::string date("2022-10-12T00:00:00.000Z");
/*設(shè)置標(biāo)簽。*/
Tagging tagging;
tagging.addTag(Tag("key1", "value1"));
tagging.addTag(Tag("key2", "value2"));
/*指定生命周期規(guī)則。*/
auto rule1 = LifecycleRule();
rule1.setID("rule1");
rule1.setPrefix("test1/");
rule1.setStatus(RuleStatus::Enabled);
rule1.setExpiration(3);
rule1.setTags(tagging.Tags());
/*指定過期時(shí)間。*/
auto rule2 = LifecycleRule();
rule2.setID("rule2");
rule2.setPrefix("test2/");
rule2.setStatus(RuleStatus::Disabled);
rule2.setExpiration(date);
/*rule3為針對(duì)版本控制狀態(tài)下的Bucket的生命周期規(guī)則。*/
auto rule3 = LifecycleRule();
rule3.setID("rule3");
rule3.setPrefix("test3/");
rule3.setStatus(RuleStatus::Disabled);
/*設(shè)置Object距其最后修改時(shí)間365天之后自動(dòng)轉(zhuǎn)為歸檔類型。*/
auto transition = LifeCycleTransition();
transition.Expiration().setDays(365);
transition.setStorageClass(StorageClass::Archive);
rule3.addTransition(transition);
/*設(shè)置自動(dòng)移除過期刪除標(biāo)記。*/
rule3.setExpiredObjectDeleteMarker(true);
/*設(shè)置非當(dāng)前版本的Object距最后修改時(shí)間10天之后轉(zhuǎn)為低頻訪問類型。*/
auto transition1 = LifeCycleTransition();
transition1.Expiration().setDays(10);
transition1.setStorageClass(StorageClass::IA);
/*設(shè)置非當(dāng)前版本的Object距最后修改時(shí)間20天之后轉(zhuǎn)為歸檔類型。*/
auto transition2 = LifeCycleTransition();
transition2.Expiration().setDays(20);
transition2.setStorageClass(StorageClass::Archive);
/*設(shè)置Object在其成為非當(dāng)前版本30天之后刪除。*/
auto expiration = LifeCycleExpiration(30);
rule3.setNoncurrentVersionExpiration(expiration);
LifeCycleTransitionList noncurrentVersionStorageTransitions{transition1, transition2};
rule3.setNoncurrentVersionTransitionList(noncurrentVersionStorageTransitions);
/*設(shè)置生命周期規(guī)則。*/
LifecycleRuleList list{rule1, rule2, rule3};
request.setLifecycleRules(list);
auto outcome = client.SetBucketLifecycle(request);
if (!outcome.isSuccess()) {
/*異常處理 */
std::cout << "SetBucketLifecycle fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/*釋放網(wǎng)絡(luò)等資源。*/
ShutdownSdk();
return 0;
}
C
#include "oss_api.h"
#include "aos_http_io.h"
/* yourEndpoint填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
const char *endpoint = "yourEndpoint";
/* 填寫B(tài)ucket名稱,例如examplebucket。*/
const char *bucket_name = "examplebucket";
/* yourRegion填寫B(tài)ucket所在地域?qū)?yīng)的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。*/
const char *region = "yourRegion";
void init_options(oss_request_options_t *options)
{
options->config = oss_config_create(options->pool);
/* 用char*類型的字符串初始化aos_string_t類型。*/
aos_str_set(&options->config->endpoint, endpoint);
/* 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
//需要額外配置以下兩個(gè)參數(shù)
aos_str_set(&options->config->region, region);
options->config->signature_version = 4;
/* 是否使用cname域名訪問OSS服務(wù)。0表示不使用。*/
options->config->is_cname = 0;
/* 用于設(shè)置網(wǎng)絡(luò)相關(guān)參數(shù),比如超時(shí)時(shí)間等。*/
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* 在程序入口調(diào)用aos_http_io_initialize方法來初始化網(wǎng)絡(luò)、內(nèi)存等全局資源。*/
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* 用于內(nèi)存管理的內(nèi)存池(pool),等價(jià)于apr_pool_t。其實(shí)現(xiàn)代碼在apr庫中。*/
aos_pool_t *pool;
/* 重新創(chuàng)建一個(gè)內(nèi)存池,第二個(gè)參數(shù)是NULL,表示沒有繼承其它內(nèi)存池。*/
aos_pool_create(&pool, NULL);
/* 創(chuàng)建并初始化options,該參數(shù)包括endpoint、access_key_id、acces_key_secret、is_cname、curl等全局配置信息。*/
oss_request_options_t *oss_client_options;
/* 在內(nèi)存池中分配內(nèi)存給options。*/
oss_client_options = oss_request_options_create(pool);
/* 初始化Client的選項(xiàng)oss_client_options。*/
init_options(oss_client_options);
/* 初始化參數(shù)。*/
aos_string_t bucket;
aos_table_t *resp_headers = NULL;
aos_status_t *resp_status = NULL;
aos_str_set(&bucket, bucket_name);
aos_list_t lifecycle_rule_list;
aos_str_set(&bucket, bucket_name);
aos_list_init(&lifecycle_rule_list);
/* 指定過期天數(shù)。*/
oss_lifecycle_rule_content_t *rule_content_days = oss_create_lifecycle_rule_content(pool);
aos_str_set(&rule_content_days->id, "rule-1");
/* 設(shè)置文件前綴。*/
aos_str_set(&rule_content_days->prefix, "dir1");
aos_str_set(&rule_content_days->status, "Enabled");
rule_content_days->days = 3;
aos_list_add_tail(&rule_content_days->node, &lifecycle_rule_list);
/* 指定過期時(shí)間。*/
oss_lifecycle_rule_content_t *rule_content_date = oss_create_lifecycle_rule_content(pool);
aos_str_set(&rule_content_date->id, "rule-2");
aos_str_set(&rule_content_date->prefix, "dir2");
aos_str_set(&rule_content_date->status, "Enabled");
/* 過期時(shí)間格式為UTC。
aos_str_set(&rule_content_date->date, "2023-10-11T00:00:00.000Z");
aos_list_add_tail(&rule_content_date->node, &lifecycle_rule_list);
/* 設(shè)置生命周期規(guī)則。*/
resp_status = oss_put_bucket_lifecycle(oss_client_options, &bucket, &lifecycle_rule_list, &resp_headers);
if (aos_status_is_ok(resp_status)) {
printf("put bucket lifecycle succeeded\n");
} else {
printf("put bucket lifecycle failed, code:%d, error_code:%s, error_msg:%s, request_id:%s\n",
resp_status->code, resp_status->error_code, resp_status->error_msg, resp_status->req_id);
}
/* 釋放內(nèi)存池,相當(dāng)于釋放了請(qǐng)求過程中各資源分配的內(nèi)存。*/
aos_pool_destroy(pool);
/* 釋放之前分配的全局資源。*/
aos_http_io_deinitialize();
return 0;
}
Ruby
require 'aliyun/oss'
client = Aliyun::OSS::Client.new(
# Endpoint以華東1(杭州)為例,其它Region請(qǐng)按實(shí)際情況填寫。
endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
# 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
access_key_id: ENV['OSS_ACCESS_KEY_ID'],
access_key_secret: ENV['OSS_ACCESS_KEY_SECRET']
)
# 填寫B(tài)ucket名稱。
bucket = client.get_bucket('examplebucket')
# 設(shè)置生命周期規(guī)則。
bucket.lifecycle = [
Aliyun::OSS::LifeCycleRule.new(
:id => 'rule1', :enable => true, :prefix => 'foo/', :expiry => 3),
Aliyun::OSS::LifeCycleRule.new(
:id => 'rule2', :enable => false, :prefix => 'bar/', :expiry => Date.new(2016, 1, 1))
]
關(guān)于使用ossutil設(shè)置生命周期規(guī)則的具體操作, 請(qǐng)參見添加或修改生命周期規(guī)則。
如果您的程序自定義要求較高,您可以直接發(fā)起REST API請(qǐng)求。直接發(fā)起REST API請(qǐng)求需要手動(dòng)編寫代碼計(jì)算簽名。更多信息,請(qǐng)參見PutBucketLifecycle。
通過CopyObject接口手動(dòng)轉(zhuǎn)換Object的存儲(chǔ)類型
您可以通過CopyObject接口,將Object覆寫為指定的存儲(chǔ)類型。
如果將Object修改為低頻訪問、歸檔存儲(chǔ)、冷歸檔存儲(chǔ)、深度冷歸檔存儲(chǔ)類型,Object會(huì)涉及最小計(jì)量空間64 KB、最短存儲(chǔ)周期、數(shù)據(jù)取回費(fèi)用等。更多信息,請(qǐng)參見注意事項(xiàng)。
歸檔存儲(chǔ)、冷歸檔存儲(chǔ)、深度冷歸檔存儲(chǔ)類型的Object需要解凍后才可以修改存儲(chǔ)類型。關(guān)于解凍Object的具體操作,請(qǐng)參見解凍Object。如果您已開啟歸檔直讀,則歸檔存儲(chǔ)數(shù)據(jù)無需解凍就可以修改存儲(chǔ)類型。直接讀取會(huì)產(chǎn)生歸檔直讀數(shù)據(jù)取回容量費(fèi)用,請(qǐng)參見歸檔直讀。
在已開啟版本控制的Bucket中,通過CopyObject轉(zhuǎn)換Object的存儲(chǔ)類型時(shí),OSS將會(huì)為新拷貝的Object自動(dòng)生成唯一的版本ID,此版本ID將會(huì)在響應(yīng)Header中的
x-oss-version-id
返回。在未開啟或者暫停版本控制的Bucket中,通過CopyObject轉(zhuǎn)換Object的存儲(chǔ)類型時(shí),OSS將會(huì)為新拷貝的Object自動(dòng)生成version ID為null的版本,且會(huì)覆蓋原有versionId為null的版本。如果被覆蓋的文件類型為低頻、歸檔、冷歸檔或者深度冷歸檔,可能會(huì)涉及存儲(chǔ)不足規(guī)定時(shí)長容量費(fèi)用。更多信息,請(qǐng)參見Object在存儲(chǔ)不足規(guī)定時(shí)長時(shí)如何計(jì)費(fèi)?。
基于CopyObject轉(zhuǎn)換存儲(chǔ)類型規(guī)則
本地冗余(LRS)
標(biāo)準(zhǔn)存儲(chǔ)(LRS)、低頻訪問(LRS)、歸檔存儲(chǔ)(LRS)、冷歸檔存儲(chǔ)(LRS)和深度冷歸檔存儲(chǔ)(LRS)各存儲(chǔ)類型之間可任意轉(zhuǎn)換。
同城冗余(ZRS)
標(biāo)準(zhǔn)存儲(chǔ)(ZRS)、低頻訪問(ZRS)和歸檔存儲(chǔ)(ZRS)各存儲(chǔ)類型之間可任意轉(zhuǎn)換。
將歸檔存儲(chǔ)(ZRS)類型的Object轉(zhuǎn)換為標(biāo)準(zhǔn)存儲(chǔ)(ZRS)或低頻訪問(ZRS)類型時(shí),需根據(jù)Object所在Bucket的設(shè)置情況采取不同操作:
通過CopyObject轉(zhuǎn)換存儲(chǔ)類型操作方式
通過控制臺(tái)修改Object存儲(chǔ)類型時(shí),Object大小不能超過1 GB。超過1 GB的Object,建議通過SDK或者命令行工具ossutil。
單擊Bucket 列表,然后單擊目標(biāo)Bucket名稱。
在左側(cè)導(dǎo)航欄,選擇
。在文件列表頁面,選擇目標(biāo)Object右側(cè)的
。建議您打開保留用戶自定義元數(shù)據(jù)開關(guān),修改存儲(chǔ)類型后,Object的自定義元數(shù)據(jù)信息會(huì)被保留。
選擇您希望修改的存儲(chǔ)類型后,單擊確定。
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.CopyObjectRequest;
import com.aliyun.oss.model.CopyObjectResult;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.StorageClass;
public class Demo {
public static void main(String[] args) throws Exception {
// Endpoint以華東1(杭州)為例,其它Region請(qǐng)按實(shí)際情況填寫。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 本示例中的Bucket與Object需提前創(chuàng)建好, 且Object類型為標(biāo)準(zhǔn)或低頻訪問存儲(chǔ)類型。
// 填寫B(tài)ucket名稱,例如examplebucket。
String bucketName = "examplebucket";
// 填寫不包含Bucket名稱在內(nèi)的Object完整路徑,例如exampleobject.txt。
String objectName = "exampleobject.txt";
// 填寫B(tài)ucket所在地域。以華東1(杭州)為例,Region填寫為cn-hangzhou。
String region = "cn-hangzhou";
// 創(chuàng)建OSSClient實(shí)例。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// 創(chuàng)建CopyObjectRequest對(duì)象。
CopyObjectRequest request = new CopyObjectRequest(bucketName, objectName, bucketName, objectName) ;
// 創(chuàng)建ObjectMetadata對(duì)象。
ObjectMetadata objectMetadata = new ObjectMetadata();
// 將Object存儲(chǔ)類型轉(zhuǎn)換為歸檔類型。
objectMetadata.setHeader("x-oss-storage-class", StorageClass.Archive);
// 將Object存儲(chǔ)類型轉(zhuǎn)換為冷歸檔類型。
// objectMetadata.setHeader("x-oss-storage-class", StorageClass.ColdArchive);
// 將Object存儲(chǔ)類型轉(zhuǎn)換為深度冷歸檔類型。
// objectMetadata.setHeader("x-oss-storage-class", StorageClass.DeepColdArchive);
request.setNewObjectMetadata(objectMetadata);
// 更改文件存儲(chǔ)類型。
CopyObjectResult result = ossClient.copyObject(request);
} 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
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;
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$provider = new EnvironmentVariableCredentialsProvider();
// Endpoint以杭州為例,其它Region請(qǐng)按實(shí)際情況填寫。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 填寫B(tài)ucket名稱。
$bucket= "<yourBucketName>";
// 填寫不包含Bucket名稱在內(nèi)的Object的完整路徑,例如destfolder/exampleobject.txt。
$object = "<yourObjectName>";
$config = array(
"provider" => $provider,
"endpoint" => $endpoint,
"signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
"region"=> "cn-hangzhou"
);
$ossClient = new OssClient($config);
try {
// 指定轉(zhuǎn)換后的文件存儲(chǔ)類型,例如指定為歸檔存儲(chǔ)類型(Archive)。
$copyOptions = array(
OssClient::OSS_HEADERS => array(
'x-oss-storage-class' => 'Archive',
'x-oss-metadata-directive' => 'REPLACE',
),
);
$ossClient->copyObject($bucket, $object, $bucket, $object, $copyOptions);
} catch (OssException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage() . "\n");
return;
}
print(__FUNCTION__ . ": OK" . "\n");
const OSS = require('ali-oss');
const client = new OSS({
// yourregion填寫B(tài)ucket所在地域。以華東1(杭州)為例,Region填寫為oss-cn-hangzhou。
region: 'yourregion',
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量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填寫存儲(chǔ)空間名稱。
bucket: 'yourbucketname'
})
const options = {
headers:{'x-oss-storage-class':'Archive'}
}
client.copy('Objectname','Objectname',options).then((res) => {
console.log(res);
}).catch(err => {
console.log(err)
})
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
import os
# 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填寫Endpoint對(duì)應(yīng)的Region信息,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數(shù)
region = "cn-hangzhou"
# yourBucketName填寫存儲(chǔ)空間名稱。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
# 填寫Object的完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。
# 需確保該Object的存儲(chǔ)類型為標(biāo)準(zhǔn)存儲(chǔ)或低頻訪問類型。
object_name = 'exampledir/exampleobject.txt'
# 通過添加存儲(chǔ)類型Header,將Object存儲(chǔ)類型轉(zhuǎn)換為歸檔類型。
headers = {'x-oss-storage-class': oss2.BUCKET_STORAGE_CLASS_ARCHIVE}
# 通過添加存儲(chǔ)類型Header,將Object存儲(chǔ)類型轉(zhuǎn)換為冷歸檔類型。
# headers = {'x-oss-storage-class': oss2.BUCKET_STORAGE_CLASS_COLD_ARCHIVE}
# 通過添加存儲(chǔ)類型Header,將Object存儲(chǔ)類型轉(zhuǎn)換為深度冷歸檔類型。
# headers = {'x-oss-storage-class': oss2.models.BUCKET_STORAGE_CLASS_DEEP_COLD_ARCHIVE}
# 更改文件存儲(chǔ)類型。
bucket.copy_object(bucket.bucket_name, object_name, object_name, headers)
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// 創(chuàng)建OSSClient實(shí)例。
// yourEndpoint填寫B(tài)ucket對(duì)應(yīng)的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請(qǐng)按實(shí)際情況填寫。
// yourRegion填寫B(tài)ucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請(qǐng)按實(shí)際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設(shè)置簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// yourBucketName填寫存儲(chǔ)空間名稱。
bucketName := "yourBucketName" // 請(qǐng)?zhí)鎿Q為實(shí)際的Bucket名稱
// yourObjectName填寫不包含Bucket名稱在內(nèi)的Object的完整路徑。
objectName := "yourObjectName" // 請(qǐng)?zhí)鎿Q為實(shí)際的對(duì)象路徑
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Failed to get bucket: %v", err)
}
// 更改文件存儲(chǔ)類型,例如修改為歸檔存儲(chǔ)類型。
_, err = bucket.CopyObject(objectName, objectName, oss.ObjectStorageClass(oss.StorageArchive))
if err != nil {
log.Fatalf("Failed to change storage class of object: %v", err)
}
log.Println("Storage class changed successfully.")
}
OSSCopyObjectRequest * copy = [OSSCopyObjectRequest new];
copy.sourceBucketName = @"examplebucket";
copy.sourceObjectKey = @"exampleobject.txt";
copy.bucketName = @"examplebucket";
copy.objectKey = @"exampleobject.txt";
// 將exampleobject.txt的存儲(chǔ)類型指定為歸檔類型Archive。
copy.objectMeta = @{@"x-oss-storage-class" : @"Archive"};
OSSTask * task = [client copyObject:copy];
[task continueWithBlock:^id(OSSTask *task) {
if (!task.error) {
NSLog(@"copy object success!");
} else {
NSLog(@"copy object failed, error: %@" , task.error);
}
return nil;
}];
// 實(shí)現(xiàn)同步阻塞等待任務(wù)完成。
// [task waitUntilFinished];
#include <iostream>
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* yourEndpoint填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "yourEndpoint";
/* yourRegion填寫B(tài)ucket所在地域?qū)?yīng)的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。*/
std::string Region = "yourRegion";
/* 填寫B(tài)ucket名稱,例如examplebucket。*/
std::string BucketName = "examplebucket";
/* 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。*/
std::string ObjectName = "exampledir/exampleobject.txt";
/* 初始化網(wǎng)絡(luò)等資源。*/
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* 設(shè)置修改后的文件存儲(chǔ)類型,例如將修改后的文件存儲(chǔ)類型設(shè)置為歸檔類型。*/
ObjectMetaData objectMeta;
objectMeta.addHeader("x-oss-storage-class", "Archive");
std::string SourceBucketName = BucketName;
std::string SourceObjectName = ObjectName;
CopyObjectRequest request(SourceBucketName, ObjectName, objectMeta);
request.setCopySource(SourceBucketName, SourceObjectName);
/* 修改為上述指定的文件存儲(chǔ)類型。*/
auto outcome = client.CopyObject(request);
if (!outcome.isSuccess()) {
/* 異常處理。*/
std::cout << "CopyObject fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* 釋放網(wǎng)絡(luò)等資源。*/
ShutdownSdk();
return 0;
}
關(guān)于使用ossutil轉(zhuǎn)換Object存儲(chǔ)類型的具體步驟, 請(qǐng)參見修改文件存儲(chǔ)類型。
如果您的程序自定義要求較高,您可以直接發(fā)起REST API請(qǐng)求。直接發(fā)起REST API請(qǐng)求需要手動(dòng)編寫代碼計(jì)算簽名。更多信息,請(qǐng)參見CopyObject。
注意事項(xiàng)
當(dāng)Object被轉(zhuǎn)換為低頻訪問、歸檔存儲(chǔ)、冷歸檔存儲(chǔ)或者深度冷歸檔存儲(chǔ)類型后,需注意以下事項(xiàng):
最小計(jì)量空間
對(duì)于小于64 KB的Object,會(huì)按照64 KB計(jì)算空間大小。
最低存儲(chǔ)時(shí)長
低頻訪問類型的Object需至少存儲(chǔ)30天,歸檔存儲(chǔ)類型的Object需至少存儲(chǔ)60天,冷歸檔存儲(chǔ)類型的Object需至少存儲(chǔ)180天,深度冷歸檔存儲(chǔ)類型的Object需至少存儲(chǔ)180天。如果存儲(chǔ)未滿指定周期,會(huì)對(duì)應(yīng)收取存儲(chǔ)不足規(guī)定時(shí)長容量費(fèi)用。更多信息,請(qǐng)參見存儲(chǔ)費(fèi)用。
通過生命周期自動(dòng)轉(zhuǎn)換Object存儲(chǔ)類型
將Object存儲(chǔ)類型轉(zhuǎn)換為低頻、歸檔類型時(shí),不會(huì)重新計(jì)算Object的存儲(chǔ)時(shí)間。
例如,a.txt作為標(biāo)準(zhǔn)存儲(chǔ)類型已在OSS中存儲(chǔ)了10天,通過生命周期轉(zhuǎn)換為低頻訪問類型,則繼續(xù)存儲(chǔ)20天即可滿足最低存儲(chǔ)時(shí)長30天的要求。
將Object存儲(chǔ)類型轉(zhuǎn)換為冷歸檔或者深度冷歸檔類型時(shí),會(huì)重新計(jì)算Object的存儲(chǔ)時(shí)間。
示例1:a.txt作為標(biāo)準(zhǔn)存儲(chǔ)類型或者低頻訪問類型已在OSS中存儲(chǔ)了10天,通過生命周期規(guī)則轉(zhuǎn)換為冷歸檔或者深度冷歸檔類型,需繼續(xù)存儲(chǔ)180天才滿足最低存儲(chǔ)時(shí)長180天的要求。
示例2:a.txt作為冷歸檔類型已在OSS中存儲(chǔ)了30天,通過生命周期規(guī)則轉(zhuǎn)換為深度冷歸檔,將收取冷歸檔存儲(chǔ)不足規(guī)定時(shí)長180天的費(fèi)用。此外,轉(zhuǎn)為深度冷歸檔后,需繼續(xù)存儲(chǔ)180天后才滿足最低存儲(chǔ)時(shí)長180天的要求。
通過CopyObject手動(dòng)轉(zhuǎn)換Object存儲(chǔ)類型
通過CopyObject手動(dòng)轉(zhuǎn)換Object為任意存儲(chǔ)類型時(shí),會(huì)重新計(jì)算Object的存儲(chǔ)時(shí)間。
例如,a.txt作為標(biāo)準(zhǔn)存儲(chǔ)類型已在OSS中存儲(chǔ)了10天,通過CopyObject手動(dòng)將Object轉(zhuǎn)換為低頻訪問類型,需繼續(xù)存儲(chǔ)30天才滿足最低存儲(chǔ)時(shí)長30天的要求。
如果您在低頻訪問、歸檔、冷歸檔或者深度冷歸檔類型的Object存儲(chǔ)未滿規(guī)定時(shí)長前,進(jìn)行重命名或者通過上傳同名文件進(jìn)行覆寫等操作,會(huì)產(chǎn)生存儲(chǔ)不足規(guī)定時(shí)長容量費(fèi)用。例如,您在低頻訪問類型Object存儲(chǔ)29天后執(zhí)行了重命名操作,OSS將重新計(jì)算Object的最后修改時(shí)間,即您需要繼續(xù)存儲(chǔ)30天才能滿足低頻訪問最低存儲(chǔ)時(shí)長的要求。
解凍時(shí)間
歸檔存儲(chǔ)、冷歸檔存儲(chǔ)和深度冷歸檔存儲(chǔ)類型Object恢復(fù)為可讀取狀態(tài)需要一定的解凍時(shí)間,如果業(yè)務(wù)場景需要實(shí)時(shí)讀取Object時(shí),不建議將Object轉(zhuǎn)換成歸檔存儲(chǔ)、冷歸檔存儲(chǔ)或深度冷歸檔存儲(chǔ)類型。
請(qǐng)求費(fèi)用
轉(zhuǎn)換存儲(chǔ)類型的方式 | Object源存儲(chǔ)類型 | 請(qǐng)求費(fèi)用 |
通過生命周期規(guī)則 | 標(biāo)準(zhǔn)、低頻訪問、歸檔、冷歸檔 | 按照Object的源存儲(chǔ)類型收取Put類請(qǐng)求費(fèi)用,計(jì)量到當(dāng)前Bucket。 |
通過CopyObject | 歸檔存儲(chǔ) |
|
標(biāo)準(zhǔn)、低頻訪問、冷歸檔、深度冷歸檔 | 按Object源存儲(chǔ)類型收取Put類請(qǐng)求費(fèi)用,計(jì)量到目標(biāo)Bucket。 |
①在已開啟歸檔直讀的情況下,通過CopyObject將歸檔存儲(chǔ)類型的源Object轉(zhuǎn)換為其他存儲(chǔ)類型時(shí),無需提前解凍,不會(huì)產(chǎn)生歸檔存儲(chǔ)數(shù)據(jù)取回容量費(fèi)用,但會(huì)產(chǎn)生歸檔直讀數(shù)據(jù)取回容量費(fèi)用。
②在未開啟歸檔直讀的情況下,通過CopyObject將歸檔存儲(chǔ)類型的源Object轉(zhuǎn)換為其他存儲(chǔ)類型時(shí),需提前解凍,會(huì)產(chǎn)生歸檔存儲(chǔ)數(shù)據(jù)取回容量費(fèi)用,不會(huì)產(chǎn)生歸檔直讀數(shù)據(jù)取回容量費(fèi)用。
更多信息,請(qǐng)參見數(shù)據(jù)處理費(fèi)用。
數(shù)據(jù)取回費(fèi)用
訪問低頻訪問類型的Object時(shí),會(huì)根據(jù)實(shí)際訪問量額外收取數(shù)據(jù)取回費(fèi)用。解凍歸檔存儲(chǔ)、冷歸檔存儲(chǔ)和深度冷歸檔存儲(chǔ)類型的Object會(huì)額外收取數(shù)據(jù)解凍費(fèi)用。開啟歸檔直讀后,直接訪問歸檔存儲(chǔ)數(shù)據(jù)的Object會(huì)額外收取歸檔直讀費(fèi)用。這些費(fèi)用與流出流量費(fèi)用是兩個(gè)獨(dú)立計(jì)費(fèi)項(xiàng)。如果Object每月平均訪問頻率高于1次,Object轉(zhuǎn)換成低頻訪問、歸檔存儲(chǔ)、冷歸檔存儲(chǔ)或深度冷歸檔存儲(chǔ)類型后的使用成本可能高于標(biāo)準(zhǔn)存儲(chǔ)類型。
臨時(shí)存儲(chǔ)費(fèi)用
冷歸檔存儲(chǔ)和深度冷歸檔存儲(chǔ)類型Object在數(shù)據(jù)解凍時(shí)會(huì)生成一份標(biāo)準(zhǔn)存儲(chǔ)類型的Object副本用于訪問。該Object在解凍時(shí)間結(jié)束前會(huì)以標(biāo)準(zhǔn)存儲(chǔ)的存儲(chǔ)費(fèi)率計(jì)算臨時(shí)存儲(chǔ)費(fèi)用。
常見問題
基于最后一次修改時(shí)間的生命周期規(guī)則是否支持將Object從低頻訪問類型轉(zhuǎn)換為標(biāo)準(zhǔn)類型?
不支持。您可以通過以下方式將Object從低頻訪問類型轉(zhuǎn)為標(biāo)準(zhǔn)類型:
通過CopyObject的方式
CopyObject接口支持將單個(gè)Object從低頻訪問類型轉(zhuǎn)為標(biāo)準(zhǔn)類型。具體操作,請(qǐng)參見通過CopyObject接口手動(dòng)轉(zhuǎn)換Object的存儲(chǔ)類型。
通過ossutil工具
ossutil支持通過set-meta命令添加X-Oss-Storage-Class選項(xiàng)的方式將單個(gè)或多個(gè)Object從低頻訪問類型轉(zhuǎn)換為標(biāo)準(zhǔn)類型。具體操作,請(qǐng)參見設(shè)置或更新元數(shù)據(jù)。