QingStor™ 对象存储对接第三方图普科技鉴黄服务

QingStor™ 对象存储已经支持对接第三方数据处理服务,并接入了图普科技鉴黄服务。

QingStor™ 对象存储利用内部的异步数据处理框架,当有指定的对象上传成功时,会自动生成事件消息并触发各种数据处理。例如当用户开启了图普鉴黄服务,则会调用鉴黄 API 对指定的上传对象进行鉴黄识别,在识别流程结束后,识别结果将被回传,并推送到用户指定的通知地址中。

在操作层面,用户只需要在 QingStor™ 对象存储的控制界面中,一键选择开启服务并完成配置,服务即可自动开始运行。
开启图普鉴黄式例:

1. 在 console 中点击进入对象存储用户的某个具体 bucket 页面,点击 tab【数据处理】。

2. 列表中找到“图普鉴黄”,点击右侧按钮【点击开启】,在输入框“接收结果地址” 中写入用户自己的 notifiy_url ,以及“文件名匹配规则“中输入鉴黄目标的 glob patterns 。


以以上示例图的开启配置为例,每当有 jpg, jpeg, png 为后缀的对象上传成功后,将会对其进行鉴黄,并把结果推送到 http://example.notify.com 。

结果示例:

{
    "bucket": "fakebucket",
    "object": "porn.jpeg",
    "result": {
        "54bcfc6c329af61034f7c2fc": {
            "fileList": [
                {
                    "label": 2,
                    "name": "porn.jpeg",
                    "rate": 0.9836746454238892,
                    "review": false
                }
            ]
        },
        "code": 0,
        "message": "success",
        "nonce": "0.2297668219538047",
        "reviewCount": 0,
        "statistic": [
            0,
            0,
            1
        ],
        "timestamp": 1498647797834.0
    }
}

以上返回结果表示图片 “porn.jpeg”  被鉴定为正常图片的概率为 98%, 且不需要人工 review 。

参考: 图普鉴黄服务说明文档 。

QingStor 对象存储新增 Logstash Input/Output 插件

QingStor Logstash Input/Output 插件为首届 QingStor Satellites 活动中成功孵化出的项目,在 QingStor Satellites 活动中,QingStor 团队会选择一些有意义的开源项目为课题,并作为导师指导高校学生逐步完成项目。

QingStor Logstash Input/Output 插件的开发者为 Tacinight,来自兰州大学信息科学与工程学院 DSLab 研究生一年级的同学 赵益民(下图即为赵益民同学近照)。

QingStor Logstash Input/Output 插件已经通过 QingStor 官方审核,并被收纳为 QingStor 官方的 Logstash 插件,后续将由 QingStor 官方与赵益民同学一起进行维护。

下文为简要使用文档。更多详细信息请参见 https://github.com/yunify/logstash-input-qingstor 和 https://github.com/yunify/logstash-output-qingstor

Logstash 简介

Logstash 是一款轻量级的日志搜集和处理工具,可以方便的把分散的、多样化的日志收集起来,并进行自定义的处理,然后传输到指定的目标,比如输出到 Elasticsearch 或者写入文件。Logstash 整体可大致分为三部分,即数据输入(Input)、数据加工(Filter)、数据输出(Output),同时 Logstash 内置了多种输入输出插件,方便用户对接各种第三方服务。QingStor Logstash Input/Output 插件实现了对象存储服务和 Logstash 的对接,方便用户读取存储在对象存储的日志或者上传处理后的日志到对象存储。

安装

首先确保 Logstash 已正确安装,之后使用以下命令从 Ruby Gems 安装插件。

$ bin/logstash-plugin install logstash-input-qingstor
$ bin/logstash-plugin install logstash-output-qingstor

快速开始

使用插件之前请先在 青云控制台 申请 Access Key。

Input 和 Output 插件的基本配置项如下,查看更多可用选项可访问 GitHub 项目页面进行查阅。

input {
    qingstor {
        access_key_id => "your_access_key_id"
        secret_access_key => "your_secret_access_key"
        bucket => "input_bucket_name"
        region => "pek3a"
    }
}
output {
    qingstor {
        access_key_id => "your_access_key_id"
        secret_access_key => "your_secret_access_key"
        bucket => "output_bucket_name"
        region => "pek3a"
    }
}
设置完成之后启动 Logstash,即可从对象存储读取日志文件,然后按照固定大小或固定时间切分并归档,最后输出处理后的日志文件到对象存储。
$ ./bin/logstash -f qs_input_ouput.conf

