腾讯云-对象存储服务(COS)的使用总结

简介

对象存储(Cloud Object Storage,COS)是腾讯云提供的一种存储海量文件的分布式存储服务,具有高扩展性、低成本、可靠安全等优点。通过控制台、API、SDK 和工具等多样化方式,用户可简单、快速地接入 COS,进行任意格式文件的上传、下载和管理,实现海量数据存储和管理。同时遍布全国范围的 CDN/EdgeOne 节点可以对文件下载进行加速。

基本概念

下面通过几个名词概念,帮助您进一步了解腾讯云 COS:

存储桶(Bucket) :是对象的载体,可理解为存放对象的"容器"。一个存储桶可容纳无数个对象。

对象(Object):是 COS 的基本单元,可理解为任何格式类型的数据,例如图片、文档和音视频文件等。

地域(Region):是腾讯云托管机房的分布地区,COS 的数据存放在这些地域的存储桶中。

多 AZ(Multiple Availability Zones) :是由腾讯云对象存储推出的多 AZ 存储架构。客户数据分散存储在城市中多个不同的数据中心,当某个数据中心因为自然灾害、断电等极端情况导致整体故障时,多 AZ 存储架构依然可以为客户提供稳定可靠的存储服务。

访问域名(Endpoint):对象被存放到存储桶中,用户可通过访问域名访问和下载对象。

存储类型(StorageClass):指对象在 COS 中的存储级别和活跃程度。COS 提供多种存储类型:标准存储(多 AZ)、低频存储(多 AZ)、智能分层存储(多 AZ)、智能分层存储、标准存储、低频存储、归档存储、深度归档存储。每种存储类型适用于不同的业务场景,拥有不同的特性(例如对象访问频度、访问时延等)。关于不同存储类型的详细介绍,请参见 存储类型概述。

优点

相比起自己搭建上传下载的服务,COS的优点如下:

  1. 完全不占用用户服务器上下行的带宽
  2. 网络加速,遍布全国范围的 CDN/EdgeOne 节点
  3. 不占用服务器的磁盘存储空间
  4. 防盗链,
  5. SSL 加密传输,控制每个单独文件的读写权限
  6. 存储资源的高可用,提供数据跨多设备冗余存储,为用户数据提供异地容灾和资源隔离功能
  7. 无需传统硬件的采购、部署和运维,节省了运维工作和托管成本。
  8. 上传后的,自动对数据万象图片处理,文档,音视频转码,语音识别,媒体的后续处理等
  9. 存储桶挂载到本地的云主机功能

使用

访问管理

腾讯云 COS 服务在使用时需要对请求进行访问管理。通过临时密钥机制,您可以临时授权您的 App 访问您的存储资源,而不会泄露您的永久密钥。密钥的有效期由您指定,过期后自动失效。通常,我们都不建议您把永久密钥放到客户端代码中。本文主要介绍如何在后台快速搭建一个临时密钥服务,通过生成的临时密钥来对上传或者下载请求进行签名,从而保证您数据的安全性。

其中:
用户客户端 :即用户手机上的 App
用户服务端 :用户的后台服务器,这里用于获取临时密钥,并返回给用户客户端
CAM权限系统 :腾讯云访问管理,用于生成 COS 的临时密钥
COS对象存储:腾讯云对象存储,负责存储 App 上传的数据

获取永久密钥

临时密钥需要通过永久密钥才能生成。请登录 腾讯云访问管理控制台 获取,包含:SecretId,SecretKey

搭建临时密钥服务

引入SDK

bash 复制代码
implementation 'com.qcloud:cos-sts_api:3.1.1';

实现

在nacos中添加配置,也是必须修改参数,其他参数根据自身情况修改。

yaml 复制代码
  #对象存储
  cos:
    enable: true
    duration: 1800
    bucket: gamioo-1258024122
    region: ap-shanghai
    secretId: **********************************
    secretKey: *********************************
    endpoint: https://gamioo-1258024122.cos.ap-shanghai.myqcloud.com

配置初始化:

