技术研究之阿里云OSS

标签: 无 分类: 未分类 创建时间:2024-03-28 15:50:18 更新时间:2025-09-26 04:44:39

我在开发大疆服务的时候,用到了阿里云的OSS服务,其中的一些参数刚开始的时候不是很理解,后来花了很长的时间去理解这个东西的。其实不应该算事在

参考文章:
【1】.用了一年多之后才搞懂阿里云OSS收费细则 需要把“低频访问”Bucket删掉,创建“标准”Bucket,否则我购买的标准存储包没用。购买的“资源包”只是存储包,不包含流量,所以要外网访问的话就会产生流量,如需较为划算的外网访问,还要购买流量包,但目前不需要,另外内网流量是免费的
【2】.阿里云 OSS收费是否真的贵?
【3】.对象存储服务(OSS)省钱建议 1.购买阿里云的 OSS 下行流量包,按年购买每个月 5TB 的流量,大概 1.6W 左右的费用,费用大概是 0.26 元/GB。2.不再使用 OSS 下行流量的方式直接读取资源。而是采用 CDN 回源的形式,下行流量统一走 CDN 流量,费用大概是 0.24 元/GB ~ 0.26 元/GB 这样。
【4】.OSS成本最佳实践

1.创建Bucket

(1)创建Bucket

(4)获取其他的信息
其他的信息,比如就是 accesskey 和 secretKey,可以通过 账号,访问控制页面进行获取。

1
2
3
4
5
6
7
8
9
10
11
12
oss:
enable: true
provider: ALIYUN # @see com.dji.sample.component.OssConfiguration.model.enums.OssTypeEnum
endpoint: https://oss-cn-hangzhou.aliyuncs.com # 这里就选杭州了
access-key: xxx
secret-key: xx
expire: 3600
region: cn-hangzhou. # cn-hangzhou
role-session-name: xx ## 角色访问中的名称
role-arn: xx # 角色访问权限中的ARN,acs:ram::123456789:role/stsrole
bucket: xxx # 桶的名字
object-dir-prefix: xxx # 文件夹的名字

参考文章:
【1】.springboot整合阿里云oss实现简单的增删改查
【2】.Java授权访问 使用
【3】.在URL中包含签名 可以使用 generatePresignedUrl 构造带签名的url.
【4】.通过Bucket Policy授权访问OSS
【5】.访问域名和数据中心

问题

(1)The Min/Max value of DurationSeconds is 15min/1hr
角色扮演时指定的过期时间无效,即AssumeRoleRequest.setDurationSeconds参数无效。角色扮演时可以指定过期时间,单位为秒,有效时间是900~3600秒,如assumeRoleRequest.setDurationSeconds(60 L * 20),20分钟内有效。

我在配置里面写了 360 秒,实际上是不对的。

参考文章:
1.使用STS中的AssumeRole接口访问OSS资源时常见的错误及错误原因

2.访问控制

访问阿里云的相关服务,需要一个 AccessKey 和一个 AccessSercet 这个东西,在新建用户之后,可以获取到。新建用户之后,还需要授权用户的访问权限,另外一种就是通过角色去控制访问权限。

  • 用户
    这里就是创建一个 AccessKey 访问控制的RAM,这个地方要授权的。基本上就是创建一个用户,然后给这个用户授权,获取到这个用的 AccessKey 和 AccessScertet。
  • 角色
    RAM虚拟角色,这个应该是最多人懵逼的,也就是RoleArn 参数的主体,简单说这个角色是阿里云STS授权方式主体,一般用于前端交互,通过token 的时效性保证在前端代码泄露情况下主体也是安全的,这个主体是通过RoleArn 参数鉴权。这个ARN的作用可以通过参考文章2说明的部分得到具体的作用,这个我刚开始找不到到底在哪里进行配置。后来还是在RAM访问控制,新建了一个角色,在角色的基本信息里面,找到了这个ARN。
1
2
3
4
5
6
7
// RoleArn 需要在 RAM 控制台上获取
//String roleArn = "<role-arn>";
String roleArn = "<role-arn>";
// RoleSessionName 是临时Token的会话名称,自己指定用于标识你的用户,主要用于审计,或者用于区分Token颁发给谁
// 但是注意RoleSessionName的长度和规则,不要有空格,只能有'-' '_' 字母和数字等字符
// 具体规则请参考API文档中的格式要求
String roleSessionName = "session-name";// 自定义即可