致谢

最后对 QingStor Logstash Input/Output 插件的作者 Tacinight (赵益民同学) 表示感谢,同时我们也欢迎更多高校学生或第三方开发者参与到我们的开源项目中来。

QingStor 对象存储新增 .NET SDK

QingStor 对象存储到目前为止已经发布了包括 Go、Ruby、Swift、Java、JavaScript、PHP、Python、Scala 等八种语言的 SDK,为了方便 .NET 平台的用户使用 QingStor 对象存储服务,现特新增 .NET SDK。

QingStor .NET SDK 通过开源的 QingStor 对象存储的 API Specifications(OpenAPI 格式,亦称 Swagger 2.0 格式)及 SDK 生成工具 Snips 来生成相应的SDK接口和公共基础部分,在 Snips 的帮助下使其能够在短时间内开发出符合生产环境使用的SDK。

下文为简要使用文档,更多详细信息请参见 https://github.com/yunify/qingstor-sdk-net

1. 安装

可通过以下三种安装方式任意一种安装。

  • 直接下载源码并将其添加至项目:
$ git clone https://github.com/yunify/qingstor-sdk-net.git
  • 直接添加 DLL 引用:
在 GitHub 的 Release 页面 下载相应版本的 DLL,然后将其添加至项目引用。由于此 SDK 
依赖于 Json.NET,可以添加该 SDK 对应版本的 Newtonsoft.Json.dll 引用或者使用 
NuGet来安装它:
Install-Package Newtonsoft.Json
  • 通过包管理器(NuGet)安装:
例如在 Visual Studio 2013 中,打开 NuGet 程序包管理器搜索 QingStor_SDK_NET 
或者在控制台中键入以下命令(其中,QingStor_SDK_NET45 表示 .NET Framework 4.5 
平台下的SDK):
Install-Package QingStor_SDK_NET45

2. 初始化服务

发起请求前首先建立初始化服务:

using QingStor_SDK_NET.Common;
using QingStor_SDK_NET.Service;

CConfig Config = new CConfig("Config.yaml");
CQingStor Service = new CQingStor(Config);

上面代码初始化了一个 QingStor Service。

3. 获取账户下的 Bucket 列表

CListBucketsOutput ListBuckets = Service.ListBuckets(null);

// Print the HTTP status code.
// Example: 200
Console.Write(ListBuckets.StatusCode);

// Print the bucket count.
// Example: 5
Console.Write(ListBuckets.count);

4. 创建 Bucket

初始化并创建 Bucket, 需要指定 Bucket 名称和所在 Zone

CBucket Bucket = Service.Bucket("bucket-name", "pek3a");
CPutBucketOutput PutBucketOutput = Bucket.Put();

5. 获取 Bucket 中存储的 Object 列表

CListObjectsOutput ListObjectsOutput = Bucket.ListObjects(null);

// Print the HTTP status code.
// Example: 200
Console.Write(ListObjectsOutput.StatusCode);

// Print the key count.
// Example: 0
Console.Write(ListObjectsOutput.keys.Length);

6. 创建一个 Object

CPutObjectInput PutObjectInput = new CPutObjectInput();
PutObjInput.Body = new FileStream("/tmp/Screenshot.jpg", FileMode.Open);
CPutObjectOutput PutObjectOutput = Bucket.PutObject("Screenshot.jpg", PutObjectInput);

// Print the HTTP status code.
// Example: 201
Console.Write(PutObjectOutput.StatusCode);

7. 删除一个 Object

CDeleteObjectOutput DeleteObjectOutput = BucketObj.DeleteObject("Screenshot.jpg");

// Print the HTTP status code.
// Example: 204
Console.Write(DeleteObjectOutput.StatusCode);

8. 设置 Bucket ACL

CGranteeType Grantee = new CGranteeType() { id = "usr-id", type = "user" };
CACLType ACL = new CACLType() { grantee = Grantee, permission = "FULL_CONTROL" };
CPutBucketACLInput PutBucketACLInput = new CPutBucketACLInput();
PutBucketACLInput.acl = new CACLType[] { ACL };
CPutBucketACLOutput PutBucketACLOutput = Bucket.PutACL(PutBucketACLInput);

