oss存储类型转换及解冻(下)
./ossutil64 ls oss://{bucket名字}/{bucket下某个目录} | awk '$1 >= "2020-01-21" && $1 <= "2020-01-31"' | sort > 2020-01-31_filelist
二、对单个冷归档文件进行解冻访问和类型转换
我补充下为啥写类型转换,解冻好是为了能访问归档文件,不然就会有前一篇文章的报错;类型转换有两个用途:
(1)公司只买了标准存储的容量包,没有归档、低频容量包,把测试好的归档类型文件转回标准存储,可以用标准存储的容量包去抵扣,不然会额外扣钱。
(2)结合ossutil 筛选出一段时间范围内的文件(看上一篇),可以用sdk或ossutil 遍历符合条件的文件,调用转换文件类型的接口去转换文件,变相来说就是,利用第二种方法(第一种是直接在控制台设置生命周期规则),而不是走控制台的生命周期规则设置类型转换(注意,用sdk或ossutil 调用接口,其实底层还是调用控制台的规则【跟阿里确认过】,调用后其实在控制台是能看到规则正在启用),这种方法会比控制台设置的快,至于快多少我也不知道哇,黑盒操作 。。。
方法1:直接从控制台设置
方法2:用 ossutil 方式
a)解冻访问
参考:https://help.aliyun.com/zh/oss/developer-reference/restore?spm=a2c4g.11186623.0.0.2b721bd0XjQgta
(1)编写 config.xml,配置解冻天数、解冻优先级等参数(预算高可以选择优先级最高的极速解冻)
(2)运行
./ossutil64 restore oss://{bucket名字}/{bucket下某个目录}/{需要解冻的文件名} config.xml
b)类型转换
下面命令是从标准类型转冷归档类型
./ossutil64 cp oss://{bucket名字}/{bucket下某个目录}/某个已经冷归档的文件 oss://{bucket名字}/{bucket下某个目录}/某个已经冷归档的文件 --meta X-oss-Storage-Class:ColdArchive
这个方法逻辑是做一个原文件的副本,然后进行类型转换,处理完后覆盖原文件,期间会有个是否覆盖的提示(这导致我写入脚本报错)
未转换前:
转换后(类型从 Standard变成 ColdArchive):
细心点的读者会发现转了类型之后,这个文件的 lastModifiedTime 都变了,变了会影响到是否能转为归档、低频的条件,标准存储转换别的存储类型对于文件存放到oss的时间是有限制的,大家可以找下阿里的帮助文档看看。
1 # coding: utf-8 2 3 import time 4 import os 5 6 from datetime import datetime 7 import pytz # 需要安装 pytz 包 8 9 import oss2 10 from oss2.credentials import EnvironmentVariableCredentialsProvider 11 12 ## 解冻模块 13 from oss2.models import RestoreConfiguration 14 15 from oss2.models import (RestoreJobParameters, 16 RestoreConfiguration, 17 RESTORE_TIER_EXPEDITED, 18 RESTORE_TIER_STANDARD, 19 RESTORE_TIER_BULK) 20 21 22 # 使用环境变量中获取的RAM用户的访问密钥配置访问凭证。 23 auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) 24 25 bucket = oss2.Bucket(auth, 'https://oss-cn-shenzhen.aliyuncs.com', 'bucket名字') 26 27 28 ### 转换类型api:https://github.com/aliyun/aliyun-oss-python-sdk/blob/master/examples/object_storage_type.py 29 30 ## 读取文件列表 31 with open('oss/file_list', 'r') as file: 32 ## 逐行读取文件内容 33 for line in file: 34 # 使用空格分隔行内容 35 columns = line.split() 36 37 # 检查是否有足够的列 38 if len(columns) >= 8: 39 # 获取第8列内容(索引从0开始) 40 file_name = columns[7] 41 42 # 删除关键字 "oss://{bucket名字}/", 不然拿不到元信息 43 # 填写不包含Bucket名称在内的归档类型Object的完整路径。 44 if "oss://{bucket名字}/" in file_name: 45 object_name = file_name.replace("oss://{bucket名字}/", "") 46 meta = bucket.head_object(object_name) 47 48 ## 获取object类型:冷归档才进行处理 49 storagetype = meta.resp.headers['x-oss-storage-class'] 50 if storagetype == "ColdArchive": 51 #print(f"{file_name} {meta.resp.headers['x-oss-storage-class']}") 52 53 # 先解冻 https://help.aliyun.com/zh/oss/developer-reference/restore-objects-1?spm=a2c4g.11186623.0.0.623ffbd4 54 Nrdo62 55 # 配置解冻状态持续时间,默认为1天。本代码示例以解冻状态持续时间为2天为例。 56 days = 2 57 58 ## 设置解冻优先级:https://github.com/aliyun/aliyun-oss-python-sdk/blob/master/examples/object_restore.py 59 job_parameters = RestoreJobParameters(RESTORE_TIER_EXPEDITED) 60 61 restore_config= RestoreConfiguration(days=days,job_parameters=job_parameters) 62 # 发起解冻请求 63 bucket.restore_object(object_name, input=restore_config) 64 65 66 # 再 更改文件存储类型。 67 ## 冷归档转为标准存储 68 headers = {'x-oss-storage-class': oss2.BUCKET_STORAGE_CLASS_STANDARD} 69 70 bucket.copy_object(bucket.bucket_name, object_name, object_name, headers)
其中 oss/file_list 文件内容如下,是用ossutil 过滤出来的
三、其他