参考文章:
1.STS 阿里云 OSS授权
2.创建RAM角色并进行STS授权 由于RAM用户的权限启用后一直有效,一旦AccessKey泄露,可能会导致安全风险。建议您使用STS临时授权,通过自定义过期时间,并指定相对复杂的策略对不同的RAM角色进行限制,采取权限最小化原则,提高服务访问的安全性。步骤一:创建RAM用户并授予AssumeRole接口的调用权限;步骤二:创建RAM角色并授予IMS操作权限。步骤三:使用创建的RAM用户调用AssumeRole接口获取临时AccessKey
3.通过GDB控制台授权 这个是通过GDB访问OSS的方法。
4.通过RAM控制台授权 从对象存储OSS的Bucket中导入数据时,您需要具有访问该Bucket的权限。本文介绍通过在RAM(访问控制)控制台创建策略进行授权并创建AccessKey的方法。
5.如何查看RAM角色的ARN?
6.AssumeRole - 获取扮演角色的临时身份凭证
7.RAM角色和STS Token常见问题 AssumeRole接口允许谁调用?AssumeRole接口用于获取一个扮演RAM角色的STS Token,该接口仅允许RAM用户或RAM角色调用,不允许阿里云账号(主账号)调用。RAM角色有几种?分别可以被谁扮演?如何查看RAM角色的ARN?STS Token的权限限制是什么?STS服务调用次数是否有上限?STS Token的有效期是多久?STS获取的多个Token是否同时有效?STS Token发生泄露时如何处理?
8.阿里云RAM访问控制相关参数解析(RoleArn参数获取)

3.rclone同步到minio

详情请查看软件研究之Rclone

4.ossutil

ossutil是阿里云官方推出的一个oss管理工具,可以方便的下载和上传文件。 其中 accessKeySecret 和 accessKeyID 为用户的key,ramRoleArn在角色里面有。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 下载ossutil, 解压之后运行,按照相应的 提示进行配置,选择语言,配置 key,
./ossutil config

# 示例配置
[Credentials]
language=EN
region=cn-hangzhou
accessKeySecret=xxx
endpoint=https://oss-cn-hangzhou-internal.aliyuncs.com
accessKeyID=xxx
ramRoleArn=xxx
outputDir=/home/hj/minio/data

# 如果在步骤2设置了配置文件的路径,则每次使用命令时需增加-c选项指定配置文件。
./ossutil64 -c /usr/local/ossutil/ossutil.conf ls oss://hjkj-drone

常用命令

1
2
3
4
5
# 沿用原文件名保存文件 cloud_url:oss文件路径 file_url:本地文件路径
./ossutil64 cp oss://examplebucket/destfolder/examplefile.txt localfolder/ -c /usr/local/ossutil/ossutil.conf

# 同步所有文件名包含abc且不是JPG和TXT格式的文件
./ossutil64 sync oss://examplebucket/destfolder/ localfolder/ --include "*abc*" --exclude "*.jpg" --exclude "*.txt" -r -c /usr/local/ossutil/ossutil.conf

region must be set in sign version 4

参考文章:
【1】.安装ossutil 这里有通过命令进行安装的方法
【2】.配置ossutil 配置ossutil的方法
【3】.config(创建配置文件) 该命令有交互式和非交互式两种用法。交互式用法允许您在使用命令前,通过配置文件完成相关配置项。命令使用过程中,ossutil将直接读取配置文件中的配置。而非交互式用法则需要您在使用命令时,通过选项来指定需要的配置项。相比非交互式用法,交互式用法具有更高的安全性。
【4】.cp(下载文件)
【5】.OSS访问域名、数据中心、开放端口
【6】.命令行工具ossutil快速入门

5.定时任务

为了从阿里云oss将数据传入内网 minio 中,我编写了相关的定时启动脚本,每天五点半到早上7点半,将数据使用 rclone 拷贝到内网minio中。
(1)后台启动

1
2
# 后台运行
nohup /usr/local/rclone/rclone sync -v oss:/zjhjkj/drone minio-intranet:/zjhjkj/drone --fast-list --drive-acknowledge-abuse --s3-chunk-size 512M --checkers 64 --transfers 64 > rclone.log 2>&1 &

(2)启动脚本 start.sh

