基于最后一次修改時間配置生命周期規(guī)則以降低OSS存儲成本
并不是所有上傳至OSS的數(shù)據(jù)都需要頻繁訪問,但基于數(shù)據(jù)合規(guī)或者存檔等原因,部分?jǐn)?shù)據(jù)仍需要繼續(xù)保存。或者基于業(yè)務(wù)使用場景,希望批量刪除Bucket內(nèi)不再需要保存的數(shù)據(jù)。您可以配置基于最后一次修改時間(Last Modified Time)的生命周期規(guī)則,定期將Object從熱存儲類型轉(zhuǎn)為冷存儲類型,或者刪除Object,以降低存儲成本。
使用場景
某醫(yī)療機構(gòu)的醫(yī)療檔案,上傳至OSS后半年內(nèi)需要偶爾訪問,半年后基本不再訪問。可以通過設(shè)置生命周期規(guī)則,將已上傳180天的醫(yī)療檔案轉(zhuǎn)為歸檔存儲。
某公司服務(wù)熱線的錄音文件,上傳至OSS后2個月內(nèi),需要作為數(shù)據(jù)統(tǒng)計及核查的依據(jù),2個月后偶爾訪問,半年后基本不再訪問,2年后數(shù)據(jù)不再需要存儲。可以通過設(shè)置生命周期規(guī)則,設(shè)置錄音文件上傳60天后轉(zhuǎn)為低頻訪問存儲,180天后轉(zhuǎn)為歸檔存儲,730天后刪除。
某Bucket內(nèi)有大量文件需要全部刪除,但是手動刪除每次僅可以刪除最多1000個文件,比較麻煩。此時可以配置一條匹配整個Bucket的生命周期規(guī)則,設(shè)置一天后刪除所有文件。此Bucket內(nèi)的數(shù)據(jù)會在第二天被全部刪除。
關(guān)于存儲類型的介紹,請參見存儲類型概述。
使用限制
地域?qū)傩韵拗?/b>
由于無地域?qū)傩源鎯臻g僅支持標(biāo)準(zhǔn)存儲類型文件,因此基于最后一次修改時間的生命周期規(guī)則作用于無地域?qū)傩源鎯臻g時,僅執(zhí)行刪除操作,不涉及存儲類型轉(zhuǎn)換操作。
匹配條件
生命周期規(guī)則目前僅支持根據(jù)前綴和標(biāo)簽進行匹配,不支持通配符匹配、后綴匹配以及正則匹配。
碎片過期限制
不支持對重疊前綴的Object設(shè)置兩條或兩條以上包含碎片過期策略的生命周期規(guī)則。示例如下:
示例一
您對整個Bucket設(shè)置了一條包含碎片過期策略的生命周期規(guī)則,則不支持對Bucket中任意前綴的Object再設(shè)置一條包含碎片過期策略的生命周期規(guī)則。
示例二
您對某個Bucket中前綴為dir1設(shè)置了一條包含碎片過期策略的生命周期規(guī)則,則不支持對該Bucket中包含重疊前綴(例如dir1/dir2)的Object再設(shè)置一條包含碎片過期策略的生命周期規(guī)則。
存儲類型轉(zhuǎn)換限制
不支持通過生命周期規(guī)則將追加上傳生成的Appendable類型的Object轉(zhuǎn)換為冷歸檔存儲或者深度冷歸檔存儲類型。
不支持通過生命周期規(guī)則將軟鏈接(symlink)轉(zhuǎn)換為低頻訪問、歸檔、冷歸檔以及深度冷歸檔存儲類型。
注意事項
規(guī)則數(shù)量
單個Bucket最多支持配置1000條生命周期規(guī)則,單條生命周期規(guī)則中可同時包含最后一次修改時間以及最后一次訪問時間的策略。
覆蓋語義
PutBucketLifecycle為覆蓋語義。例如,某個Bucket已配置了生命周期規(guī)則Rule1,您需要在Rule1基礎(chǔ)上繼續(xù)追加生命周期規(guī)則Rule2,您需要執(zhí)行以下操作。
調(diào)用GetBucketLifecycle接口獲取當(dāng)前生命周期規(guī)則配置Rule1。
在Rule1基礎(chǔ)上疊加Rule2。
調(diào)用PutBucketLifecycle接口更新生命周期規(guī)則為Rule1+Rule2。
生效時間
生命周期規(guī)則創(chuàng)建后的24小時內(nèi),OSS會加載規(guī)則。規(guī)則加載完成后,OSS會在每天的北京時間8:00開始執(zhí)行規(guī)則。
Object的最后修改時間與生命周期規(guī)則開始執(zhí)行時間(8:00)必須間隔24小時以上。例如生命周期規(guī)則指定Object上傳1天后刪除,則2020年7月20日上傳的文件刪除時間如下:
北京時間8:00前上傳的文件會在2020年7月21日8:00開始刪除,并在7月22日8:00前刪除完畢。
北京時間8:00后上傳的文件會在2020年7月22日8:00開始刪除,并在7月23日8:00前刪除完畢。
更新生命周期規(guī)則會中止當(dāng)天的生命周期任務(wù),請不要頻繁更新生命周期規(guī)則。
執(zhí)行完成時間
對于未配置標(biāo)簽的生命周期規(guī)則
華東1(杭州)、華東2(上海)、華北2(北京)、華北 3(張家口)、華北6(烏蘭察布)、華南1(深圳)、新加坡地域執(zhí)行10億或以下次生命周期相關(guān)操作(包括Object刪除、Object存儲類型轉(zhuǎn)換以及碎片過期),可在24小時內(nèi)完成。如果生命周期相關(guān)操作超出10億次,則可能超出24小時。
其他地域執(zhí)行1億或以下次生命周期相關(guān)操作,可在24小時內(nèi)完成。如果生命周期相關(guān)操作超出1億次,則可能超出24小時。
對于已配置標(biāo)簽的生命周期規(guī)則
華東1(杭州)、華東2(上海)、華北2(北京)、華北 3(張家口)、華北6(烏蘭察布)、華南1(深圳)、新加坡地域執(zhí)行5億或以下次生命周期相關(guān)操作(包括Object刪除、Object存儲類型轉(zhuǎn)換以及碎片過期),可在24小時內(nèi)完成。如果生命周期相關(guān)操作超出5億次,則可能超出24小時。
其他地域執(zhí)行5千萬或以下次生命周期相關(guān)操作,可在24小時內(nèi)完成。如果生命周期相關(guān)操作超出5千萬次,則可能超出24小時。
如果存儲空間開啟了版本控制,則對Object的每個版本均記為一次操作。
費用說明
關(guān)于通過生命周期規(guī)則轉(zhuǎn)換Object存儲類型或者刪除Object時可能涉及的存儲和請求費用說明,請參見生命周期費用說明。
在開通了OSS-HDFS服務(wù)的Bucket中配置生命周期規(guī)則
在開通了OSS-HDFS服務(wù)的Bucket中配置基于OSS文件的生命周期規(guī)則
如果您對開通了OSS-HDFS服務(wù)的Bucket設(shè)置或更新為匹配整個Bucket的生命周期規(guī)則,需通過NOT元素排除
.dlsdata/
,避免因生命周期規(guī)則觸發(fā)的Object刪除或存儲類型轉(zhuǎn)換行為影響OSS-HDFS數(shù)據(jù)讀寫。在開通了OSS-HDFS服務(wù)的Bucket中配置基于HDFS文件的生命周期規(guī)則
如果您需要對經(jīng)常訪問的數(shù)據(jù)以標(biāo)準(zhǔn)類型進行存儲,對于較少訪問的數(shù)據(jù)以低頻、歸檔以及冷歸檔類型進行存儲,您可以使用基于生命周期規(guī)則的冷熱分層存儲功能實現(xiàn)這一場景。具體操作,請參見使用冷熱分層存儲。
組成元素
匹配元素
按前綴匹配:按指定前綴匹配Object和碎片。可創(chuàng)建多條規(guī)則匹配不同的前綴,前綴不能重復(fù)。前綴的命名規(guī)范與Object命名規(guī)范相同,詳情請參見對象(Object)。
按標(biāo)簽匹配:按指定標(biāo)簽的Key和Value匹配Object。單條規(guī)則可配置多個標(biāo)簽,僅當(dāng)Object包含所有標(biāo)簽時執(zhí)行生命周期規(guī)則。
生命周期規(guī)則設(shè)置的標(biāo)簽
Object攜帶的標(biāo)簽
生命周期規(guī)則是否作用于該Object
a:1,b:2
a:1
否
a:1,b:3
否
a:1,b:2
是
a;1,b:2,c:3
是
說明標(biāo)簽匹配規(guī)則不作用于碎片。
按前綴+標(biāo)簽匹配:按指定前綴和標(biāo)簽的篩選條件匹配對象。
配置到整個Bucket:匹配整個Bucket內(nèi)的所有Object和碎片。
NOT元素:如果您希望按照生命周期規(guī)則對與前綴和標(biāo)簽匹配的Object進行相應(yīng)處理的同時,跳過不需要處理的Object,您可以通過NOT元素對不需要處理的Object指定前綴和標(biāo)簽。關(guān)于NOT元素的配置示例,請參見NOT示例。
重要一條生命周期規(guī)則僅允許配置一個NOT元素。NOT元素下必須配置且僅允許配置一個前綴。此外,NOT元素下可以配置至多一個Object標(biāo)簽,也可以置空。
Object的過期時間及操作
過期天數(shù):指定一個過期天數(shù)N,并指定非版本狀態(tài)下的所有Object、以及版本控制狀態(tài)下的當(dāng)前版本Object過期后執(zhí)行什么操作。Object會在其最后修改時間的N天后過期,并執(zhí)行指定的操作。
過期日期:指定一個過期日期,并指定非版本狀態(tài)下的所有Object、以及版本控制狀態(tài)下的當(dāng)前版本Object過期后執(zhí)行什么操作。最后修改時間在該日期之前的Object全部過期,并執(zhí)行指定的操作。
Object成為非當(dāng)前版本天數(shù):指定一個過期天數(shù)N,并指定非當(dāng)前版本Object過期后執(zhí)行什么操作。Object會在其成為非當(dāng)前版本的N天后過期,并執(zhí)行指定的操作。
您可以轉(zhuǎn)換過期Object的存儲類型或?qū)⑵鋭h除。詳情請參見生命周期配置元素。
碎片的過期時間及操作
過期天數(shù):可指定一個過期天數(shù)N,文件碎片會在其最后修改時間的N天后被刪除。
過期日期:指定一個過期日期,最后修改時間在該日期之前的文件碎片會被全部刪除。
規(guī)則說明
不同前綴
例如,某個Bucket有如下幾個Object:
logs/programl/log1.txt
logs/program2/log2.txt
logs/program3/log3.txt
doc/readme.txt
如果生命周期規(guī)則指定的前綴是logs/,那么此規(guī)則僅作用于前三個以logs/開頭的Object;如果指定的前綴是doc/readme.txt,則此規(guī)則則只對doc/readme.txt起作用。
您也可以為生命周期規(guī)則指定中文前綴。
對過期策略匹配的Object執(zhí)行GET或HEAD操作時,OSS會在響應(yīng)Header中加入x-oss-expiration
頭。其中expiry-date
的值表示Object的過期日期;rule-id
的值表示相匹配的規(guī)則ID。
相同前綴和標(biāo)簽
當(dāng)不同生命周期規(guī)則作用于相同前綴和標(biāo)簽的Object時,刪除操作優(yōu)先于存儲類型轉(zhuǎn)換操作。rule1用于指定所有前綴為abc,標(biāo)簽為a=1的Object 20天后刪除,rule2規(guī)則不生效。
rule | prefix | tag | action |
rule1 | abc | a=1 | 20天后刪除 |
rule2 | abc | a=1 | 20天后轉(zhuǎn)為Archive |
前綴重疊+標(biāo)簽相同
rule1用于指定所有標(biāo)簽為a=1的Object 10天后轉(zhuǎn)為IA。rule2用于指定前綴為abc且標(biāo)簽為a=1的Object 120天后刪除。
rule | prefix | tag | action |
rule1 | - | a=1 | 10天后轉(zhuǎn)為IA |
rule2 | abc | a=1 | 120天后被刪除 |
rule3用于指定所有標(biāo)簽為a=1的Object 20天后轉(zhuǎn)為Archive。由于Archive類型文件無法轉(zhuǎn)換為IA類型,因此rule4指定的前綴為abc且標(biāo)簽為a=1的Object 30天后轉(zhuǎn)為IA的規(guī)則不生效。
rule | prefix | tag | action |
rule3 | - | a=1 | 20天后轉(zhuǎn)為Archive |
rule4 | abc | a=1 | 30天后轉(zhuǎn)為IA |
NOT
對同一個Bucket配置多條生命周期規(guī)則,且某條生命周期規(guī)則涉及NOT元素時,NOT元素指定的行為只對本條生命周期規(guī)則生效。具體示例如下:
示例一
通過生命周期規(guī)則1,指定examplebucket中前綴為dir/的Object 100天后刪除。
通過生命周期規(guī)則2,通過NOT元素指定examplebucket中除前綴為dir/以外的所有Object 50天后刪除。
以生命周期規(guī)則生效時間為起點,examplebucket中Object的刪除行為如下表所示。
Object
刪除行為
前綴為dir/的Object
100天后刪除
前綴不為dir/的Object
50天后刪除
示例二
通過生命周期規(guī)則1,通過NOT元素指定examplebucket內(nèi)除標(biāo)簽(key1:value1)以外的所有Object 30天后刪除。
通過生命周期規(guī)則2,指定examplebucket內(nèi)包含標(biāo)簽(key2:value2)的所有Object 50天后刪除。
以生命周期規(guī)則生效時間為起點,examplebucket內(nèi)Object的刪除行為如下表所示:
Object
刪除行為
對于未包含以上標(biāo)簽的所有Object
30天后刪除
對于僅包含key1:value1標(biāo)簽的Object
不刪除
對于僅包含key2:value2標(biāo)簽的Object
30天后刪除
對于同時包含key1:value1以及key2:value2標(biāo)簽的Object
50天后刪除
操作步驟
使用OSS控制臺
登錄OSS管理控制臺。
單擊Bucket 列表,然后單擊目標(biāo)Bucket名稱。
在左側(cè)導(dǎo)航欄, 選擇 。
在生命周期頁面,單擊創(chuàng)建規(guī)則。
說明如果您僅需要創(chuàng)建基于最后一次修改時間策略的生命周期規(guī)則,不需要在生命周期頁面打開啟用訪問跟蹤開關(guān)。開啟訪問跟蹤會產(chǎn)生額外費用。訪問跟蹤適用于創(chuàng)建基于最后一次訪問時間策略的生命周期規(guī)則。更多信息,請參見基于最后一次訪問時間的生命周期規(guī)則。
在創(chuàng)建生命周期規(guī)則面板,按如下說明配置生命周期規(guī)則。
存儲空間未開啟版本控制
區(qū)域
配置項
說明
基礎(chǔ)設(shè)置
狀態(tài)
設(shè)置生命周期規(guī)則的狀態(tài),可選擇啟動或禁用。
啟動生命周期規(guī)則后,將按照配置的生命周期規(guī)則轉(zhuǎn)換數(shù)據(jù)存儲類型或刪除數(shù)據(jù)。
禁用生命周期規(guī)則后,將中斷生命周期任務(wù)。
策略
選擇生命周期規(guī)則作用的Object。您可以選擇按前綴匹配或配置到整個Bucket。
說明選擇按前綴匹配時,需要填寫前綴的完整路徑。例如,您希望僅作用于src/dir1下的所有文件,則前綴需要填寫為src/dir1,僅填寫dir1則不生效。
是否允許前綴重疊
OSS默認(rèn)會檢查各個生命周期規(guī)則的前綴是否重疊。例如,您設(shè)置了以下兩條包含重疊前綴的生命周期規(guī)則:
規(guī)則1
指定該Bucket內(nèi)所有前綴為dir1/的Object在距離最后一次修改時間180天后刪除。
規(guī)則2
指定該Bucket內(nèi)所有前綴為dir1/dir2/的Object在距離最后一次修改時間30天后轉(zhuǎn)低頻訪問類型,60天后刪除。
在配置規(guī)則2時未選中該選項的情況下,因后臺檢測到dir1/dir2/目錄下的Object同時匹配兩條刪除規(guī)則,因此會拒絕設(shè)置規(guī)則2,并報錯Overlap for same action type Expiration.。
在配置規(guī)則2時選中該選項的情況下,dir1/dir2/下的Object會在30天后轉(zhuǎn)低頻訪問類型,60天后刪除。dir1/下的其他Object會在180天刪除。
說明如果配置了多條規(guī)則,且其中一條為基于整個Bucket的規(guī)則時,會被視為前綴重疊的情況。
前綴
輸入規(guī)則要匹配的Object名稱的前綴。
前綴設(shè)置為img,表示匹配名稱以img開頭的所有Object,例如imgtest.png、img/example.jpg等。
前綴設(shè)置為img/,表示匹配名稱以img/開頭的所有Object,例如img/example.jpg、img/test.jpg等。
標(biāo)簽
生命周期規(guī)則僅針對擁有指定標(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è)置了標(biāo)簽,標(biāo)簽的key為a,value為1,則該規(guī)則將匹配Bucket內(nèi)所有名稱以img開頭,標(biāo)簽為a=1的Object。
更多信息,請參見對象標(biāo)簽。
NOT
NOT選項用于設(shè)置生命周期規(guī)則對指定前綴和標(biāo)簽的Object不生效。
重要開啟NOT選項時,前綴和標(biāo)簽必須至少存在一項,即同時設(shè)置前綴和標(biāo)簽或者只設(shè)置前綴或標(biāo)簽。
NOT語義定義標(biāo)簽中的key不支持與標(biāo)簽配置項中定義的key相同。
開啟NOT選項后,不支持設(shè)置碎片過期策略。
文件大小
指定生命周期規(guī)則生效的文件大小。
指定最小文件:生命周期規(guī)則對大于該值的文件大小生效。取值大于0 B,小于5 TB。
指定最大文件:生命周期規(guī)則對小于該值的文件大小生效。取值大于0 B,小于等于5 TB。
重要如果在同一條生命周期中,同時配置了指定最小文件和指定最大文件:
確保指定最大文件的值大于指定最小文件的值。
不支持配置碎片執(zhí)行策略。
不支持配置清除刪除標(biāo)記策略。
文件執(zhí)行策略設(shè)置
文件時間策略
選擇Object過期策略,可選擇指定天數(shù)、指定日期和不啟用。選擇不啟用時,文件過期策略不生效。
生命周期管理規(guī)則
配置轉(zhuǎn)換Object存儲類型或者刪除過期Object的規(guī)則,可選擇低頻訪問、歸檔存儲、冷歸檔存儲、深度冷歸檔存儲和數(shù)據(jù)刪除。
例如,當(dāng)您將文件時間策略設(shè)置為指定日期,并將日期設(shè)置為2023年9月24日,則最后一次修改時間在2023年9月24日之前的Object會被自動刪除,且刪除后不可恢復(fù)。
碎片執(zhí)行策略設(shè)置
碎片過期策略
配置碎片執(zhí)行策略。如果選中了標(biāo)簽,則無法配置該選項。您可以選擇按指定天數(shù)或指定日期執(zhí)行碎片過期策略,也可以選擇不啟用碎片過期策略。當(dāng)選擇不啟用時,碎片過期策略不生效。
重要生命周期規(guī)則至少包含文件過期策略或碎片過期策略。
碎片規(guī)則
根據(jù)碎片過期策略選擇的過期天數(shù)或過期日期設(shè)定碎片何時過期,碎片過期后會被自動刪除,且刪除后不可恢復(fù)。
存儲空間已開啟版本控制
開啟版本控制后,基礎(chǔ)設(shè)置與碎片執(zhí)行策略設(shè)置區(qū)域涉及的配置項,與未開啟版本控制的配置方法相同。以下表格僅介紹與未開啟版本控制相比,開啟版本控制后配置項存在的差異。
區(qū)域
配置項
說明
當(dāng)前版本文件執(zhí)行策略設(shè)置
清理對象刪除標(biāo)記
開啟版本控制后,清除策略中增加了清理對象刪除標(biāo)記選項,其他選項與未開啟版本控制時相同。
選擇此選項后,如果當(dāng)前Object僅有一個版本且為刪除標(biāo)記時,則OSS將刪除過期Object的刪除標(biāo)記。如果當(dāng)前Object有多個版本,且Object的最新版本為刪除標(biāo)記時,則OSS將保留該刪除標(biāo)記。關(guān)于刪除標(biāo)記的更多信息,請參見刪除標(biāo)記。
重要當(dāng)有歷史版本存在時,該規(guī)則不會清理對象刪除標(biāo)記。因此建議及時清理對象刪除標(biāo)記和非必要的歷史版本,否則Bucket內(nèi)因存儲過多的刪除標(biāo)記,導(dǎo)致List性能下降。
歷史版本文件執(zhí)行策略設(shè)置
文件時間策略
設(shè)置歷史版本文件的過期策略,可選擇指定天數(shù)和不啟用。當(dāng)選擇不啟用時,文件過期策略不生效。
生命周期管理規(guī)則
設(shè)定一個過期天數(shù)N,歷史版本的Object會在其被轉(zhuǎn)換為歷史版本的N天后過期,并在過期的第二天執(zhí)行指定操作。例如設(shè)置為30,則在2023年09月01日被轉(zhuǎn)為歷史版本的Object會在2023年10月01日被轉(zhuǎn)換為指定存儲類型或被刪除。
重要您可以通過Object下一個版本的最后一次修改時間確定 Object被轉(zhuǎn)為歷史版本的時間。
單擊確定。
生命周期規(guī)則保存成功后,您可以在策略列表中查看已設(shè)置的生命周期規(guī)則。
使用阿里云SDK
以下僅列舉常見SDK的配置生命周期規(guī)則的代碼示例。關(guān)于其他SDK的配置生命周期規(guī)則的代碼示例,請參見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.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請按實際情況填寫。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環(huán)境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設(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實例。
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/";
// 距最后修改時間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);
// 距最后修改時間10天后轉(zhuǎn)低頻訪問存儲類型,距最后修改時間30天后轉(zhuǎn)歸檔存儲類型。
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)為歸檔存儲。
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針對版本控制狀態(tài)下的Bucket。
rule = new LifecycleRule(ruleId6, matchPrefix6, LifecycleRule.RuleStatus.Enabled);
// 設(shè)置Object相對最后修改時間365天之后自動轉(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è)置自動移除過期刪除標(biāo)記。
rule.setExpiredDeleteMarker(true);
// 設(shè)置非當(dāng)前版本的object距最后修改時間10天之后轉(zhuǎn)為低頻訪問類型。
LifecycleRule.NoncurrentVersionStorageTransition noncurrentVersionStorageTransition =
new LifecycleRule.NoncurrentVersionStorageTransition().withNoncurrentDays(10).withStrorageClass(StorageClass.IA);
// 設(shè)置非當(dāng)前版本的Object距最后修改時間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ī)則請求。
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)境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$provider = new EnvironmentVariableCredentialsProvider();
// Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 填寫存儲空間名稱。
$bucket= "examplebucket";
// 設(shè)置規(guī)則ID和文件前綴。
$ruleId0 = "rule0";
$matchPrefix0 = "A0/";
$ruleId1 = "rule1";
$matchPrefix1 = "A1/";
$lifecycleConfig = new LifecycleConfig();
$actions = array();
// 距最后修改時間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)境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設(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,
// 填寫存儲空間名稱。
bucket: 'yourbucketname'
});
async function putBucketLifecycle(lifecycle) {
try {
const result = await client.putBucketLifecycle('yourbucketname', [
lifecycle
]);
console.log(result);
} catch (e) {
console.log(e);
}
}
const lifecycle1 = {
id: 'rule1',
status: 'Enabled',
prefix: 'foo/',
expiration: {
// 指定當(dāng)前版本Object距其最后修改時間3天后過期。
days: 3
}
}
putBucketLifecycle(lifecycle1)
const lifecycle2 = {
id: 'rule2',
status: 'Enabled',
prefix: 'foo/',
expiration: {
// 指定日期之前創(chuàng)建的文件過期。
createdBeforeDate: '2020-02-18T00:00:00.000Z'
},
}
putBucketLifecycle(lifecycle2)
const lifecycle3 = {
id: 'rule3',
status: 'Enabled',
prefix: 'foo/',
abortMultipartUpload: {
// 指定分片3天后過期。
days: 3
},
}
putBucketLifecycle(lifecycle3)
const lifecycle4 = {
id: 'rule4',
status: 'Enabled',
prefix: 'foo/',
abortMultipartUpload: {
// 指定日期之前創(chuàng)建的分片過期。
createdBeforeDate: '2020-02-18T00:00:00.000Z'
},
}
putBucketLifecycle(lifecycle4)
const lifecycle5 = {
id: 'rule5',
status: 'Enabled',
prefix: 'foo/',
transition: {
// 指定當(dāng)前版本Object距其最后修改時間20天后轉(zhuǎn)歸檔存儲類型。
days: 20,
storageClass: 'Archive'
},
expiration: {
// 指定當(dāng)前版本Object距其最后修改時間21天后過期。
days: 21
},
}
putBucketLifecycle(lifecycle5)
const lifecycle6 = {
id: 'rule6',
status: 'Enabled',
prefix: 'foo/',
transition: {
// 達(dá)到指定日期后自動將文件轉(zhuǎn)為歸檔類型。
createdBeforeDate: '2023-02-19T00:00:00.000Z',
storageClass: 'Archive'
},
expiration: {
// 達(dá)到指定日期后自動將文件刪除。
createdBeforeDate: '2023-01-18T00:00:00.000Z'
},
}
putBucketLifecycle(lifecycle6)
const lifecycle7 = {
id: 'rule7',
status: 'Enabled',
prefix: 'foo/',
expiration: {
// 設(shè)置自動移除過期刪除標(biāo)記。
expiredObjectDeleteMarker: true
}
}
putBucketLifecycle(lifecycle7)
const lifecycle8 = {
id: 'rule8',
status: 'Enabled',
prefix: 'foo/',
// 設(shè)置非當(dāng)前版本的Object距其最后修改時間10天之后轉(zhuǎn)為低頻訪問類型。
noncurrentVersionTransition: {
noncurrentDays: '10',
storageClass: 'IA'
}
}
putBucketLifecycle(lifecycle8)
const lifecycle9 = {
id: 'rule9',
status: 'Enabled',
prefix: 'foo/',
// 設(shè)置非當(dāng)前版本的Object距其最后修改時間10天之后轉(zhuǎn)為低頻訪問類型。
noncurrentVersionTransition: {
noncurrentDays: '10',
storageClass: 'IA'
},
// 指定規(guī)則所適用的對象標(biāo)簽。
tag: [{
key: 'key1',
value: 'value1'
},
{
key: 'key2',
value: 'value2'
}]
}
putBucketLifecycle(lifecycle9)
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)境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設(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對應(yīng)的Region信息,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數(shù)
region = "cn-hangzhou"
# examplebucket填寫存儲空間名稱。
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)
# 設(shè)置Object距其最后修改時間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è)置存儲類型轉(zhuǎn)換規(guī)則,指定Object在其最后修改時間20天之后轉(zhuǎn)為低頻訪問類型,在其最后修改時間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è)置存儲類型轉(zhuǎn)換規(guī)則,指定Object在其最后修改時間超過365天后轉(zhuǎn)為ARCHIVE類型。
# rule6與以上幾個規(guī)則不同的是它指定了匹配的標(biāo)簽,同時擁有key1=value1,key2=value2兩個標(biāo)簽的object才會匹配此規(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針對版本控制狀態(tài)下的Bucket。
# 設(shè)置Object在其最后修改時間365天之后自動轉(zhuǎn)為ARCHIVE類型。
# 設(shè)置自動移除過期刪除標(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)境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設(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實例,按照您的需要修改默認(rèn)參數(shù)。
var conf = new ClientConfiguration();
// 設(shè)置v4簽名。
conf.SignatureVersion = SignatureVersion.V4;
// 創(chuàng)建OssClient實例。
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è)置碎片在距最后修改時間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距最后修改時間90天之后轉(zhuǎn)為低頻訪問類型。
new LifecycleRule.LifeCycleNoncurrentVersionTransition(){
StorageClass = StorageClass.IA,
NoncurrentDays = 90
},
// 設(shè)置非當(dāng)前版本的Object距最后修改時間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會定期執(zhí)行該規(guī)則;如果值為false,則OSS會忽略該規(guī)則。
rule1.setStatus(true);
// 距最后修改時間200天后過期。
rule1.setDays("200");
// 30天后自動轉(zhuǎn)為歸檔存儲類型(Archive)
rule1.setArchiveDays("30");
// 未完成分片3天后過期。
rule1.setMultipartDays("3");
// 15天后自動轉(zhuǎn)為低頻存儲類型(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)境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設(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實例。
// yourEndpoint填寫B(tài)ucket對應(yīng)的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
// yourRegion填寫B(tài)ucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
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)
}
// 填寫存儲空間名稱。
bucketName := "examplebucket"
// 指定生命周期規(guī)則1,并在規(guī)則中指定前綴為foo的文件在距離最后一次修改時間3天后過期。
rule1 := oss.BuildLifecycleRuleByDays("rule1", "foo/", true, 3)
// 在受版本控制狀態(tài)下的Object僅有刪除標(biāo)記的情況下,自動刪除刪除標(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存儲類型。
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,對標(biāo)簽鍵為tag1、標(biāo)簽值為value1的文件,距文件最后一次修改時間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賬號信息。*/
/* 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)境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設(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());
/*指定過期時間。*/
auto rule2 = LifecycleRule();
rule2.setID("rule2");
rule2.setPrefix("test2/");
rule2.setStatus(RuleStatus::Disabled);
rule2.setExpiration(date);
/*rule3為針對版本控制狀態(tài)下的Bucket的生命周期規(guī)則。*/
auto rule3 = LifecycleRule();
rule3.setID("rule3");
rule3.setPrefix("test3/");
rule3.setStatus(RuleStatus::Disabled);
/*設(shè)置Object距其最后修改時間365天之后自動轉(zhuǎn)為歸檔類型。*/
auto transition = LifeCycleTransition();
transition.Expiration().setDays(365);
transition.setStorageClass(StorageClass::Archive);
rule3.addTransition(transition);
/*設(shè)置自動移除過期刪除標(biāo)記。*/
rule3.setExpiredObjectDeleteMarker(true);
/*設(shè)置非當(dāng)前版本的Object距最后修改時間10天之后轉(zhuǎn)為低頻訪問類型。*/
auto transition1 = LifeCycleTransition();
transition1.Expiration().setDays(10);
transition1.setStorageClass(StorageClass::IA);
/*設(shè)置非當(dāng)前版本的Object距最后修改時間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)境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設(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"));
//需要額外配置以下兩個參數(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ù),比如超時時間等。*/
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),等價于apr_pool_t。其實現(xiàn)代碼在apr庫中。*/
aos_pool_t *pool;
/* 重新創(chuàng)建一個內(nèi)存池,第二個參數(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的選項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);
/* 指定過期時間。*/
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");
/* 過期時間格式為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)于釋放了請求過程中各資源分配的內(nèi)存。*/
aos_pool_destroy(pool);
/* 釋放之前分配的全局資源。*/
aos_http_io_deinitialize();
return 0;
}
Ruby
require 'aliyun/oss'
client = Aliyun::OSS::Client.new(
# Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
# 從環(huán)境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設(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))
]
使用命令行工具ossutil
關(guān)于使用ossutil設(shè)置生命周期規(guī)則的具體操作, 請參見添加或修改生命周期規(guī)則。
使用REST API
如果您的程序自定義要求較高,您可以直接發(fā)起REST API請求。直接發(fā)起REST API請求需要手動編寫代碼計算簽名。更多信息,請參見PutBucketLifecycle。
常見問題
報錯Set bucket lifecycle error, InvalidArgument, Days in the Transition action for StorageClass Archive must be more than the Transition action for StorageClass IA
怎么辦?
出現(xiàn)該報錯的原因是不同存儲類型的轉(zhuǎn)儲時間不滿足指定要求。當(dāng)Bucket同時配置了轉(zhuǎn)換為低頻訪問、轉(zhuǎn)換為歸檔存儲、轉(zhuǎn)換為冷歸檔存儲以及轉(zhuǎn)換為深度冷歸檔存儲的策略時,其轉(zhuǎn)換周期必須滿足以下條件:
轉(zhuǎn)換為低頻訪問的周期<轉(zhuǎn)換為歸檔的周期<轉(zhuǎn)換為冷歸檔的周期<轉(zhuǎn)換為深度冷歸檔的周期
生命周期規(guī)則是否作用于Bucket內(nèi)已有的存量Object?
生命周期規(guī)則同時作用于配置規(guī)則前Bucket內(nèi)已有的存量Object,同時也作用于配置生命周期規(guī)則后上傳的Object。例如,您在10月07日配置了生命周期規(guī)則,指定距離Object最后一次修改時間30天后刪除,則10月5日內(nèi)上傳的Object將在11月6日開始執(zhí)行刪除操作。而10月08日上傳的Object將在11月09日執(zhí)行刪除操作。
如何修改其中一條或多條生命周期規(guī)則配置?
假設(shè)您的Bucket配置了兩條生命周期規(guī)則,分別為Rule1和Rule2,您希望修改Rule1的某個配置項,您需要執(zhí)行以下操作。
調(diào)用GetBucketLifecycle接口獲取當(dāng)前Bucket配置的所有生命周期規(guī)則,即Rule1和Rule2。
修改Rule1生命周期規(guī)則的配置項。
調(diào)用PutBucketLifecycle接口更新生命周期規(guī)則為Rule1+Rule2。
如何刪除其中一條或多條生命周期規(guī)則?
調(diào)用DeleteBucketLifecycle時會一鍵刪除Bucket配置的所有生命周期規(guī)則。假設(shè)您的Bucket配置了兩條生命周期規(guī)則,分別為Rule1和Rule2,您僅希望刪除Rule1,您需要執(zhí)行以下操作。
調(diào)用GetBucketLifecycle接口獲取當(dāng)前Bucket配置的所有生命周期規(guī)則,即Rule1和Rule2。
刪除Rule1。
調(diào)用PutBucketLifecycle接口更新生命周期規(guī)則為Rule2。
通過生命周期規(guī)則進行的類型轉(zhuǎn)換、過期刪除操作,是否有日志記錄?
所有成功通過生命周期規(guī)則進行的類型轉(zhuǎn)換、過期刪除操作都會有日志記錄,日志記錄字段如下:
Operation
CommitTransition:通過生命周期規(guī)則轉(zhuǎn)換存儲類型,例如轉(zhuǎn)換為低頻訪問、歸檔或冷歸檔存儲類型。
ExpireObject:通過生命周期規(guī)則刪除過期Object。
Sync Request
lifecycle:生命周期規(guī)則觸發(fā)的轉(zhuǎn)換存儲類型和刪除過期Object的操作。
是否支持創(chuàng)建一條生命周期規(guī)則同時清理對象刪除標(biāo)記和當(dāng)前版本對象?
不支持。您可以先創(chuàng)建一條生命周期規(guī)則,清理對象刪除標(biāo)記。 清理對象刪除標(biāo)記后,再創(chuàng)建一條生命周期規(guī)則,刪除當(dāng)前版本對象。
基于最后一次修改時間的生命周期規(guī)則是否支持將Object從低頻訪問類型轉(zhuǎn)換為標(biāo)準(zhǔn)類型?
不支持。您可以通過以下方式將Object從低頻訪問類型轉(zhuǎn)為標(biāo)準(zhǔn)類型:
通過CopyObject的方式
CopyObject接口支持將單個Object從低頻訪問類型轉(zhuǎn)為標(biāo)準(zhǔn)類型。
通過ossutil工具
ossutil支持通過set-meta命令添加X-Oss-Storage-Class選項的方式將單個或多個Object從低頻訪問類型轉(zhuǎn)換為標(biāo)準(zhǔn)類型。具體操作,請參見設(shè)置或更新元數(shù)據(jù)。
相關(guān)文檔
默認(rèn)情況下,OSS會將Object的上傳時間置為其最后一次修改時間。通過生命周期轉(zhuǎn)換文件存儲類型的操作不會更新Object的最后一次修改時間。具體哪些操作會影響Object的LastModified,請參見哪些操作會更新Object的LastModified?。
當(dāng)?shù)皖l訪問、歸檔、冷歸檔或者深度冷歸檔存儲類型Object在存儲不足規(guī)定時長時轉(zhuǎn)換了存儲類型并提前刪除時,需要收取不足規(guī)定時長容量費用。更多信息,請參見Object在存儲不足規(guī)定時長時如何計費?。
生命周期規(guī)則僅支持對整個Bucket或與前綴匹配的數(shù)據(jù)進行批量轉(zhuǎn)儲或者刪除,如果您希望刪除批量刪除指定后綴的數(shù)據(jù),您可以使用ossutil rm命令。
如果您希望OSS自動監(jiān)測數(shù)據(jù)的訪問模式并識別冷數(shù)據(jù),然后將識別出來的冷數(shù)據(jù)進行存儲類型的轉(zhuǎn)換,從而達(dá)到數(shù)據(jù)的冷熱分層存儲,最終降低存儲成本,您需要配置基于最后一次訪問時間的生命周期規(guī)則。
如果您希望查看Bucket內(nèi)所有Object的存儲類型,請參見列舉文件。