阿里云对象存储服务(Object Storage Service 简称OSS) 是阿里云提供的海量 安全 低成本 高可靠的云存储服务。
阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。其数据设计持久性不低于 99.9999999999%(12 个 9),服务设计可用性(或业务连续性)不低于 99.995%。
可以使用阿里云提供的 API、SDK 接口或者 OSS 迁移工具轻松地将海量数据移入或移出阿里云 OSS。数据存储到阿里云 OSS 以后,可以选择标准存储(Standard)作为移动应用、大型网站、图片分享或热点音视频的主要存储方式,也可以选择成本更低、存储期限更长的低频访问存储(Infrequent Access)和归档存储(Archive)作为不经常访问数据的存储方式。
OSS 具有与平台无关的 RESTful API 接口,可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
对比项 | 对象存储OSS | 自建服务器存储 |
---|---|---|
可靠性 | OSS作为阿里巴巴全集团数据存储的核心基础设施,多年支撑双11业务高峰,历经高可用与高可靠的严苛考验。OSS的多重冗余架构设计,为数据持久存储提供可靠保障。同时,OSS基于高可用架构设计,消除单节故障,确保数据业务的持续性。服务设计可用性不低于99.995%。数据设计持久性不低于99.9999999999%(12个9)。规模自动扩展,不影响对外服务。数据自动多重冗余备份。 | 受限于硬件可靠性,易出问题,一旦出现磁盘坏道,容易出现不可逆转的数据丢失。人工数据恢复困难、耗时、耗力。 |
安全 | 提供企业级多层次安全防护,包括服务端加密、客户端加密、防盗链、IP黑白名单、细粒度权限管控、日志审计、WORM特性等。多用户资源隔离机制,支持异地容灾机制。获得多项合规认证,包括SEC和FINRA 等,满足企业数据安全与合规要求。 | 需要另外购买清洗和黑洞设备。需要单独实现安全机制。 |
成本 | 多线BGP骨干网络,无带宽限制,上行流量免费。无需运维人员与托管费用,0成本运维。 | 存储受硬盘容量限制,需人工扩容。单线或双线接入速度慢,有带宽限制,峰值时期需人工扩容。需专人运维,成本高。 |
智能存储 | 提供多种数据处理能力,如图片处理、视频截帧、文档预览、图片场景识别、人脸识别、SQL就地查询等,并无缝对接Hadoop生态、以及阿里云函数计算、EMR、DataLakeAnalytics、BatchCompute、MaxCompute、DBS等产品,满足企业数据分析与管理的需求。 | 需要额外采购,单独部署。 |
阿里云对象存储 OSS 服务费用的各项组成部分及计费方式分为按量计费和包年包月两种。
这个看一个实际的计费案例即可
存储空间是用户用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。存储空间具有各种配置属性,包括地域、访问权限、存储类型等。用户可以根据实际需求,创建不同类型的存储空间来存储不同的数据。
存储空间的命名规范如下:
对象是 OSS 存储数据的基本单元,也被称为 OSS 的文件。对象由元信息(Object Meta),用户数据(Data)和文件名(Key)组成。对象由存储空间内部唯一的 Key 来标识。对象元信息是一组键值对,表示了对象的一些属性,比如最后修改时间、大小等信息,同时用户也可以在元信息中存储一些自定义的信息。
对象的生命周期是从上传成功到被删除为止。在整个生命周期内,只有通过追加上传的 Object 可以继续通过追加上传写入数据,其他上传方式上传的 Object 内容无法编辑,您可以通过重复上传同名的对象来覆盖之前的对象。
对象的命名规范如下:
Region 表示 OSS 的数据中心所在物理位置。用户可以根据费用、请求来源等选择合适的地域创建Bucket。一般来说,距离用户更近的 Region 访问速度更快。
Region 是在创建 Bucket 的时候指定的,一旦指定之后就不允许更改。该 Bucket 下所有的 Object 都存储在对应的数据中心,目前不支持 Object 级别的 Region 设置。
Endpoint 表示 OSS 对外服务的访问域名。OSS 以 HTTP RESTful API 的形式对外提供服务,当访问不同的 Region 的时候,需要不同的域名。通过内网和外网访问同一个 Region 所需要的 Endpoint 也是不同的。例如杭州 Region 的外网 Endpoint 是 oss-cn-hangzhou.aliyuncs.com,内网 Endpoint 是 osscn-hangzhou-internal.aliyuncs.com。
AccessKey(简称 AK)指的是访问身份验证中用到的 AccessKeyId 和 AccessKeySecret。OSS 通过使用 AccessKeyId 和 AccessKeySecret 对称加密的方法来验证某个请求的发送者身份。AccessKeyId 用于标识用户;AccessKeySecret 是用户用于加密签名字符串和 OSS 用来验证签名字符串的密钥,必须保密。对于 OSS 来说,AccessKey 的来源有:
Bucket 的拥有者申请的 AccessKey。
被 Bucket 的拥有者通过 RAM 授权给第三方请求者的 AccessKey。
被 Bucket 的拥有者通过 STS 授权给第三方请求者的 AccessKey。
注意: 可以登录阿里云官网-“用户中心” -“我的帐户” -“安全认证” 获取 Access Key ID 和 Access Key Secret,
一个阿里云帐号可以生成 5 对 Access Key ID 和 Access Key Secret。
并支持启用/禁 用设置。
OSS 提供给用户的虚拟存储空间,在这个虚拟空间中,每个用户可拥有一个 到多个 Bucket。
开通OSS服务器
创建存储空间
上传文件
下载文件
删除文件
删除存储空间
如果一个bucket设置成公开读权限,意味着允许其他用户来访问属于你的object。你的object的外链地址构成规则如下:
http:// <你的bucket名字>.<数据库中心服务域名>/<你的object名字>
注意:在使用 OSS 时,请一直使用 OSS 服务域名,而不要使用固定的 IP 地址。
OSS 是按使用收费的服务, 为了防止用户在 OSS 上的数据被其他人盗链, OSS 支持基于 HTTPheader 中表头字段 referer 的防盗链方法。通过 OSS 的控制台–权限管理–防盗链,可以对一个 bucket设置 referer 字段的白名单和是否允许 referer 字段为空的请求访问。
例如, 对于一个名为 ossexample 的 bucket,设置其 referer 白名单为 http://www.aliyun.com。则所有 referer 为 http://www.aliyun.com 的请求才能访问 oss-example 这个 bucket 中的 Object。
细节分析:
OSS 支持用户将自定义的域名绑定在属于自己的 bucket 上面,这个操作必 须通过 OSS 控制台(http://oss.aliyun.com) -“Bucket 属性 传输管理 ” -“绑定域名”页面 配置来实现。按照中国《互联网管理条例》的要求,所有需要开通这项功能的用 户,必须提供阿里云备案号,域名持有者身份证等有效资料,经由阿里云审批通 过后才可以使用。在开通 CNAME 功能后, OSS 将自动处理对该域名的访问请求。
CNAME 应用场景例子:
OSS为用户提供自动保存访问日志记录功能。Bucket的拥有者可以通过OSS控制台(http://oss.aliyun.com)日志管理,为其所拥有的bucket开启访问日志记录功能。当一个bucket(源Bucket,Source Bucket)开启访问日志记录功能后,OSS自动将访问这个bucket的请求日志,以小时为单位,按照固定的命名规则,生成一个Object写入用户指定的bucket(目标Bucket,Target Bucket)。
存储访问日志记录的object命名规则:
-YYYY-mm-DD-HH-MM-SS-UniqueString
命名规则中,TargetPrefix由用户指定;YYYY, mm, DD, HH, MM和SS分别是该Object被创建时的阿拉伯数字的年,月,日,小时,分钟和秒(注意位数);UniqueString为OSS系统生成的字符串。一个实际的用于存储OSS访问日志的Object名称例子如下:
MyLog-oss-example-2012-09-10-04-00-00-0000
上例中,“MyLog-”是用户指定的Object前缀;“oss-example”是源bucket的名称;“2012-09-10-04-00-00”是该Object被创建时的北京时间;“0000” 是OSS系统生成的字符串。
LOG文件格式(从左至右,以空格分隔):
名 称 | 例 子 | 含 义 |
---|---|---|
Remote IP | 119.140.142.11 | 请求发起的IP地址(Proxy代理或用户防火墙可能会屏蔽该字段) |
Reserved | - | 保留字段 |
Reserved | - | 保留字段 |
Time | [02/May/2012:00:00:04+0800] | OSS收到请求的时间 |
Request-URI | “GET /aliyun-logo.png HTTP/1.1“ | 用户请求的URI(包括query-string) |
HTTP Status | 200 | OSS返回的HTTP状态码 |
SentBytes | 5576 | 用户从OSS下载的流量 |
RequestTime(ms) | 71 | 完成本次请求的时间(毫秒) |
Referrer | http://oss.aliyun.com | 请求的HTTP Referrer |
User-Agent | curl/7.15.5 | HTTP的User-Agent头 |
HostName | oss-example.oss.aliyuncs.com | 请求访问域名 |
Request ID | 505B01695037C2AF032593A4 | 用于唯一标示该请求的UUID |
LoggingFlag | true | 是否开启了访问日志功能 |
Reserved | - | 保留字段 |
Requester Aliyun ID | 1657136103983691 | 请求者的阿里云ID;匿名访问为“-” |
Operation | GetObject | 请求类型 |
Bucket | oss-example | 请求访问的Bucket名字 |
Key | /aliyun-logo.png | 用户请求的Key |
ObjectSize | 5576 | Object大小 |
Server CostTime (ms) | 17 | OSS服务器处理本次请求所花的时间(毫秒) |
Error Code | NoSuchBucket | OSS返回的错误码 |
UserID | 1657136103983691 | Bucket拥有者ID |
Delta DataSize | 280 | Bucket大小的变化量;若没有变化为“-” |
细节分析:
源Bucket和目标Bucket必须属于同一个用户。
“TargetPrefix”表示存储访问日志记录的object名字前缀,可以为空。
源bucket和目标bucket可以是同一个Bucket,也可以是不同的Bucket;用户也可以将多个的源bucket的LOG都保存在同一个目标bucket内(建议指定不同的TargetPrefix)。
OSS以小时为单位生成bucket访问的Log文件,但并不表示这个小时的所有请求都记录在这个小时的LOG文件内,也有可能出现在上一个或者下一个LOG文件中。
OSS生成的Log文件命名规则中的“UniqueString”仅仅是OSS为其生成的UUID,用于唯一标识该文件。
OSS生成一个bucket访问的Log文件,算作一次PUT操作,并记录其占用的空间,但不会记录产生的流量。LOG生成后,用户可以按照普通的Object来操作这些LOG文件。
OSS会忽略掉所有以“x-”开头的query-string参数,但这个query-string会被记录在访问LOG中。如果你想从海量的访问日志中,标示一个特殊的请求,可以在URL中添加一个“x-”开头的query-string参数。
如下:
http://oss-example.oss.aliyuncs.com/aliyun-logo.png
http://oss-example.oss.aliyuncs.com/aliyun-logo.png?x-user=admin
OSS处理上面两个请求,结果是一样的。但是在访问LOG中,你可以通过搜索“x-user=admin”,很方便地定位 出经过标记的这个请求。
OSS的LOG中的任何一个字段,都可能出现“-”,用于表示未知数据或对于当前请求该字段无效。
根据需求,OSS的LOG格式将来会在尾部添加一些字段,请开发者开发Log处理工具时考虑兼容性的问题。
针对存放在 Bucket 的 Object 的访问,OSS 提供了多种权限控制方式,包括 ACL、RAM Policy 和Bucket Policy。
Bucket ACL 介绍
Bucket ACL是 Bucket 级别的权限访问控制。
目前有三种访问权限:public-read-write,publicread 和 private,含义如下
权限值 | 中文名称 | 权限对访问者的限制 |
---|---|---|
publicreadwrite | 公共读写 | 任何人(包括匿名访问)都可以对该 Bucket 中的 Object 进行读/写/删除操作;所有这些操作产生的费用由该 Bucket 的 Owner 承担,请慎用该权限。 |
publicread | 公共读,私有写 | 只有该 Bucket 的 Owner 或者授权对象可以对存放在其中的 Object 进行写/删除操作;任何人(包括匿名访问)可以对 Object 进行读操作。 |
private | 私有读写 | 只有该 Bucket 的 Owner 或者授权对象可以对存放在其中的 Object 进行读/写/删除操作;其他人在未经授权的情况下无法访问该 Bucket 内 的 Object。 |
操作方式
操作方式 | 特点 |
---|---|
控制台 | Web应用程序,直观易用 |
图形化工具ossbrowser | 图形化工具,易操作 |
Java SDK | 丰富、完整的各类语言SDK demo |
Object ACL 介绍
Object ACL是Object 级别的权限访问控制。
目前有四种访问权限:private、public-read、publicread-write、default。
PutObjectACL 操作通过 Put 请求中的 x-oss-object-acl 头来设置,这个操作只有 Bucket Owner 有权限执行。
Object ACL 的四种访问权限含义如下:
权限值 | 中文名称 | 权限对访问者的限制 |
---|---|---|
publicreadwrite | 公共读写 | 该 ACL 表明某个 Object 是公共读写资源,即所有用户拥有对该 Object的读写权限。 |
publicread | 公共读,私有写 | 该 ACL 表明某个 Object 是公共读资源,即非 Object Owner 只有该Object 的读权限,而 Object Owner 拥有该 Object的读写权限。 |
private | 私有读写 | 该 ACL 表明某个 Object 是私有资源,即只有该 Object 的 Owner 拥有该 Object 的读写权限,其他的用户没有权限操作该 Object。 |
default | 默认权限 | 该 ACL 表明某个 Object 是遵循 Bucket 读写权限的资源,即 Bucket 是什么权限,Object 就是什么权限。 |
操作方式和上面类似 参考官方文档即可
RAM(Resource Access Management)是阿里云提供的资源访问控制服务,RAM Policy是基于用户的授权策略。使用RAM,您可以创建、管理RAM用户,并可以控制这些RAM用户对资源的操作权限。当您的企业存在多用户协同操作资源时,使用RAM可以让您避免与其他用户共享云账号密钥,按需为用户分配最小权限,管理更加方便,权限更加明确,信息更加安全。
注意
Bucket Policy是基于资源的授权策略。相比于RAM Policy,Bucket Policy支持在控制台直接进行图形化配置操作,并且Bucket拥有者直接可以进行访问授权。
Bucket Policy常见的应用场景如下:
Bucket Policy的配置方法和教程视频请参见使用Bucket Policy授权其他用户访问OSS资源。
开发者在发送请求给 OSS 时,既可以使用 带签名认证的请求,也可以使用匿名访问。OSS提供的相关API接口如下:
关于Service操作
API | 描述 |
---|---|
getService (listBuckets) | 返回请求者拥有的所有Bucket |
关于Bucket的操作
API | 描述 |
---|---|
createBucket | 创建Bucket |
putBucketACL | 设置Bucket访问权限 |
putBucketLogging | 开启Bucket日志 |
putBucketWebsite | 设置Bucket为静态网站托管模式 |
putBucketReferer | 设置Bucket的防盗链规则 |
putBucketLifecycle | 设置Bucket中Object的生命周期规则 |
getBucket(ListObject) | 列出Bucket中所有Object的信息 |
getBucketAcl | 获得Bucket访问权限 |
getBucketLocation | 获得Bucket所属的数据中心位置信息 |
getBucketInfo | 获取Bucket信息 |
getBucketLogging | 查看Bucket的访问日志配置情况 |
getBucketWebsite | 查看Bucket的静态网站托管状态 |
getBucketReferer | 查看Bucket的防盗链规则 |
getBucketLifecycle | 查看Bucket中Object的生命周期规则 |
deleteBucket | 删除Bucket |
deleteBucketLogging | 关闭Bucket访问日志记录功能 |
deleteBucketWebsite | 关闭Bucket的静态网站托管模式 |
deleteBucketLifecycle | 删除Bucket中Object的生命周期规则 |
putBucketEncryption | 配置Bucket的加密规则 |
getBucketEncryption | 获取Bucket的加密规则 |
deleteBucketEncryption | 删除Bucket的加密规则 |
关于Object的操作
API | 描述 |
---|---|
putObject | 上传Object |
copyObject | 拷贝一个Object成另外一个Object |
getObject | 获取Object |
appendObject | 在Object尾追加上传数据 |
deleteObject | 删除Object |
deleteMultipleObjects | 删除多个Object |
headObject | 只返回某个Object的meta信息,不返回文件内容 |
getObjectMeta | 返回Object的基本meta信息,包括该Object的ETag、Size(文件大小)、LastModified,不返回文件内容 |
postObject | 使用Post上传Object |
putObjectACL | 设置ObjectACL |
getObjectACL | 获取ObjectACL信息 |
callback | 上传回调 |
putSymlink | 创建软链接 |
getSymlink | 获取软链接 |
restoreObject | 解冻文件 |
selectObject | 用SQL语法查询Object内容 |
putObjectTagging | 设置或更新对象标签 |
getObjectTagging | 获取对象标签信息 |
deleteObjectTagging | 删除指定的对象标签 |
关于Multipart Upload的操作
API | 描述 |
---|---|
InitiateMultipartUpload | 初始化MultipartUpload事件 |
uploadPart | 分块上传文件 |
uploadPartCopy | 分块复制上传文件 |
completeMultipartUpload | 完成整个文件的MultipartUpload上传 |
abortMultipartUpload | 取消MultipartUpload事件 |
listMultipartUploads | 罗列出所有执行中的MultipartUpload事件 |
listParts | 罗列出指定UploadID所属的所有已经上传成功Part |
跨域资源共享(CORS)
API | 描述 |
---|---|
putBucketcors | 在指定Bucket设定一个CORS的规则 |
getBucketcors | 获取指定的Bucket目前的CORS规则 |
deleteBucketcors | 关闭指定Bucket对应的CORS功能并清空所有规则 |
optionObject | 跨域访问preflight请求 |
关于Live Channel的操作
API | 描述 |
---|---|
putLiveChannelStatus | 切换LiveChannel的状态 |
putLiveChannel | 创建LiveChannel |
getVodPlaylist | 获取播放列表 |
postVodPlaylist | 生成播放列表 |
get LiveChannelStat | 获取LiveChannel的推流状态信息 |
getLiveChannelInfo | 获取LiveChannel的配置信息 |
getLiveChannelHistory | 获取LiveChannel的推流记录 |
listLiveChannel | 列举LiveChannel |
deleteLiveChannel | 删除LiveChanne |
当用户访问OSS出现错误时,OSS会返回给用户相应的错误码和错误信息,便于用户定位问题,并做出适当的处理。
OSS的错误响应格式
当用户访问OSS出错时,OSS会返回给用户一个合适的3xx,4xx或者5xx的HTTP状态码;以及一个application/xml格式的消息体。
错误响应的消息体例子:
<Error xmlns=”http://doc.oss.aliyuncs.com”>
<Code> AccessDenied Code>
<Message> Query-string authentication requires the Signature, Expires and OSSAccessKeyId parameters Message>
<RequestId>1D842BC5425544BB RequestId>
<HostId> oss.aliyuncs.com HostId>
Error>
所有错误的消息体中都包括以下几个元素:
OSS的错误码
错误码 | 描述 | HTTP状态码 |
---|---|---|
AccessDenied | 拒绝访问 | 403 |
BucketAlreadyExists | Bucket已经存在 | 409 |
BucketNotEmpty | Bucket不为空 | 409 |
EntityTooLarge | 实体过大 | 400 |
EntityTooSmall | 实体过小 | 400 |
FileGroupTooLarge | 文件组过大 | 400 |
FilePartNotExist | 文件Part不存在 | 400 |
FilePartStale | 文件Part过时 | 400 |
InvalidArgument | 参数格式错误 | 400 |
InvalidAccessKeyId | Access Key ID不存在 | 403 |
InvalidBucketName | 无效的Bucket名字 | 400 |
InvalidDigest | 无效的摘要 | 400 |
InvalidObjectName | 无效的Object名字 | 400 |
InvalidPart | 无效的Part | 400 |
InvalidPartOrder | 无效的part顺序 | 400 |
InvalidTargetBucketForLogging | Logging操作中有无效的目标bucket | 400 |
InternalError | OSS内部发生错误 | 500 |
MalformedXML | XML格式非法 | 400 |
MethodNotAllowed | 不支持的方法 | 405 |
MissingArgument | 缺少参数 | 411 |
MissingContentLength | 缺少内容长度 | 411 |
NoSuchBucket | Bucket不存在 | 404 |
NoSuchKey | 文件不存在 | 404 |
NoSuchUpload | Multipart Upload ID不存在 | 404 |
NotImplemented | 无法处理的方法 | 501 |
PreconditionFailed | 预处理错误 | 412 |
RequestTimeTooSkewed | 发起请求的时间和服务器时间超出15分钟 | 403 |
RequestTimeout | 请求超时 | 400 |
SignatureDoesNotMatch | 签名错误 | 403 |
TooManyBuckets | 用户的Bucket数目超过限制 | 400 |
如果在OSS合法的操作中,添加了OSS不支持的请求头参数(例如在PUT的时候,加入If-ModifiedSince参数),OSS会返回501 Not Implemented错误
错误请求示例:
PUT /my-image.jpg HTTP/1.1
Host:oss-example. oss.aliyuncs.com
Date: Wed, 28 May 2011 22:32:00 GMT
If-Modified-Since: Wed, 06 Apr 2011 10:02:46 GMT
返回示例:
501 Not Implemented
x-oss-request-id: 77E534EBF90372BE
Content-Type: application/xml
Transfer-Encoding: chunked
Date: Thu, 28 Apr 2011 08:03:07 GMT
Connection: close Server: AliyunOSS
<Error xmlns=”http://doc.oss.aliyuncs.com”>
<Code> NotImplemented Code>
<Message> A header you provided implies functionality that is not implemented. Message>
<Header> If-Modified-Since Header>
<RequestId>77E534EBF90372BE RequestId>
<HostId> oss.aliyuncs.com HostId>
Error>
如果试图以OSS不支持的操作来访问某个资源,返回405 Method Not Allowed错误。
abc / HTTP/1.1
Host:oss-example.oss.aliyuncs.com
Date: date
Authorization: signatureValue
返回示例:
x-oss-request-id: 2403382433A2EDA8
Allow: GET, DELETE, HEAD, PUT
Content-Type: application/xml
Transfer-Encoding: chunked
Date: Thu, 31 Mar 2011 10:01:52 GMT
Server: AliyunOSS
<Error xmlns=”http://doc.oss.aliyuncs.com”>
<Code> MethodNotAllowed Code>
<Message> The specified method is not allowed against this resource. Message>
<ResourceType> BUCKET ResourceType>
<Method> abc Method>
<RequestId>2403382433A2EDA8 RequestId>
<HostId> oss.aliyuncs.com HostId>
Error>
Java代码开发就直接参考官网提供的DEMO吧。