1
2
3
#!/bin/bash
logfilename=rclone_$(date +%Y%m%d).log
nohup /usr/local/rclone/rclone sync -v oss:/zjhjkj/drone minio-intranet:/zjhjkj/drone --fast-list --drive-acknowledge-abuse --s3-chunk-size 512M --checkers 64 --transfers 64 > logs/$logfilename 2>&1 &

(3)关闭脚本 stop.sh

1
2
3
4
5
6
7
#! /bin/bash
pid=`ps -ef|grep 'rclone' |grep -v 'grep' |awk '{print $2}'`
if [ -n "$pid" ]
then
echo "kill -9 pid: $pid"
kill -9 $pid
fi

(4)创建定时任务

1
2
3
4
5
6
7
8
9
10
11
12
# 打开定时任务配置文件
crontab -e
# 在配置文件中写入定时任务的操作, 这里就是指定每天18点定时执行开启脚本, 18点-早上8点,每隔五分钟执行一次
# 因为边界值是包含的,所以 0-7,其实是包含了 7点59分的,又因为前面的值要小于后面的值,所以要是快0点的时候,需要改成两个
*/5 8-23 * * * /bin/bash /usr/local/rclone/start.sh > /usr/local/rclone/logs/crontab.log 2>&1 &
*/5 0-7 * * * /bin/bash /usr/local/rclone/start.sh > /usr/local/rclone/logs/crontab.log 2>&1 &

# 指定每天8点定时执行关闭脚本
0 8 * * * /bin/bash /usr/local/rclone/stop.sh

# 八点半到10点半,每隔五分钟,这种写法不正确
*/5 8:30-10:30 * * *

(5)检查服务是否存在,不存在则启动

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

# log文件路径
logfilename=rclone_$(date +%Y%m%d).log
# 获取进程数量
count=`ps -ef| grep '/usr/local/rclone/rclone' | grep -v "grep" | wc -l `
echo "count: "$count", time: "$(date "+%Y-%m-%d %H:%M:%S");
# 判断进程是否存在,如果存在则不重复创建
if [ $count == 0 ]; then
nohup /usr/local/rclone/rclone copy -v oss:/zjhjkj/drone minio-intranet:/zjhjkj/drone --fast-list --drive-acknowledge-abuse --s3-chunk-size 512M --checkers 64 --transfers 64 > logs/$logfilename 2>&1 &
fi

参考文章:
【1】.使用 rclone 每天定时备份typecho博客网站内容及mysql数据库到 Google Drive/Onedrive等网盘
【2】.rclone食用手册,快速上手自动备份,实现Google Drive同步网站的备份目录 实现自动同步,首先crontab -e,然后将命令加入最后一行(每周一的8点30进行一次同步),30 8 * * 1 rclone sync /www/backup gdrive:backup
【3】.Shell单条指令查找并杀死进程
【4】.shell——查找指定进程并且关闭 这是相关的参考示例,指定名称关闭进程
【5】.Shell 检查服务进程是否存在,如果不存在则启动

6.列举文件

列举存储空间下的文件。单次请求默认最多列举100个文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 /**
* 列举全部文件
* @param bucketName
* @param keyPrefix
* @return
*/
public List<String> getObjectList(String bucketName, String keyPrefix){
ObjectListing objectListing = null;
List<String> paths = new ArrayList<>();
String nextMarker = null;
// 指定每页列举200个文件。
int maxKeys = 200;
do {
objectListing = ossClient.listObjects(new ListObjectsRequest(bucketName).
withPrefix(keyPrefix).withMarker(nextMarker).withMaxKeys(maxKeys));
List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
for (OSSObjectSummary s : sums) {
String path = s.getKey();
paths.add(path);
}
nextMarker = objectListing.getNextMarker();
} while (objectListing.isTruncated());
return paths;
}

参考文章:
【1】.Java列举文件

7.视频截图

上传到阿里云oss的视频,可以进行截图处理,截图之后,可以显示预览图。配置起来还是挺麻烦的,弄了很久,我开始都找不到流程。
(1)开通媒体处理
在oss配置处,点击媒体处理,然后开通并授权相应的媒体处理
{asset_img oss4.png oss处理}

(2)创建编排任务
这个地方还费了很大的劲,就是要先绑定输入路径,输入路径的时候,还不一定有 Bucket,需要同区域,还有一定的权限,所以我也算是三开两开的弄完了这个东西,真不是好找的。

