阿里雲 OSS:中國大陸 + 備案全套
這條路線代價最大:要自己準備網域、完成 ICP 備案(通常 1–20 個工作日),再給網域配一張 HTTPS 憑證;都到位後,剩下的主控台步驟大約 10 分鐘。
本文是孤雲的官方引導。主控台若顯示簡體,按鈕名稱請按同義對照。
分步操作
-
第 1 步
註冊並完成實名認證
- 沒有帳號就先註冊,並按主控台提示完成實名認證;已有帳號可跳過。
- 兩個入口,帳號不通用:國際站 www.alibabacloud.com(以英文介面為主、國際信用卡或 PayPal);中國站 www.aliyun.com(簡體中文、要實名認證、支付寶或微信支付一類)。註冊後就用同一個站點的主控台做完下面的步驟。
-
第 2 步
開通 OSS
- 在主控台搜尋「物件儲存 OSS」,進入產品頁點「立即開通」。
- 必須勾選協議再確認;開通本身不收費。
-
第 3 步
準備網域並完成備案
- 網域在境外註冊商(GoDaddy、Namecheap 等)要先轉入境內註冊商,才能提交備案。
- OSS 不提供備案服務碼:先買一台符合條件的內地伺服器(ECS 或輕量應用伺服器,包年包月且 ≥3 個月、帶公網頻寬),用它領服務碼再提交;審核通常 1–20 個工作日。
-
第 4 步
建立儲存桶
- 在「Bucket 列表」點「建立 Bucket」,填桶名(全域唯一,例如
your-bucket-name)並選一個內地地域。 - 讀寫權限選「私有」,「阻止公共存取」保持開啟。
- 在「Bucket 列表」點「建立 Bucket」,填桶名(全域唯一,例如
-
第 5 步
綁定自訂網域、憑證與 CNAME
- 開啟桶的「網域管理」→「綁定網域」,填你的網域,再上傳或選擇一張 HTTPS 憑證。
- 到網域目前的 DNS 服務商加一條 CNAME 記錄,指向 OSS 給出的外網存取網域(以主控台目前介面為準)。
-
第 6 步
建立 RAM 子使用者並取得金鑰
- 在「存取控制 RAM」→「使用者」→「建立使用者」,勾選「OpenAPI 呼叫存取」,不要勾選主控台登入。
- AccessKey ID 與 Secret 只顯示一次,立刻複製保存;不要用主帳號金鑰。
-
第 7 步
把最小權限策略掛給這個子使用者
- 在「權限管理 → 權限策略」新建自訂策略,切到腳本(JSON)編輯,貼上下面的策略並把
your-bucket-name換成真實桶名。 - 回到使用者頁面,把這條策略授權給剛才的子使用者。
- 在「權限管理 → 權限策略」新建自訂策略,切到腳本(JSON)編輯,貼上下面的策略並把
-
第 8 步
回孤雲填值並測試連線
- 在孤雲「新增儲存」裡選「阿里雲 OSS」,填桶名、地域、金鑰,端點填你的網域(例如
https://oss.example.com)。 - 位址方式選「自訂網域 CNAME」,再點「測試連線並儲存」。
- 在孤雲「新增儲存」裡選「阿里雲 OSS」,填桶名、地域、金鑰,端點填你的網域(例如
最小權限策略(必做)
在 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/ 前綴下寫入垃圾桶清單與裝置記錄。
其他情況(用不到可以跳過)
為什麼必須自訂網域
阿里雲自 2025-03-20 起,新開通 OSS 的帳號用預設外網網域存取內地桶的資料類 API(上傳、下載)會被拒絕,錯誤碼 PublicEndpointForbidden。
它限制的是網域,不是權限:桶設成私有、不對外提供任何連結,甚至改用 S3 相容網域,都一樣受限。
判斷依據是這個帳號的 OSS 開通時間,不是建立桶的時間;老帳號後來新建的桶不受限。
備案服務碼
- OSS 不在贈送備案服務碼的產品名單裡,不能單獨申請。
- 要給 OSS 用的網域備案,得先買一台符合條件的內地伺服器:ECS 或輕量應用伺服器,包年包月且時長 ≥3 個月、已購公網頻寬;免費試用與按量付費的 ECS 都不符合。
- 備案審核通常 1–20 個工作日。
- 主網域已備案時,給 OSS 單獨用一個子網域(例如
oss.example.com)即可,子網域不用再備案;網域在境外註冊商時先轉入境內註冊商。
ROS 一鍵範本(選用捷徑)
讓資源編排(ROS)一次建好私有桶、只授權該桶的 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 總表 (另開新視窗)
- PublicEndpointForbidden 錯誤說明 (另開新視窗)
抄下這四個值
它們要填進孤雲「新增儲存」頁對應的格子:
| 抄下這個值 | 填進孤雲的哪一格 |
|---|---|
| 桶名 主控台裡的桶名,全域唯一,例如 your-bucket-name。 | 桶名稱 |
| 地域 桶所在的內地域代碼,例如 cn-beijing。 | 地域 |
| 端點 你的網域,例如 https://oss.example.com;位址方式選「自訂網域 CNAME」。 | Endpoint |
| 金鑰 剛才那個 RAM 子使用者的 AccessKey ID 與 Secret。 | AccessKey ID 與 Secret |
怎麼知道成了
- 孤雲回報成功並列出桶的根目錄;空桶回傳空清單也算成功。
- 再上傳、下載、刪除一個小檔案,確認這個網域既能讀也能寫。
- 連線報錯時,到常見錯誤對照排查。
回到孤雲,點「測試連線並儲存」。