腾讯云 COS
大约 10 分钟,不需要花钱,就能在腾讯云 COS 上给孤云准备好一个桶和一对只授权这个桶的密钥。
本文是孤云的官方引导。有一个云端账号即可,不必先看懂腾讯云的权限体系,跟着走完就行。
要准备什么
- 一个腾讯云账号(个人也可以);用主账号登录控制台完成下面所有操作。
- 桶要放在哪个地域,例如
ap-guangzhou(广州);地域后面还要填进孤云,两处必须一致。 - 一个想好的桶名;它末尾会自动带上你账号的 APPID 后缀。
- 不需要先开通别的服务、不需要域名、也不需要备案。
费用按实际用量计算:对象存储本身不收开通费,桶空着基本不产生费用,之后按存储量、请求次数和外网流量计费。如果已经有桶和一对密钥,可以跳过前三步,直接看「抄下这四个值」。
分步操作
-
第 1 步
建存储桶
- 打开腾讯云控制台,进入对象存储 COS,在左侧选「存储桶列表」,点「创建存储桶」。
- 名称随便起一个(小写字母、数字和短横线),地域选你要用的那个 —— 例如
ap-guangzhou;地域要和后面填进孤云的一致。 - 访问权限选「私有读写」,其余选项保持默认,点「创建」。
- 桶名末尾会自动带上你的 APPID,形如
my-photos-1252763116。复制完整桶名(连后缀一起)—— 只复制前缀是孤云连不上桶最常见的原因。 - APPID 是一串数字(示例里是
1252763116),在腾讯云控制台的「账号信息」里能看到,也可以看任何已有桶的名字末尾。 - 孤云是唯一需要多填一格的服务商:把 APPID 填进它自己的「APPID」格,桶名那格只填前缀也行 —— 孤云会替你补成
你填的名字-1252763116;如果粘贴进来的桶名已经带了这个后缀,就不会再追加一次。
-
第 2 步
建子用户与密钥
- 用主账号进入访问管理 CAM →「用户」→「用户列表」,点「新建用户」。
- 访问方式只勾「编程访问」,不要勾控制台登录:孤云只需要一对密钥。
- 创建完成后复制这个子用户的 SecretId 与 SecretKey。SecretKey 只显示一次,离开页面就看不到了 —— 现在就把两个值存好。
- 不要用主账号密钥:它的权限覆盖整个账号,而孤云只需要一个桶。
-
第 3 步
给这个子用户挂权限
- 先弄清一件事:CAM 里的
GetService、PutBucket是操作(action),不是策略名称 —— 所以在「策略」列表里搜这两个词是搜不到的。要用它们,只能走自定义策略。 - 做权限用主账号:CAM →「策略」→「新建自定义策略」→ 选「按策略语法创建」→ 模板选空白模板。
- 把下面这段 JSON 粘进「策略内容」,替换里面的桶名与 APPID(
your-bucket-name-1252763116、1252763116、以及地域ap-guangzhou都是虚构的示例值)。 - 这段策略一次给到两层的权限:第一段是账号级的,允许列出你账号里的桶、并新建桶(桶还不存在时没法把它写进资源路径,所以资源是
*);第二段是桶级的,限定在你那一个桶里,cos:*表示桶内的事都放给它。 - 这段策略故意不含删桶权限 —— 孤云不需要删桶,只建桶、往桶里放东西。
- 只想用已有的桶、不想让应用建桶,就把第一段整个删掉,只留桶级那一段。
- 保存后回到子用户页面,把这条策略关联给它(CAM →「用户」→ 该用户 →「关联策略」)。
- 先弄清一件事:CAM 里的
-
第 4 步
在孤云里填好并测试连接
- 回到孤云,打开「添加存储」,服务商选「腾讯云 COS」,地域选你在控制台选的同一个地域。
- 按下面的顺序把值填进对应格子:APPID、桶名、地域、端点、密钥(SecretId 与 SecretKey)。
- 点「测试连接」。它只读取桶的根目录,不上传、不删除任何东西。
子用户要的权限:一段 CAM 自定义策略
把 your-bucket-name、1252763116 和地域换成你自己的桶名、APPID 与地域。这段策略故意不含删桶权限。
{
"version": "2.0",
"statement": [
{ "effect": "allow", "action": ["cos:GetService", "cos:PutBucket"], "resource": ["*"] },
{ "effect": "allow", "action": ["cos:*"],
"resource": ["qcs::cos:ap-guangzhou:uid/1252763116:your-bucket-name-1252763116/*"] }
]
}
粘贴位置:CAM 控制台 →「策略」→「新建自定义策略」→ 按策略语法创建 → 空白模板。第一段允许列出与新建桶;只想用已有的桶,就把这一段删掉。
腾讯云有现成的预设策略
不想自己写策略,也可以直接挂这三条腾讯云已经做好的策略,效果差不多:
QcloudCOSGetServiceAccess—— 列出账号里的桶。QcloudCOSBucketConfigRead/QcloudCOSBucketConfigWrite—— 读、写桶的配置,其中 Write 也带建桶。- 它们的名字不像动作名,所以在策略列表里按
GetService、PutBucket搜是搜不到的;直接按上面这三个名字找。
用户实测的结论
把 cos:GetService / cos:PutBucket / cos:DeleteBucket 写进按桶限定的那一段里也能用,不必放在资源为 * 的第一段。
cos:DeleteBucket 只对被限定的那个桶有效:换成账号里别的桶仍然会被拒。就算这样,孤云也不需要删桶权限。
控制台的「访问域名」不是孤云要的端点
建好桶后,「概览」里会显示一个访问域名,形如 https://my-photos-1252763116.cos.ap-guangzhou.myqcloud.com —— 它把桶名写进了主机名,是给浏览器用的地址。
孤云要的是服务端点,形如 https://cos.ap-guangzhou.myqcloud.com,不带桶名;桶名单独填在桶名那一格。
把访问域名整段填进端点,孤云就会去访问一个不存在的地址,测试连接直接失败。
抄下这四个值
这四个值要填进孤云「添加存储」页的对应格子里(腾讯云 COS 比别家多一个 APPID 格):
| 抄下这个值 | 填进孤云的哪一格 |
|---|---|
| 桶名 控制台里的完整桶名,含末尾的 -APPID 后缀,例如 my-photos-1252763116。 | 桶名称 |
| APPID 桶名末尾那串数字,例如 1252763116。在控制台「账号信息」里,或任何已有桶的名字末尾。 | APPID |
| 地域 桶所在的地域代码,例如 ap-guangzhou。 | 地域 |
| 端点 服务端点,形如 https://cos.ap-guangzhou.myqcloud.com(把 ap-guangzhou 换成你的地域);不带桶名。 | Endpoint |
| 密钥 刚才那个子用户的 SecretId 与 SecretKey(不是主账号的)。 | SecretId 与 SecretKey |
怎么知道成了
- 「测试连接」通过,说明那对密钥能读到这个桶 —— 孤云只读根目录,不会动桶里的东西。
- 随后这条存储就会出现在孤云的存储列表里,可以打开看桶里的文件。
- 如果测试报
AccessDenied,多半是桶名没连 APPID 后缀一起复制,或者密钥没有这个桶的权限;报域名相关的错误,多半是把「访问域名」当成了端点。
回到孤云,点「测试连接」。
常见错误
腾讯云 COS 最常见的几种失败,以及先查哪一处。
| 现象 / 错误码 | 含义 | 怎么办 |
|---|---|---|
403 AccessDenied(桶名对不上) | 桶名不完整:只复制了前缀,没连末尾的 -APPID 后缀一起复制,孤云去找的桶并不存在(或不属于你)。 | 回控制台把完整桶名复制过来,例如 my-photos-1252763116;或者把 APPID 填进孤云的「APPID」格,让孤云替你补后缀。 |
403 AccessDenied(密钥没权限) | 桶名是对的,但这对密钥没有被授权这个桶 —— 策略没做、没关联到子用户,或策略里的桶名还是示例值。 | 回 CAM 检查:这条策略关联给那个子用户了吗?策略资源路径里的桶名和 APPID 换成了你自己的吗? |
SignatureDoesNotMatch | 签名对不上:SecretKey 复制错了(混进了空格或少了字符),或者桶名 / 地域 / 端点有一处和实际不一致。 | 重新复制一遍 SecretKey;再逐格核对桶名、地域与端点。 |
InvalidAccessKeyId | 这个 SecretId 不存在,通常是复制错了,或者这已经是一把被删除、被禁用、被轮换掉的旧密钥。 | 回到 CAM 给那个子用户重新生成一对密钥,两个值一起换。 |
| SecretKey 只显示了一次,没存下来 | SecretKey 只在创建时显示一次,关掉页面就再也看不到。 | 不用找回来:在 CAM 里给这个子用户重新生成一对密钥,然后在孤云里把两个值都换掉。 |
| 连接失败、报域名或网络错误 | 把控制台给的访问域名当成了端点 —— 那个地址里已经带着桶名(https://my-photos-1252763116.cos.ap-guangzhou.myqcloud.com)。 | 端点改成服务端点 https://cos.ap-guangzhou.myqcloud.com,桶名单独填在桶名那一格。 |
| 测试连接通过,上传却失败 | 连接测试只读根目录,读得通不代表写得进。 | 回 CAM 确认策略的桶级那一段动作覆盖写入(上面这段 cos:* 就是全覆盖);再传一个小文件试试。 |
改完设置记得回到孤云重新点一次「测试连接」,测试通过才会保存下来。