java 复制代码
  /**
     * 获取联合身份临时访问凭证
     */
    public Response reloadCredential() {
        TreeMap<String, Object> config = new TreeMap<>();

        // 云 api 密钥 SecretId
        config.put("secretId", cosProperties.getSecretId());
        // 云 api 密钥 SecretKey
        config.put("secretKey", cosProperties.getSecretKey());
        // 设置域名,可通过此方式设置内网域名
        //config.put("host", "sts.internal.tencentcloudapi.com");
        // 临时密钥有效时长,单位是秒
        config.put("durationSeconds", cosProperties.getDuration());
        // 换成你的 bucket
        config.put("bucket", cosProperties.getBucket());
        // 换成 bucket 所在地区
        config.put("region", cosProperties.getRegion());
        // 可以通过 allowPrefixes 指定前缀数组, 例子: a.jpg 或者 a/* 或者 * (使用通配符*存在重大安全风险, 请谨慎评估使用)
        config.put("allowPrefixes", new String[]{"*"});
        // 密钥的权限列表。简单上传和分片需要以下的权限,其他权限列表请看 https://cloud.tencent.com/document/product/436/31923
        String[] allowActions = new String[]{
                // 简单上传
                "name/cos:PutObject",
                "name/cos:PostObject",
                // 分片上传
                "name/cos:InitiateMultipartUpload",
                "name/cos:ListMultipartUploads",
                "name/cos:ListParts",
                "name/cos:UploadPart",
                "name/cos:CompleteMultipartUpload"
        };
        config.put("allowActions", allowActions);
        Response response = null;
        try {
            response = CosStsClient.getCredential(config);
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
        return response;
    }

其中,请求参数说明:

字段 类型 描述
secretId String 云 API 密钥 Id
secretKey String 云 API 密钥 key
durationSeconds int 要申请的临时密钥最长有效时间,单位秒,默认 1800,最大可设置 7200
bucket String 存储桶名称:bucketName-appid, 如 example-125000000
region String 存储桶所属地域,如 ap-guangzhou
allowPrefix String 资源的前缀,可以根据自己网站的用户登录态判断允许上传的具体路径,例子: a.jpg 或者 a/* 或者 * (使用通配符*存在重大安全风险, 请谨慎评估使用)
allowActions String[] 授予 COS API 权限集合, 如简单上传操作:name/cos:PutObject
policy String 策略:由 allowActions、bucket、region、allowPrefix字段组成的描述授权的具体信息

返回值说明

yml 复制代码
{
	"credentials":{
		"sessionToken":"mPOLNpDJjVK4Qm22GaUmnWlYzKlpCAja431a1bf3d94fdf541d2be2dcbf82f7baK843Oxi15MH7GZkSGyYVNSNJn9yrtBZxO5_ASQWWL8eR8z_UyHNCxMi6ZMKuwg-hrcLAw-fDPg5LlykM5Y9kiePhd6FBM9UGmVwWCt1b48w3I6vrcFvIM6Cqf_UwbPWiXZYaBNjLMMkVbu869iGvUcTic9X75Bi2Dcmq52GLpUMvie5aFQTw5l_SrKGODOnUIEYEG8Ihnp-l_rdCej2YmcaXEDe8OnP9BuU5SR3lMC93W0cKeyikAHKyeMEG2To2FEQIGCGxogeQfHG03pfQD_8vZUlBOS7qUsK2qzb6B8Uqi7m_7UIyEYZF3b35FQmj9BvMbuJdyXbCoeYeMgk9J1qKDcPtdjAoBPvIo_cCl_PALjbD32mYlpbJoVYJfPC0I3eCT_lI-VMJ4Flb7a81K5bl2A33FUodCBz7MHBvD6140m2iTGNifHz29PJw2QqkvFY08dWiEi3Al0o8qUO5rbxPngt4u7uIZhRmfpiob0eDOLOVFgl5K1TaK7eYowKvv_q-yDBf2qhZSD54iYPcYbIivx4h1Yp7ZriQpaKaGSSZwGYP9cg3LLlEqaAeupvc",
		"tmpSecretId":"AKIDiYcPkzj-O6e8k24xCifHoiWeNkZPgHr4l_n7qgj8dbPtsgveL99YCTn-H6cCGu0v",
		"tmpSecretKey":"85/Jm3Fu9QoUDEXEOyrZJrCDKjEesFOOhbHQOqOTf18="
	},
	"expiration":"2023-08-23T04:14:35Z",
	"expiredTime":1692764075,
	"requestId":"ea06d01d-772a-491e-b736-1d1e55d64d08",
	"startTime":1692762275
}
字段 类型 描述
credentials String 临时密钥信息
tmpSecretId String 临时密钥 Id,可用于计算签名
tmpSecretKey String 临时密钥 Key,可用于计算签名
sessionToken String 请求时需要用的 token 字符串,最终请求 COS API 时,需要放在 Header 的 x-cos-security-token 字段
startTime String 密钥的起始时间,是 UNIX 时间戳
expiredTime String 密钥的失效时间,是 UNIX 时间戳

对返回的值进行二次封装后,得到如下的返回体:

java 复制代码
@ApiModel(value = "存储对象临时访问凭证")
public class ResponseDTO {
    @ApiModelProperty("存储桶名")
    private String bucket;
    @ApiModelProperty("地域")
    private String region;
    @ApiModelProperty("临时证书密钥ID")
    private String secretId;
    @ApiModelProperty("临时证书密钥Key")
    private String secretKey;
    @ApiModelProperty("临时令牌")
    private String sessionToken;
    @ApiModelProperty("临时访问凭证开始时间")
    private long startTime;
    @ApiModelProperty("临时访问凭证过期时间")
    private long expiredTime;
    }

在业务层做一层缓存,在失效前从本地读取,失效或者找不到的情况下,才再次去获取临时访问凭证:

java 复制代码
    /**
     * 获取联合身份临时访问凭证
     */
    @Override
    public ResponseDTO getCredential() {
        ResponseDTO ret = null;
        Response response = null;
        String key = RedisConstant.COS_CREDENTIAL;
        Object value = redisService.get(key);
        if (value != null) {
            response = JSON.parseObject(value.toString(), Response.class);
        } else {
            response = configuration.reloadCredential();
            if (response != null) {
                long duration = Math.max(0, response.expiredTime - System.currentTimeMillis());
                redisService.setExpire(key, JSON.toJSONString(response), duration, TimeUnit.SECONDS);
            }
        }
        if (response != null) {
            ret = ResponseDTO.from(configuration.getCosProperties(), response);
        }
        return ret;
    }

最终提供获取临时访问凭证的接口:

java 复制代码
/**
 * 对象存储(Cloud Object Storage,COS)
 *
 */
@RestController
@RequestMapping("/cos")
@Api(tags = "对象存储管理")
public class CosController extends BaseController {
    @Resource
    private ICosService cosService;

    /**
     * 获取联合身份临时访问凭证
     *
     * @return Result
     */
    @PreAuth
    @GetMapping("/get")
    @ApiOperation(value = "获取联合身份临时访问凭证", notes = "获取联合身份临时访问凭证")
    public Result<ResponseDTO> get() {
        ResponseDTO response = cosService.getCredential();
        return Result.data(response);
    }
}

总结

本文主要是主要介绍了腾讯云的对象存储(Cloud Object Storage,COS),阐述了使用COS带来的好处及优势,通过实例来介绍了如何使用。下一篇,我们将介绍在客户端拿到临时访问凭证后,进行存储和获取的操作。

参考链接:
对象存储快速入门
临时密钥生成及使用指引
腾讯云对象存储COS简介和如何接入
COS API 授权策略使用指引

相关推荐
佛州小李哥2 小时前
通过亚马逊云科技Bedrock打造自定义AI智能体Agent(上)
人工智能·科技·ai·语言模型·云计算·aws·亚马逊云科技
Linux运维老纪2 小时前
DNS缓存详解(DNS Cache Detailed Explanation)
计算机网络·缓存·云原生·容器·kubernetes·云计算·运维开发
ivwdcwso7 小时前
云计算部署模式全面解析
云计算
.生产的驴1 天前
MYSQL 商城系统设计 商品数据表的设计 商品 商品类别 商品选项卡 多表查询
数据库·mysql·搜索引擎·性能优化·云计算·状态模式·多分类
weixin_307779131 天前
PyDeequ库在AWS EMR启动集群中数据质量检查功能的配置方法和实现代码
大数据·python·spark·云计算·aws
会敲代码的Steve1 天前
本地Harbor仓库搭建流程
运维·分布式·云计算
Archie_IT1 天前
基于云计算、大数据与YOLO设计的火灾/火焰目标检测
大数据·人工智能·yolo·目标检测·云计算
努力的小T2 天前
Linux二进制部署K8s集群的平滑升级教程
linux·运维·服务器·云原生·容器·kubernetes·云计算
乙卯年QAQ2 天前
【腾讯云】腾讯云docker搭建单机hadoop
hadoop·docker·腾讯云
Jackilina_Stone3 天前
【huawei】云计算的备份和容灾
安全·云计算·学习笔记·huawei·灾备