阿里云 OSS:中国大陆 + 免备案
这条路用 OSS 默认地址,不需要域名、备案或证书,大约 10 分钟就能在阿里云上给孤云准备好一个桶和一对密钥。
只适用于 OSS 服务在 2025-03-20 之前就已开通的账号;不确定开通时间、或开通得更晚,请走「中国大陆 + 备案全套」那条路。
分步操作
-
第 1 步
注册账号并完成实名验证
- 没有阿里云账号就先注册,并按控制台提示完成实名验证;已有账号可跳过。
- 两个入口,账号不通用:国际站 www.alibabacloud.com(英文界面为主、国际信用卡或 PayPal);中国站 www.aliyun.com(简体中文、要实名验证、支付宝或微信支付一类)。注册后就用同一个站点的控制台做完下面的步骤。
-
第 2 步
开通 OSS
- 在控制台搜索「对象存储 OSS」,进入产品页点「立即开通」。
- 老账号早就开通过,跳过这一步即可;开通本身不收费。
-
第 3 步
创建存储桶
- 在「Bucket 列表」点「创建 Bucket」,填桶名(全球唯一,例如
your-bucket-name)并选一个内地域,例如cn-beijing。 - 读写权限选「私有」,「阻止公共访问」保持开启。
- 在「Bucket 列表」点「创建 Bucket」,填桶名(全球唯一,例如
-
第 4 步
创建 RAM 子用户并取密钥
- 在「访问控制 RAM」→「用户」→「创建用户」,勾选「OpenAPI 调用访问」,不要勾选控制台登录。
- AccessKey ID 与 Secret 只显示一次,立刻复制保存;不要用主账号密钥。
-
第 5 步
把最小权限策略挂给这个子用户
- 在「权限管理 → 权限策略」新建自定义策略,切到脚本(JSON)编辑,粘贴下面的策略并把
your-bucket-name换成真实桶名。 - 回到用户页面,把这条策略授权给刚才的子用户。
- 在「权限管理 → 权限策略」新建自定义策略,切到脚本(JSON)编辑,粘贴下面的策略并把
-
第 6 步
回孤云填四个值并测试
- 在孤云「添加存储」里选「阿里云 OSS」,填桶名、地域、Endpoint 与密钥。
- Endpoint 用
https://oss-{地域}.aliyuncs.com(内地域默认地址),地址方式选「Bucket 子域名」,再点「测试连接并保存」。
最小权限策略(必做)
在 RAM 里新建自定义策略、切到脚本编辑,粘贴这段 JSON。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": ["oss:ListObjects", "oss:GetBucketLocation", "oss:ListMultipartUploads"],
"Resource": ["acs:oss:*:*:your-bucket-name"]
},
{
"Effect": "Allow",
"Action": ["oss:GetObject", "oss:PutObject", "oss:DeleteObject", "oss:AbortMultipartUpload", "oss:ListParts"],
"Resource": ["acs:oss:*:*:your-bucket-name/*"]
}
]
}
把 your-bucket-name 换成真实桶名。 也不要把资源范围收窄到某个目录:孤云要在 .guyun/ 前缀下写回收站清单与设备记录。
其他情况(用不到可以跳过)
怎么确认自己是老账号
看的是 OSS 服务的开通时间,不是建桶时间:2025-03-20 之前开通的账号,才能这样用默认地址访问内地域的桶。
后来新建的桶同样不受限;反过来,2025-03-20 当天及之后开通的账号,走这条路的请求会被拒。
万一命中限制怎么办
新账号用默认外网域名访问内地域桶的数据类 API 会被拒,错误码 PublicEndpointForbidden(HTTP 400)。
它限制的是域名不是权限:桶设为私有、阻止公共访问、不对外提供链接,也一样被拒。
遇到就走这条路线的另一半:中国大陆 + 备案全套(绑定一个已备案的自定义域名)。
ROS 一键模板(可选捷径)
让资源编排(ROS)一次建好私有桶、只授权该桶的 RAM 用户和 AccessKey。
- 它按下面的模板一次建好私有桶、只授权该桶的 RAM 用户,以及这个用户的 AccessKey。
- 复制模板全文,在 ROS 创建页选「指定模板 → 输入模板」粘贴。
- 必须勾选「安全确认」,否则创建会被拦下。
- 失败时点资源栈的「事件」看原因,桶名被占用最常见。
ROS 模板
{
"ROSTemplateFormatVersion": "2015-09-01",
"Description": {
"zh-cn": "为孤云创建:私有且阻止公共访问的 OSS Bucket、只授权该桶读写的 RAM 用户、以及该用户的 AccessKey。AccessKey ID 与 Secret 会出现在资源栈的「输出」里,复制回应用即可。",
"en": "Creates, for Guyun: a private OSS bucket with public access blocked, a RAM user limited to that bucket, and an AccessKey for it. The AccessKey ID and secret appear in the stack outputs; copy them back into the app."
},
"Parameters": {
"BucketName": {
"Type": "String",
"Label": {
"zh-cn": "Bucket 名称",
"en": "Bucket name"
},
"Description": {
"zh-cn": "全局唯一。3–63 位,只能用小写字母、数字和短横线,首尾必须是字母或数字。例如 my-photos-2026。",
"en": "Globally unique. 3–63 characters: lowercase letters, digits and hyphens, starting and ending with a letter or digit. For example my-photos-2026."
},
"AllowedPattern": "^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$",
"MinLength": 3,
"MaxLength": 63
},
"RamUserName": {
"Type": "String",
"Label": {
"zh-cn": "RAM 用户名",
"en": "RAM user name"
},
"Description": {
"zh-cn": "给应用专用的子账号。如果账号下已经有同名用户,请改成别的名字再创建。",
"en": "A dedicated sub-account for the app. If a user with this name already exists, pick another one."
},
"Default": "guyun-app",
"AllowedPattern": "^[a-zA-Z0-9._-]{1,64}$",
"MinLength": 1,
"MaxLength": 64
}
},
"Resources": {
"Bucket": {
"Type": "ALIYUN::OSS::Bucket",
"Properties": {
"BucketName": {
"Ref": "BucketName"
},
"AccessControl": "private",
"StorageClass": "Standard",
"BlockPublicAccess": true
}
},
"AppUser": {
"Type": "ALIYUN::RAM::User",
"Properties": {
"UserName": {
"Ref": "RamUserName"
},
"DisplayName": {
"Fn::Sub": "孤云存储"
},
"Comments": {
"Fn::Sub": "孤云专用存储用户;授权桶 ${BucketName} 的读写;随资源栈删除。"
}
}
},
"BucketPolicy": {
"Type": "ALIYUN::RAM::ManagedPolicy",
"DependsOn": "AppUser",
"Properties": {
"PolicyName": {
"Fn::Sub": "guyun-${BucketName}-rw"
},
"Description": {
"Fn::Sub": "Guyun: read and write ${BucketName} only. No bucket-level administration."
},
"PolicyDocument": {
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"oss:ListObjects",
"oss:GetBucketLocation",
"oss:ListMultipartUploads"
],
"Resource": [
{
"Fn::Sub": "acs:oss:*:*:${BucketName}"
}
]
},
{
"Effect": "Allow",
"Action": [
"oss:GetObject",
"oss:PutObject",
"oss:DeleteObject",
"oss:AbortMultipartUpload",
"oss:ListParts"
],
"Resource": [
{
"Fn::Sub": "acs:oss:*:*:${BucketName}/*"
}
]
}
]
},
"Users": [
{
"Fn::GetAtt": [
"AppUser",
"UserName"
]
}
]
}
},
"AccessKey": {
"Type": "ALIYUN::RAM::AccessKey",
"DependsOn": "AppUser",
"Properties": {
"UserName": {
"Fn::GetAtt": [
"AppUser",
"UserName"
]
}
}
}
},
"Outputs": {
"BucketName": {
"Label": {
"zh-cn": "Bucket 名称",
"en": "Bucket name"
},
"Description": {
"zh-cn": "填到应用的「Bucket 名称」里。",
"en": "Paste into the app's bucket name field."
},
"Value": {
"Ref": "BucketName"
}
},
"RegionId": {
"Label": {
"zh-cn": "地域",
"en": "Region"
},
"Description": {
"zh-cn": "资源栈所在地域,也就是 Bucket 的地域。",
"en": "The stack's region, which is the bucket's region."
},
"Value": {
"Ref": "ALIYUN::Region"
}
},
"Endpoint": {
"Label": {
"zh-cn": "HTTPS Endpoint",
"en": "HTTPS endpoint"
},
"Description": {
"zh-cn": "走默认域名时填到应用的「HTTPS Endpoint」里(地址方式选「Bucket 子域名」);如果之后绑了自定义域名,Endpoint 要改成那个域名。",
"en": "With the default endpoint, paste this into the app's HTTPS endpoint field (addressing: virtual host). If you bind a custom domain later, the endpoint becomes that domain instead."
},
"Value": {
"Fn::Sub": "https://oss-${ALIYUN::Region}.aliyuncs.com"
}
},
"AccessKeyId": {
"Label": {
"zh-cn": "AccessKey ID",
"en": "AccessKey ID"
},
"Description": {
"zh-cn": "复制后填到应用的「AccessKey ID」里。",
"en": "Copy into the app's AccessKey ID field."
},
"Value": {
"Fn::GetAtt": [
"AccessKey",
"AccessKeyId"
]
}
},
"AccessKeySecret": {
"Label": {
"zh-cn": "AccessKey Secret",
"en": "AccessKey secret"
},
"Description": {
"zh-cn": "只在这里显示,复制后填进应用的 Keychain;不要粘贴到聊天、文档或代码里。",
"en": "Shown here only. Copy it into the app's Keychain; never paste it into a chat, document or repository."
},
"Value": {
"Fn::GetAtt": [
"AccessKey",
"AccessKeySecret"
]
}
}
},
"Metadata": {
"ALIYUN::ROS::Interface": {
"ParameterGroups": [
{
"Parameters": [
"BucketName"
],
"Label": {
"default": "OSS"
}
},
{
"Parameters": [
"RamUserName"
],
"Label": {
"default": "RAM"
}
}
],
"Outputs": [
"BucketName",
"RegionId",
"Endpoint",
"AccessKeyId",
"AccessKeySecret"
]
}
}
}
模板与手工路线建出的资源和权限完全相同。
控制台地址
阿里云国际站 https://www.alibabacloud.com/;中国站 https://www.aliyun.com/。
两边界面略有差别,按同义按钮操作即可。
官方来源
- 地域与 Endpoint 总表 (在新窗口打开)
- 通过自定义域名访问 OSS(内地域限制说明) (在新窗口打开)
抄下这四个值
这四个值要填进孤云的「添加存储」页:
| 抄下这个值 | 填进孤云的哪一格 |
|---|---|
桶名your-bucket-name(换成你的真实桶名) | 桶名称 |
| 地域 桶所在的内地域,例如 cn-beijing | 地域 |
| 端点 默认地址 https://oss-{地域}.aliyuncs.com,例如 https://oss-cn-beijing.aliyuncs.com | Endpoint |
| 密钥 RAM 子用户的 AccessKey ID 与 Secret | AccessKey ID 与 Secret |
怎么知道成了
- 孤云返回成功,能列出桶的根目录;空桶返回空列表也算成功。
- 再在桶里做一次上传、下载和删除,确认默认地址不只是读得通。
- 连接报错时,到常见错误对照排查。
回到孤云,点「测试连接并保存」。