oss存储类型转换及解冻(下)

oss存储类型转换及解冻(下)
     上篇提到,归档后的文件是无法访问的(除去归档直读),也说到我把一个月的测试文件分了三批,对应三种类型:标准、低频、冷冻。
一、筛选不同类型的文件     
  之前已经知道,阿里是没有接口帮筛选某一段时间范围内的文件出来的(官方叫object),需要自己写逻辑:根据文件元数据信息的 LastModifiedTime 找出来。找出来是为了后续测试:验证文件是否如期转换了类型,是否已经解冻,批量处理同一批类型文件等等。
  所以第一个问题,根据生效了的生命周期规则,验证文件类型是否已经成功转化,我用的是ossutil(事实上经测试,这个命令行工具比sdk遍历整个object快很多!)命令行处理:

./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的时间是有限制的,大家可以找下阿里的帮助文档看看。

 

方式3:用sdk方式  --- 写的是批量处理文件
  当我给领导汇报研究成果的时候,他说没有批量的需求(前期没交流的时候,只是我多想一步),需要访问哪个文件是具体已知的,不存在需要访问 x 年 x 月 x 日之前归档过的文件,全部解冻访问。
  我用的是python3,阿里的oss2库导入后貌似很多问题
  环境搭建和oss凭据配置可以参考:
https://help.aliyun.com/zh/oss/developer-reference/installation-14?spm=a2c4g.11186623.0.0.2bf3265fqjn1S7
https://help.aliyun.com/zh/oss/developer-reference/python-configuration-access-credentials?spm=a2c4g.11186623.0.0.d31a4f33GwPgmx
  解冻参考:https://help.aliyun.com/zh/oss/developer-reference/restore-objects-1?spm=5176.smartservice_service_robot_chat_new.0.0.73f33f1biVAeMB
  赶着睡觉,所以直接贴脚本(调这个脚本调了蛮久的,有啥问题可以留言哈~),虽然贴的很轻易,但是看文档(阿里帮助文档、github)、调接口,拿数据、测试,可是耗了不少心血~~
 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 过滤出来的

 

三、其他
  关于归档型文件开启归档直读,是在控制台设置的,针对整改bucket生效,【数据管理】 —— 【归档直读】,相对解冻读取,归档直读的数据取回和数据处理费会更高,但如果偶尔读取文件,其实也还好

 

 
 
 
posted @ 2023-10-10 23:25  windysai  阅读(195)  评论(0编辑  收藏  举报