跳到主要内容

挂载对象存储

概述

云托管服务需要持久化存储时,可以通过挂载云开发对象存储,或腾讯云对象存储来实现。COS 提供了高可用、高可靠、低成本的数据存储服务,将其挂载到云托管实例后,应用可以像使用本地文件系统一样访问和管理存储在 COS 中的数据。

主要优势

  • 数据持久化:与临时存储不同,COS 中的数据在实例销毁后仍然保留
  • 高可靠性:COS 提供 99.999999999% 的数据可靠性
  • 多实例共享:所有实例可访问相同的存储内容,便于数据共享
  • 按需付费:根据实际存储用量和请求次数计费,经济实惠

使用场景

COS 对象存储挂载特别适用于以下场景:

  • 静态资源存储:存储网站图片、视频、文档等静态资源
  • 用户上传内容:保存用户上传的文件,如头像、附件等
  • 数据备份归档:存储应用日志、数据备份等需长期保存的信息
  • 跨实例数据共享:在多个实例间共享配置文件、模板等数据
  • 大文件处理:处理超出临时存储容量限制的大型文件

配置步骤

准备工作

  1. 获取访问密钥:前往腾讯云访问管理控制台,创建或获取 SecretID 和 SecretKey

    可以为对象存储创建单独的子用户,并仅授予必要的 COS 访问权限,遵循最小权限原则

详细步骤

  1. 配置访问密钥

    • 进入云开发平台控制台
    • 选择「资源连接」>「连接管理」,或在云托管服务的「存储挂载」>「新增连接密钥」
    • 添加腾讯云 API 密钥,填入获取的 SecretID 和 SecretKey
  2. 启用存储挂载

    • 在云托管服务详情页面,选择「存储挂载」
    • 点击「启用存储挂载」,选择存储类型为「对象存储」
  3. 选择存储桶

    • 选择「云开发对象存储」:系统自动填充存储桶信息
    • 选择「腾讯云对象存储」:需手动填写存储桶名称
  4. 配置挂载路径

    • 对象存储挂载路径:指定要挂载的 COS 目录,默认为根目录「/」
    • 实例挂载路径:指定 COS 在实例中的挂载位置,默认为「/mnt」
  5. 确认并保存配置

挂载路径限制

实例中以下目录不能被挂载:/, /proc, /sys, /dev, /var/run, /app/cert

代码示例

Node.js 示例

const fs = require('fs');
const path = require('path');

// 假设 COS 挂载在 /mnt/cos 目录
const cosPath = '/mnt/cos';

// 写入文件
app.post('/upload', (req, res) => {
const fileName = `file-${Date.now()}.txt`;
const filePath = path.join(cosPath, fileName);

fs.writeFileSync(filePath, req.body.content);
res.send(`文件已保存至: ${fileName}`);
});

// 读取文件
app.get('/files/:fileName', (req, res) => {
const filePath = path.join(cosPath, req.params.fileName);

if (fs.existsSync(filePath)) {
const content = fs.readFileSync(filePath, 'utf8');
res.send(content);
} else {
res.status(404).send('文件不存在');
}
});

Python 示例

import os
from flask import Flask, request, jsonify

app = Flask(__name__)

# 假设 COS 挂载在 /mnt/cos 目录
cos_path = '/mnt/cos'

@app.route('/upload', methods=['POST'])
def upload_file():
file_name = f"file-{int(time.time())}.txt"
file_path = os.path.join(cos_path, file_name)

with open(file_path, 'w') as f:
f.write(request.json.get('content', ''))

return jsonify({"message": f"文件已保存至: {file_name}"})

@app.route('/files/<file_name>', methods=['GET'])
def get_file(file_name):
file_path = os.path.join(cos_path, file_name)

if os.path.exists(file_path):
with open(file_path, 'r') as f:
content = f.read()
return content
else:
return jsonify({"error": "文件不存在"}), 404

注意事项及最佳实践

性能考量

  • 缓存策略:频繁访问的文件考虑先缓存到内存或临时存储
  • 批量操作:尽量批量读写文件,减少 I/O 操作次数
  • 文件大小:对于大文件操作,考虑分片处理

多实例协作

  • 路径隔离:不同实例操作时,建议使用唯一标识(如实例ID)创建子目录
  • 文件锁:读写共享文件时,实现适当的锁机制避免冲突
  • 原子操作:使用原子重命名等技术确保文件操作的完整性
// 安全的文件更新示例(Node.js)
const fs = require('fs').promises;
const path = require('path');

async function safelyUpdateFile(filePath, newContent) {
const tempPath = `${filePath}.tmp`;

// 先写入临时文件
await fs.writeFile(tempPath, newContent);

// 原子性地重命名替换原文件
await fs.rename(tempPath, filePath);
}

安全性

  • 权限控制:定期检查 COS 存储桶的访问权限设置
  • 敏感数据:避免在 COS 中存储未加密的敏感信息
  • 公开访问:使用云开发对象存储时,注意公有读权限可能导致文件被外部访问

成本优化

  • 生命周期管理:为不常用数据配置生命周期规则,自动转换存储类型或删除
  • 按需挂载:只在需要时挂载 COS,不需要时可以卸载以减少资源占用

相关资源