use-case

媒体与对象存储管理员手册:Profile、权限和生命周期

直接答案按用途绑定独立存储 Profile,先测试连接再保存并同步生命周期;生成与中转结果可按期限清理,合规和消息资产应使用私有代理与独立保留策略,签名 URL 与公开 URL 都按凭证管理。

更新 · 审核信息

小白:Profile 与用途不是一回事

/console/setting 的存储区域配置 Profile。Profile 是一套提供商、Endpoint、Bucket、凭据、路径、访问模式和生命周期连接;用途映射决定 compliancegeneratedstagingmessage_assetsbase64_error_url 分别使用哪套连接。不要因为 Bucket 相同就把所有用途混成一个安全边界。

本站支持阿里云 OSS、标准 S3 兼容存储、Storage Tong 和任务报告上传。message_assets 必须绑定私有代理 Profile,且不支持任务报告上传类型;base64_error_url 只接受标准 S3 或阿里云 OSS。启用的 Profile 必须配置完整。

最小安全配置

使用独立服务账号和最小 Bucket/前缀权限,Endpoint 必须是可信 HTTP/HTTPS 主机,生产优先 HTTPS;内网 Endpoint 仅用于可信同区域网络。公开模式只用于确认可公开的结果,合规资料和消息资产用 private。CDN、自定义域名和 Bucket CORS 仍需独立限制来源、方法和缓存。

{
  "id": "generated-s3",
  "provider": "s3",
  "enabled": true,
  "region": "auto",
  "use_path_style": true,
  "endpoint": "https://s3-compatible.example",
  "bucket": "generated-assets",
  "path_template": "generated/${YYYY}/${MM}/${DD}/${model}-${hash8}",
  "access_mode": "public",
  "lifecycle_enabled": true,
  "expiration_days": 30
}

响应不会回显 Access Key Secret 或 STS JWT Secret,只返回“已配置”标志。编辑已有 Profile 时留空 Secret 会保留旧值;这不等于可以从接口还原明文。

测试、保存与生命周期同步

正确顺序是:用 POST /api/storage/profiles/{id}/test 测待保存配置 → PUT /api/storage/profiles 原子保存 Profiles 与用途映射 → POST /api/storage/lifecycle/sync 同步规则 → 到存储提供商核对规则。三条接口均要求运营身份和“设置”权限。

连接测试会上传并清理一个小对象,因此测试凭据也需要对应的写入与删除权限。生命周期同步会保留其他规则,并按本站规则 ID 更新当前 Profile 的前缀规则;启用前核对前缀不会覆盖长期保留区。存储提供商的到期删除通常不是实时发生,不能把精确删除时刻当作业务承诺。

公开、私有代理与签名 URL

public 会生成可直接访问的对象 URL;private 应经本站鉴权代理交付。签名 URL 是限时 bearer 凭证:拿到 URL 的人可在过期前执行其签名操作。缩短有效期、绑定单对象和单方法,不在 Referrer、分析系统、聊天记录或错误日志中暴露。

上游远程图片会经过 SSRF 防护客户端探测,元数据读取限制在 512 KiB,但运营仍应限制可用上游和出口网络。渠道的 image_storage_enabled 只决定是否保存/代理结果 URL,不会替代 Bucket 权限、内容审核或生命周期。

保留、清理与数据库一致性

默认用途设计是:生成结果公开且 30 天、临时中转公开且 3 天、合规资料私有且不自动到期;这是初始值,不是法律保留建议。消息资产自动准备为私有、无生命周期的独立 Profile。真正期限应由产品、合同与合规负责人批准。

内容资产清理只在主节点执行,按 50 条批次流式排空:未绑定临时资产默认 24 小时后、已解绑资产宽限 1 小时后进入清理;对象删除失败默认 15 分钟后重试,单次删除超时 30 秒。生命周期是存储侧兜底,数据库清理是应用侧一致性,两边都要监控。

故障恢复与验证

上传失败先分清 DNS/TLS、Endpoint、Region、Path Style、凭据、Bucket、KMS、CORS 和配额。下载 403 检查访问模式、代理鉴权、签名过期与时钟;404 检查对象键模板、生命周期和上游结果过期;清理失败检查删除权限、对象锁与版本控制。

变更 Endpoint、Bucket 或用途映射前先导出配置和对象清单,使用新 Profile 做双写/抽样读,再切用途映射。不要直接复用旧 Profile ID 指向另一个 Bucket,否则历史对象引用会失去语义。恢复演练应覆盖凭据轮换、Bucket 不可用、生命周期误配、数据库恢复后对象缺失和 CDN 缓存未失效。

专家:观测与审计

指标至少包含按 Profile/用途的上传成功率、首字节与完整耗时、字节数、删除失败、清理积压、最老孤儿、生命周期同步结果、403/404、出口流量和存储费用。日志只记录 Profile ID、用途、对象键摘要、MIME、大小、状态、Request-ID 和任务 ID;不记录 Secret、完整签名 URL、Base64 或敏感原文。

每季度核对用途映射、最小权限、公开访问、CORS、生命周期、版本控制、对象锁、加密、备份与恢复点。对生成结果做随机抽样读,对数据库与对象存储做双向孤儿盘点;删除策略变更先在测试前缀验证,再逐步扩展。

适用场景

  • 配置生成、暂存、合规与消息资产存储
  • 设计公开、私有代理和签名 URL 边界
  • 同步生命周期并排查上传、下载和清理失败

FAQ

所有媒体都可以放进同一个公开 Bucket 吗?

不建议。生成结果、临时中转、合规资料和消息资产的访问与保留要求不同,应按用途绑定独立 Profile;敏感内容使用私有代理。

保存 Profile 后生命周期会自动生效吗?

只有启用生命周期且过期天数大于零的兼容 Profile 才会同步规则。保存后应调用同步并在存储侧核对前缀、天数和已有规则。

签名 URL 可以写进日志方便排障吗?

不可以。签名 URL 在有效期内等同持有指定对象操作权限的 bearer 凭证,日志只保留 Profile ID、对象键摘要、状态和过期时间。

为什么数据库记录删除了,对象仍然存在?

数据库清理与对象存储删除可能分别失败。应观察清理失败、下次重试时间和对象删除结果,并用 Inventory 或抽样核对孤儿对象。

官方来源

  1. Amazon S3 Lifecycle Configuration Elements Official
  2. Amazon S3 Security Best Practices Official
  3. Cloudflare R2 Presigned URLs Official