// Print the HTTP status code.
// Example: 200
Console.Write(PutBucketACLOutput.StatusCode);

QingStor 对象存储新增 Scala SDK

QingStor Scala SDK 为首届 QingStor Satellites 活动中成功孵化出的项目,在 QingStor Satellites 活动中,QingStor 团队会选择一些有意义的开源项目为课题,并作为导师指导高校学生逐步完成项目。

QingStor Scala SDK 的开发者为 Cheerx ,来自兰州大学信息科学与工程学院 DSLab 研究生一年级的同学 谢启荣 (下图即为谢启荣同学近照)。

QingStor Scala SDK 已经过 QingStor 官方审核,并被收纳为 QingStor 官方的 Scala SDK,后续将由 QingStor 官方与谢启荣同学一起进行维护。

下文为简要使用文档。更多详细信息请参见 https://github.com/yunify/qingstor-sdk-scala

安装

点击 此处 下载最新版的 Jar 包,也可访问 GitHub 项目的 Releases 页面查看和下载历史版本。

文件名中包含 fat 后缀的 Release 中包含了 SDK 所需的依赖,使用时无需手动加载其依赖包,如 qingstor-sdk-scala-v2.0.0_2.11_fat.jar。而文件名中不包含 fat 的 Release 中没有包含相关依赖,需要手动指定。

描述 SDK 所需依赖关系的 SBT 文件片段样例如下:

libraryDependencies ++= {
  val akkaHttpVersion = "10.0.5"
  val circeVersion = "0.7.1"
  Seq(
    "com.typesafe.akka" %% "akka-http-core" % akkaHttpVersion,
    "com.typesafe.akka" %% "akka-http" % akkaHttpVersion,
    "io.circe" %% "circe-generic" % circeVersion,
    "io.circe" %% "circe-parser" % circeVersion,
    "org.yaml" % "snakeyaml" % "1.17",
    "de.heikoseeberger" %% "akka-http-circe" % "1.15.0"
  )
}

快速开始

使用 SDK 之前请先在 青云控制台 申请 Access Key。

初始化服务

发起请求前首先建立需要初始化服务:

import com.qingstor.sdk.config.QSConfig
import com.qingstor.sdk.service.QingStor

val config = QSConfig("ACCESS_KEY_ID", "SECRET_ACCESS_KEY")
val qsService = QingStor(config)

初始化并创建 Bucket, 需要指定 Bucket 名称和所在 Zone:

import com.qingstor.sdk.service.Bucket

val bucket = Bucket(config, "test-bucket", "pek3a")
val outputFuture = bucket.put(Bucket.PutBucketInput())

获取 Bucket 中存储的 Object 列表

val outputFuture = bucket.listObjects(Bucket.ListObjectsInput())
val listObjectsOutput = Await.result(outputFuture, Duration.Inf)

// Print the HTTP status code.
// Example: 200
println(listObjectsOutput.statusCode.getOrElse(-1))

// Print the key count.
// Example: 7
println(listObjectsOutput.keys.map(_.length).getOrElse(-1))

创建一个 Object

例如一张图片:

// Open file
val file = new File("/tmp/test.jpg")
val input = PutObjectInput(
  // Because this SDK used akka-http as http library, it's useless to set Content-Length here
  contentLength = file.length().toInt,
  body = file
)
val outputFuture = bucket.putObject("test.jpg", input)
val putObjectOutput = Await.result(outputFuture, Duration.Inf)
file.close()

// Print the HTTP status code.
// Example: 201
println(putObjectOutput.statusCode.getOrElse(-1))

删除一个 Object

val outputFuture = bucket.deleteObject(arg, Bucket.DeleteObjectInput())

// Print the HTTP status code.
// Example: 204
println(outputFuture.statusCode.getOrElse(-1))

使用中遇到问题请在 项目 Issues 区 提交反馈。

致谢

最后对 Scala SDK 的作者 Cheerx (谢启荣同学) 表示感谢,同时我们也欢迎更多高校学生或第三方开发者参与到我们的开源项目中来。

QingStor 对象存储推出 FTP 对接工具 qsftpd

qsftpd 是一个将 QingStor 对象存储作为存储后端的 FTP Server,用户通过简单的配置,即可通过 FTP 协议使用对象存储服务。qsftpd 已在 GitHub 开源,更多详情可参见 https://github.com/yunify/qsftpd

