技术研究之阿里云OSS

标签: 无 分类: 未分类 创建时间:2024-03-28 15:50:18 更新时间:2024-11-15 10:49:44

我在开发大疆服务的时候,用到了阿里云的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 秒,实际上是不对的。

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 检查服务进程是否存在,如果不存在则启动
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 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.
幸福是年华的沉淀,微笑是寂寞的悲伤。