(3)任务配置
选择输入截图,然后配置截图参数,点击保存之后,就可以将工作流进行保存了。

(4)自动触发
我思考了一下这个整个流程,我发现可以通过上传视频文件,自动执行视频截图的任务,要是能实现,那还是挺好的,这样不用自己用代码再实现一遍了,虽然能自动触发,但是文件名是随机的,这让我怎么关联这个视频呢?
{asset_img oss_5.png oss配置 }

后来我还是通过阿里云工单知道了这个东西,主要就是设置这个输出路径,可以通过输出路径的变量控制访问的方式。

  • 当输出路径和输入路径相同时:
  • 若文件不同名,则输出文件不会覆盖源文件。
  • 若文件同名,是否覆盖由OSS配置决定。无需覆盖的配置方法请参见Java禁止覆盖同名文件。配置后会导致同名文件转码完成后写入OSS失败,建议不要设置输出文件与源文件同名。
  • 为避免媒体工作流多次执行时覆盖输出文件,您可以组合使用系统内置的UC变量参数:
  • {RunId}:媒体工作流执行ID。
  • {ObjectPrefix}:不含Bucket信息的原文件路径。
  • {FileName}:含扩展名的原文件名,根据转码模板的format补齐后缀。
  • {ExtName}:原文件扩展名。

比如我对某一个文件夹自动进行截图,输出路径就可以配置:snapshot/{ObjectPrefix}{FileName}.jpg。经过我的测试,这个 ObjectPrefix 是自带斜杠的,所以不能用 {ObjectPrefix}/

参考文章:
【1】.视频单帧截取 当您需要获取视频封面、提取视频关键帧图像进行视频编辑,或者提取视频中特定场景帧图像用于视频监控时,可以将视频上传至OSS存储空间,通过视频截帧提取关键帧图片。
【2】.数据处理费用 按视频截帧截取的图片数量计费,按量付费:视频截帧费用=截帧数×截帧单价÷1000
【3】.截图 截图的任务提交和查询代码
【4】.价格计算器 视频截图费用:0.1 元/千张
【5】.视频截图 视频截图流程
【6】.安装 这里是环境准备,引入sdk实现代码调用。
【7】.创建工作流 这里有一些变量的说明

8.视频播放

(1) 设置工作流
在阿里云管理控制台中,前往媒体处理(MPS)服务。创建一个媒体处理工作流,指定上传到OSS的视频文件会自动触发的转码操作。在这个工作流中,配置您希望生成的视频输出格式(如MP4、HLS等)、分辨率、码率等参数。

(2)上传视频
将视频文件上传到您在OSS中为媒体处理服务指定的Bucket。

(3)自动转码
当视频上传完成后,媒体处理服务会自动检测到文件,并根据您设置的工作流进行转码和压缩。

(4)获取结果
转码完成后,转码后的视频文件将自动存储到您指定的OSS Bucket中。

(5)播放视频
对于流媒体播放,通常会使用HTTP Live Streaming (HLS) 或Dynamic Adaptive Streaming over HTTP (DASH) 等格式,这允许播放器根据网络情况选择不同质量的视频流,提供更流畅的播放体验。

参考文章:
【1】.视频转码 当您需要修改视频编码格式、降低分辨率和码率、转换封装格式、调整视频参数以适应不同需求,可以使用视频转码功能。
【2】.转码模板 可以创建一个转码模版,实现视频的转码。
【3】.预置模板详情 转码模板是一系列处理参数的集合。在创建转码任务或使用工作流时,可以使用转码模板简化操作。本文介绍预置静态模板(普通模板、音频转码、转封装、窄带高清™1.0、窄带高清™2.0)、预置智能模板、旧版预置模板及模板ID规则。
【4】.音视频转码费用 HD(1920×1080)及以下 0.0651 元/分钟
【5】.播放音视频 视频点播支持播放音频和视频文件,您可以通过控制台预览、集成阿里云播放器SDK和集成第三方播放器进行播放。本文为您介绍音视频播放的整体流程、准备工作、前提条件、播放方式、播放地址和播放安全。
【6】.获取文件的在线预览链接 若要生成支持在线预览的链接(预签名 URL),需先绑定自定义域名。绑定完成后,使用自定义域名生成预签名URL。

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件(ititchuan@gmail.com)通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
ititchuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。