下载安装

qsftpd 支持 Linux、macOS 和 Windows 操作系统,最新版本下载链接如下,也可访问 GitHub 项目的 Releases 页面查看和下载历史版本。

使用示例

创建配置文件,如 qsftpd.yaml,并根据需要进行配置,示例配置文件如下。

# 设置 QingStor 对象存储服务
qingstor:
  access_key_id: access_key_id_example
  secret_access_key: secret_access_key_example
  host: qingstor.com
  port: 443
  protocol: https
  log_level: warn

# 填写需要使用的 Bucket
bucket_name: bucket_name_example
zone: pek3a

# FTP Server 配置,如监听的端口号和最大连接数
listen_host: 127.0.0.1
listen_port: 21
public_host: 127.0.0.1
max_connections: 128

# 认证设置,默认允许匿名用户登录,也可以指定特定的用户登录
#users:
#  username_example: password_example

启动 FTP Server。

$ qsftpd -c path/to/your/qsftpd.yaml
[2017-04-12T03:24:40.541Z #2527]  INFO -- : Listening... 127.0.0.1:21
[2017-04-12T03:24:40.541Z #2527]  INFO -- : Starting...
[2017-04-12T03:24:49.330Z #2527]  INFO -- : FTP Client connected: ftp.connected, id: 76e209d6a89448279e947a7babe0097d, RemoteAddr: 127.0.0.1:51788, Total: 1
......

最后使用 ftp 客户端连接 FTP Server 进行测试。

$ ftp -a 127.0.0.1
Connected to 127.0.0.1.
220 Welcome to QSFTP Server
331 User name okay, need password.
230 Password ok, continue
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
229 Entering Extended Passive Mode (|||6081|)
150 Using transfer connection
d--------- 1 ftp ftp            0  Nov 30 00:00  test-output

226 Closing transfer connection
ftp> put AUTHORS
local: AUTHORS remote: AUTHORS
229 Entering Extended Passive Mode (|||6887|)
150 Using transfer connection
100% |***********************************|   146       91.68 KiB/s    00:00 ETA
226 Closing transfer connection
146 bytes sent in 00:00 (2.19 KiB/s)
ftp> 

控制台新增 QingStor 对象存储分段上传管理功能

QingStor 对象存储的分段上传功能是指将一个文件分成多个分段分别上传。当文件体积超过 100MB 时,推荐使用分段上传。与普通的通过 PUT 方法上传文件相比,分段上传有以下好处:

  • 多个分段可以并行上传,比上传单个文件效率更高。
  • 降低了上传失败后重传的成本。
  • 上传过程不受时间影响,分段之间没有上传时间间隔要求。
  • 可以实现「异步创建文件」的过程。

QingStor 对象存储的各种语言 SDK 均已支持分段上传,只需要三步就可以完成一次分段上传:

1. 初始化分段上传

分段上传需要先发送一个初始化请求来获得 Upload ID,后续在上传分段时,在请求参数中附加该 Upload ID,表明分段属于同一个对象。API 详情

2. 上传分段

与 PUT Object 请求类似,只不过需要在上传请求参数中携带 Upload ID 和上传序号,除最后一个分段以外,其它分段最小为 4M,每个分段最大为 1G。API 详情

3. 完成分段上传

当分段上传完毕,需要发送请求结束分段上传,从而获得一个完整的对象。如果未调用此接口,分段上传会处于未完成的状态,此时调用 GET 请求获得该对象会返回错误。API 详情

为了方便用户管理分段上传,QingCloud 控制台提供了查看、完成和取消分段上传的功能。在控制台你可以查看和搜索到所有还未完成的分段上传,点击列表右侧的「查看分段」可以看到对应分段上传包含的分段序号,大小以及创建时间,选择你需要的分段后点击下方的「完成上传」按钮就可以完成此次分段上传,对应的文件也将会显示在文件列表里。更多详细操作请参阅用户指南

QingStor 对象存储支持设置 IP 地址黑/白名单

存储空间策略是 QingStor 对象存储 Bucket 的子资源(subresource),其语义主要由用户、 资源、动作、及条件运算符组合定义,允许用户更细粒度的控制存储空间的访问。此次更新为存储空间策略增加了控制访问 IP 的功能,用户可以设置允许或拒绝访问的 IP 地址。

配置示例

1. 在 Bucket 详情中进入设置页面,切换到 “存储空间策略” 标签页,点击 “添加规则” 按钮。

Cloud_控制台_-_zw_ZW_

2. 在 “IP 地址” 部分设置 “包含” “10.70.0.0/24”,注意这里填写的 IP 地址需为 CIDR 格式。

Cloud_控制台_-_zw_ZW_

3. 点击保存即可。

通过以上的设置,现在只允许从 10.70.0.0/24 这个 IP 地址段访问此 Bucket。如果想禁止某些 IP 地址段访问,可以添加类型为 “不包含” 的 IP 地址段,或者将规则中的 “响应动作” 设置为 “拒绝”。

更多详细介绍请参考相关文档: QingStor Bucket Policy

QingStor 对象存储支持静态网站托管

使用静态网站托管功能,用户可以方便快捷地将静态网站以极低的成本托管在 QingStor 对象存储,同时允许使用自定义的域名来访问网站内容,并且支持一键开启 CDN 和 HTTPS。

下面通过具体例子来说明如何使用静态网站托管功能:

1. 向 Bucket 绑定用于静态网站托管的域名

在 “静态网站托管页面”,点击 “添加静态网站托管访问域名” 可以绑定自定义的域名,要绑定的域名必须已完成备案。

bucket_web_hosting_add_domain

2.  设置并开启静态网站托管

在 “静态网站托管” 设置页面,填写希望使用的索引页面和错误页面, 点击 “开启静态网站托管” 即可使用自定义域名访问网站内容。 此时访问静态网站域名的根路径,或者访问的路径以 “/” 结尾,将返回索引页面。 若访问发生错误,如对象不存在,将返回错误页面。

例如,设置索引页面为 “index.html”,设置错误页面为 “error.html”。 访问根路径时,将返回 “index.html”,访问 “about/” 时,将返回 “about/index.html”。 访问 “test/hello.mp4” 时,如果 “test/hello.mp4” 对象不存在,将返回 “error.html”。

bucket_web_hosting_start

开启静态网站托管后,支持修改网站所使用的索引页面和错误页面,点击 “停止静态网站托管” 可关闭托管服务。

bucket_web_hosting_stop

 3. 设置 Bucket 权限或策略并上传静态网站内容

Bucket 需要设置为 “公开可读”,或者使用存储空间策略来进行访问控制。

bucket_acl

将网站内容上传至 Bucket,推荐使用 QingStor 的命令行工具 qsctl 进行上传, 使用方法可以参考 qsctl 文档

例如使用 qsctl 的 sync 命令上传整个网站:

$ qsctl sync /path/to/website qs://test-bucket

4. 访问网站

最后,访问刚才绑定的自定义域名,即可查看网站内容。

QingStor 对象存储发布新版本 Python SDK

QingStor 对象存储发布了新版本的 Python SDK ,并已开源在 https://github.com/yunify/qingstor-sdk-python 。为说明新版本 Python SDK 和 旧版本 SDK 的区别与联系,本日志将会介绍新版本 Python SDK 的历史背景,变化革新和未来规划。在日志的最后,我们将会展示如何使用新版本的 Python SDK。

历史背景

在 QingStor 对象存储于 2016 年 1 月 6 日 开始公测时, 我们便在 qingcloud-sdk-python 中以 面向对象 形式的接口提供了 QingStor 对象存储的 Python SDK (为行文方便,我们在下文中将此 SDK 称为 旧版 Python SDK )。qingcloud-sdk-python 为 手动实现 的 SDK, 旨在提供 所有青云 QingCloud 服务 的访问。

变化革新

为了加快各语言 SDK 的开发效率,及减小各语言 SDK 的运维成本,我们决定将 SDK 的开 发及后期维护自动化。同时,考虑到移动端用户对空间的敏感,我们决定将 QingStor 对象存储的 SDK 与青云 QingCloud 的其它服务进行分离。

最终,我们于 2016 年 12 月 5 日 发布了 SDK 生成工具 Snips , 及使用 Snips 生成的六种语言 (Go, Ruby, JAVA, Swift, PHP, JS) 的 SDK, 如 qingstor-sdk-go

为了统一所有语言 SDK 的生成和维护, 我们于 2017 年 1 月 12 日 发布了 新版 Python SDK qingstor-sdk-python, (为行文方便,我们在下文中将此 SDK 称为 新版 Python SDK )。

  • qingstor-sdk-python 不再与原有的 qingcloud-sdk-python 捆绑,可以灵活地应用于更多场景。
  • qingstor-sdk-python 有着更完善的 API 设计,对开发者屏蔽了底层的细节,开发者无需关注具体的请求拼装,只需要调用对应的接口即可。

未来规划

考虑到所有语言 SDK 使用接口的统一,新版 Python SDK 的接口实现选择了 非面向对象 的形式, 即与 旧版 Python SDK 不兼容。

  • 旧版 Python SDK 除修复 Bug 外,我们将不再维护。
  • 新版 Python SDK 将由 QingStor 直接维护,享受到最及时的新功能增加, BUG 修复和技术支持。

如何使用新版 Python SDK

使用 SDK 之前请先在青云控制台申请 access key 。

准备工作

发起请求前首先建立需要初始化服务:

from qingstor.sdk.service.qingstor import QingStor
from qingstor.sdk.config import Config

config = Config('ACCESS_KEY_ID_EXAMPLE', 'SECRET_ACCESS_KEY_EXAMPLE')
service = QingStor(config)

初始化并创建 Bucket, 需要指定 Bucket 名称和所在 Zone:

bucket = qingstor.Bucket('test-bucket', 'sh1a')
output = bucket.put()

可以使用 dir(output) 的形式来获取全部可用的属性。特别的,output.headers 是一个包含返回中全部 header 的字典;如果请求失败, output.content 将会存储返回的错误信息。

Objects 操作

接下来将会展示创建,下载,删除一个 Object 的全过程:

创建 Object

with open('/tmp/sdk_bin') as f:
output = bucket.put_object(
    'example_key', body=f
)

创建一个 Object 时,允许在body中传入一个 file like 对象,也支持直接传入一个字符串。上传一个比较大的 Object 时,建议使用 file 对象,避免将全部数据一次性读入内存。

下载 Object

output = bucket.get_object('example_key')
with open(local_path, "wb") as f:
    for chunk in output.iter_content():
        f.write(chunk)

下载一个 Object 时,建议使用 output.iter_content() 来获取文件内容。如果访问 output.content ,将会把全部数据一次性读入内存。

删除 Object

output = bucket.delete_object('example_key')

使用中遇到问题请在 项目 Issues 区 或者直接提交工单反馈。

QingStor 对象存储上海1区-A 上线

继 2016 年 1 月 6 日首度在北京3区 -A 开放公测以来,QingStor 对象存储于 2016 年 9 月 13 日正式商用。在这近一年的时间里,来自大数据,金融,社交,医疗,教育等多个行业的上千家客户,已在 QingStor 北京3区-A 管理了百亿数量、上 PB 容量的数据对象。在运营北京3区-A 的过程中,我们积累了丰富的上线运营经验,并收集到很多来自中国南方的客户需求,他们希望能将自己的业务更近距离地与 QingStor 服务对接,因此 QingStor 于 2016 年 12 月 26 日正式上线新区域上海1区 -A。上海1区 -A 的上线标志了 QingStor 对象存储的多区域服务运营正式开始。

为了能够让用户就近处理和分析海量数据,提高数据访问的效率和降低成本,QingStor 对象存储在设计之初即支持多区域部署的架构,同时支持同区域的 QingCloud IaaS 或 PaaS 资源内网访问。在这一年当中,我们逐步完善了各种功能 (如 AWS S3 兼容,外部镜像,数据迁移工具,数据加密,Bucket 访问控制策略,CDN,CORS,数据同步工具,内网加速,多种语言的 SDK,Bucket 域名别名,等等),也逐步加强了计算资源与 QingStor 对象存储的在服务层面的融合度,其中大数据平台已可通过 AWS S3协议与 QingStor 对象存储无缝集成。同时 QingStor 对象存储在上海1区 -A 的上线也丰富了用户的地域性选择,用户可根据业务需求将数据进行更合理的地域性划分。

我们会进一步加强 QingStor 对象存储与青云 QingCloud 各种服务的集成。未来我们也会将 QingStor 对象存储部署于更多的区域,敬请期待。