企业出海多云退出策略:供应商锁定评估、出口费测算与可移植性架构实战(2026)
多云不是"多买几家云",而是"随时能换一家云"。
- 本文的边界:退出工程与站点既有文章的分工
- 为什么 2026 年必须把"退出"当成一项架构能力
- 监管把"可切换"写进了法律:EU Data Act 的关键时间点
- 锁定的六个层面:你到底被绑在哪一层
- 可移植性评分模型:把"感觉被锁"变成可比较的数字
- 出口费(egress)全景:七种计费口径与三云对比
- 把"我们家的出口单价"测出来:三步取数实操
- 50TB 数据迁出的四条通道:一次完整的成本测算
多云不是"多买几家云",而是"随时能换一家云"。本文给出一套可执行的退出工程:先用六层锁定模型判断你究竟被绑在哪一层,再用可移植性评分把"感觉被锁"变成可比较的数字;接着把云账单里最容易被忽略的出口费(egress)拆成七种计费口径,用 VPC Flow Logs 与 Cost Explorer 实测你自己的真实单价;最后给出数据层、计算层、IaC 与身份层的可移植性改造清单、50TB 数据迁出的四条通道成本对比、一份 90 天退出演练剧本,以及合同里必须写死的退出条款。全文金额均标注口径,可直接改写为出海企业的云退出预案。
关键词: 云退出策略、供应商锁定、出口费、数据可携性、多云可移植性
本文的边界:退出工程与站点既有文章的分工
"退出"这个词很容易被写成"迁移"或"灾备"的换皮版。先把边界划清楚,后面每一节都不越界。
| 既有文章 | 它回答的问题 | 本文回答的问题 | 差异一句话 |
|---|---|---|---|
| 09-22《统一出网架构》 | 流量怎么出去(NAT/私网访问/审计) | 搬走时出去要花多少钱、怎么提前压价 | 那篇讲通道,这篇讲账单与后路 |
| 09-28《灾备编排与自动化切换》 | 故障时怎么切到另一朵云 | 商务/合规原因下怎么永久搬走 | 灾备是"临时借用",退出是"退租" |
| 09-10《对象存储与跨云数据湖》 | 跨云同步的技术实现 | 同步之外,元数据、锁、权限为什么搬不走 | 那篇保证数据一致,这篇保证数据可弃 |
| 08-12《GDPR 跨境传输》 | 数据出境是否合规 | 数据取回与删除是否可证明 | 一个管出去合法,一个管回来干净 |
| 08-08 / 08-14《成本优化 / FinOps》 | 怎么买得便宜 | 怎么走得便宜(含议价权) | 采购视角 vs 退出期权视角 |
| 10-19《软件资产与许可合规》 | 许可证是否合规 | 许可能否跟着搬(BYOL 与绑定条款) | 合规 vs 可移植 |
| 08-09《Terraform 多云 IaC》 | 怎么用一份工具管多云 | 哪些抽象真可移植、哪些是自欺 | 工具用法 vs 抽象边界 |
| 10-22《非人类身份治理》 | 机器身份如何收敛 | 身份体系如何不绑死在一家云 | 治理 vs 可迁移 |
一句话记住定位:本文不教你把业务搬上云,只教你在还不想搬的时候,先把搬走的能力留好。
一、为什么 2026 年必须把"退出"当成一项架构能力
过去谈供应商锁定(vendor lock-in),多数团队的反应是"我们不会换云"。这个判断在三种场景下会瞬间失效,而三种场景在 2026 年的出海企业里都不罕见。
场景一:出口费在账单里悄悄变成第二大项。 一家做跨境电商 SaaS 的客户,主站在新加坡,图片与视频走对象存储 + CDN。2026 年上半年做了一次内容治理,把 40TB 历史素材从对象存储直读改成"客户自助下载",当月账单里"数据传输"从 3% 涨到 19%——因为他们把 CDN 回源和公网直出混在一起,而直出的单价是回源的数倍。这类钱不是被"用"掉的,是被"漏"掉的。
场景二:合规要求"数据必须能取回并且可证明已删除"。 欧盟《数据法案》把云切换写成了法定义务(下一节展开),东南亚部分国家的金融监管也在合同层面要求"终止后 30 天内提供完整数据导出与删除证明"。这时候"我们用的是托管数据库,备份在厂商手里"就是一句无法举证的话。
场景三:商务谈判失去筹码。 续约前三个月,云厂商的客户经理会问一句"你们有迁移计划吗"。如果你的答案是"没有",那么三年期的折扣承诺(EDP/节省计划)就只能接受对方的报价结构。而如果你的答案是"我们每季度做一次退出演练,核心服务可在 6 周内迁到第二家云",同一份合同的议价空间完全不同——退出能力的第一受益人不是"真的要走的公司",而是"不想被涨价的公司"。
一个容易忽略的事实:锁定不是二值的,而是分层的。你可能在计算层几乎零锁定(全容器化、K8s 清单可移植),却在数据层被锁得死死的(PB 级对象存储 + 厂商专有元数据 + 出网费);也可能反过来,数据都能导出,但业务跑在十几个专有托管服务上,迁走等于重写。所以第一步永远不是"选一家备胎云",而是测量锁定深度。
二、监管把"可切换"写进了法律:EU Data Act 的关键时间点
对出海欧洲的企业来说,"能不能换云"已经从架构偏好升级为合规事项。欧盟《数据法案》(Data Act,Regulation (EU) 2023/2854)专设一章规范云服务切换,核心要求可以概括为三条:服务商必须提供切换所需的技术手段与信息、合同必须写明退出安排、切换费用必须逐步归零。
| 时间点 | 事项 | 对出海企业的直接影响 |
|---|---|---|
| 2024-01-11 | 《数据法案》生效 | 合规盘点时应把云合同纳入范围 |
| 2025-09-12 | 主要义务开始适用 | 新签/续签云合同必须含切换与退出条款 |
| 2027-01-12 | 云服务切换费(switching charges)不得再收取 | 跨云搬迁的"赎身费"在法律上消失,但仍不等于公网流量免费 |
需要特别强调第三条的适用范围:法律取消的是"切换费"这一类为阻碍迁移而设的费用,不是把公网数据传输(也就是我们日常说的出口流量费)变成免费。业务对外分发内容、CDN 回源、跨区复制这些"正常经营产生的流量",该收的还是收。这也是本文后面要用一整节讲出口费测算的原因——监管能帮你砍掉"赎身费",砍不掉"搬家时的油钱"。
实操上,这条法规给了出海企业一个非常好用的谈判抓手。续约谈判时可以直接要求对方在合同里补齐四件事:切换协助的人天承诺、数据导出的格式与时限、终止后的删除证明、以及出口单价的锁定期。这四项与法规精神一致,厂商的合规团队通常不会硬顶,而它们恰好是退出成本里最难用技术手段解决的部分。
三、锁定的六个层面:你到底被绑在哪一层
把锁定拆成六层,是因为每一层的迁移成本相差一个数量级,而应对手段完全不同。
graph TD
A[业务系统] --> B[商务层: 折扣承诺/最低消费/退出条款]
A --> C[运维层: 告警规则/仪表盘/值班SOP]
A --> D[身份层: IAM模型/长期密钥/SSO]
A --> E[网络层: IP/AS/DNS/专线/PrivateLink]
A --> F[计算层: 实例族/托管服务/专有API]
A --> G[数据层: 数据引力/专有格式/元数据]
G --> H{迁移成本最高}
F --> H
B --> I{迁移成本最低但最常被忽略}
用一张 ASCII 全景图看六层的"黏性梯度"更直观——越往下越难搬,越往右越容易被低估:
┌──────────────────────────────────────────────────────────────────────┐
│ 退出成本梯度(越下越贵) │
├──────────────────────────────────────────────────────────────────────┤
│ 商务层 │ 折扣锁定期 1–3 年 │ 提前终止违约金 │ 出口单价可谈 │
│ 运维层 │ 告警规则 200+ 条 │ 仪表盘 30 块 │ 值班手册 1 套 │
│ 身份层 │ IAM 策略 500+ 条 │ 长期 AK 若干 │ SSO 可联邦(较易) │
│ 网络层 │ 公网 IP / ASN │ 专线 2 条 │ PrivateLink 依赖 │
│ 计算层 │ 托管服务 12 个 │ 专有 API 若干 │ 容器化程度 70% │
│ 数据层 │ 对象 40TB+ │ 关系库 8 套 │ 专有元数据/对象锁 │
└──────────────────────────────────────────────────────────────────────┘
↑ 可谈判 ↑ 可重构 ↑ 可重建 ↑ 最难,必须提前设计
逐层看关键点:
| 层面 | 锁定的具体形态 | 迁移成本量级 | 降低锁定的第一动作 |
|---|---|---|---|
| 数据层 | PB 级存量、专有元数据、对象锁、快照链、备份保留策略 | 数周至数月,且与数据量线性相关 | 统一编码与压缩、元数据外置、备份格式标准化 |
| 计算层 | 托管服务替代品缺失(如专有 NoSQL、专有数仓)、实例族绑定 | 数月,需改写代码 | 把"专有能力"收敛到可替换的薄适配层 |
| 网络层 | 公网 IP、ASN、专线、PrivateLink 端点、DNS 托管 | 1–4 周 | IP 与证书资产化,DNS 用中立解析 |
| 身份层 | IAM 策略语法、角色信任模型、长期密钥 | 2–6 周 | 外部 IdP + OIDC 联邦,禁用长期密钥 |
| 运维层 | 告警规则、仪表盘、日志结构、值班流程 | 2–6 周 | 指标用 OpenTelemetry/Prometheus 语义 |
| 商务层 | 承诺消费、最低用量、迁移协助缺失 | 立刻(钱) | 合同四条款 + 出口单价锁定 |
一个反直觉的结论:真正让企业"走不了"的往往不是技术,而是商务层与数据层的组合。技术上能迁,但合同还剩 18 个月、提前终止要补足承诺差额、且数据搬出要付一笔可观的出口费——这三件事同时成立时,迁移在财务上就不成立。所以退出工程必须技术与商务并行,只做技术演练不做条款谈判,等于演练了一场不会获批的搬迁。
四、可移植性评分模型:把"感觉被锁"变成可比较的数字
锁定深度必须可度量,否则它永远只是架构评审会上的一句主观判断。下面这套模型只有 8 个维度、满分 100,任何架构师半天就能打完分,价值在于它能对齐"技术团队"与"财务/法务团队"的语言。
| 维度 | 权重 | 5 分(几乎无锁定) | 1 分(深度锁定) |
|---|---|---|---|
| 数据可导出性 | 20 | 全部为开放格式,元数据可自持 | 存在无法导出的专有格式或受管备份 |
| 运行时可替代性 | 20 | 100% 容器化,无专有 API | 核心逻辑依赖 3 个以上专有托管服务 |
| IaC 覆盖率 | 15 | 基础设施 95% 以上代码化 | 大量手工控制台操作,无状态清单 |
| 网络可重建性 | 10 | DNS/IP/证书全部中立可切换 | 依赖专线 + PrivateLink 硬绑定 |
| 身份可联邦 | 10 | 外部 IdP + OIDC 联邦,零长期密钥 | IAM 用户 + 长期 AK 遍地 |
| 观测可迁移性 | 5 | 指标语义标准(Prometheus/OTel) | 告警规则与厂商 API 强耦合 |
| 商务退出条款 | 10 | 有切换协助、导出时限、删除证明 | 承诺消费 + 高违约金 + 无协助条款 |
| 托管服务集中度(反向) | 10 | 托管服务少且均有开源替代 | 12 个以上托管服务无替代 |
打分方法:每个维度按 1–5 分评价,加权求和后除以 500 再乘 100。等级划分为:80 分以上"可退出",60–79 分"可退出但贵",40–59 分"退出需立项",40 分以下"事实上不可退出"。
一个真实的打分示例(某出海 SaaS,200 人规模,单云主站 + 少量第二云灾备):
| 维度 | 迁移前得分 | 加权 | 整改动作 | 迁移后得分 | 加权 |
|---|---|---|---|---|---|
| 数据可导出性 | 3 | 60 | 对象存储元数据外置、备份改逻辑导出 | 4 | 80 |
| 运行时可替代性 | 2 | 40 | 专有能力收敛到适配层 | 4 | 80 |
| IaC 覆盖率 | 3 | 45 | 补 Terraform 覆盖到 90% | 4 | 60 |
| 网络可重建性 | 3 | 30 | DNS 迁中立解析、证书自动化 | 4 | 40 |
| 身份可联邦 | 4 | 40 | 接入外部 IdP,清长期密钥 | 5 | 50 |
| 观测可迁移性 | 3 | 15 | 指标改 Prometheus 语义 | 4 | 20 |
| 商务退出条款 | 2 | 20 | 续约补四条款 | 3 | 30 |
| 托管服务集中度 | 2 | 20 | 12 个降到 7 个 | 3 | 30 |
| 合计 | 255 → 51 分 | 390 → 78 分 |
从 51 分到 78 分,用了大约 5 个人月,没有搬迁任何生产业务。这就是退出工程与迁移项目的本质区别:它的交付物不是"搬完了",而是"随时能搬,且搬得起"。
补一条评分纪律:同一朵云的不同业务线要分别打分。核心交易系统和内部 BI 报表的锁定深度天差地别,用公司级平均分会掩盖真正的风险点。建议按"业务域 × 云"出一个矩阵,把 40 分以下的格子列为季度评审项。
五、出口费(egress)全景:七种计费口径与三云对比
出口费之所以难管,是因为它不叫"出口费",而是散落在七八个不同的计费项里。先建立口径认知,再看单价。
| 计费口径 | 计费触发点 | 典型量级 | 是否常被漏算 |
|---|---|---|---|
| 公网出流量 | 实例/对象存储直出到互联网 | $0.05–0.12/GB(阶梯) | 低(账单可见) |
| 跨可用区流量 | 同地域不同 AZ 之间 | AWS 约 $0.01/GB 双向;阿里云同地域 VPC 内免费 | 高 |
| 跨地域流量 | 区域之间复制/同步 | 按两地区域对定价,常高于公网单价 | 高 |
| NAT 网关处理费 | 经 NAT 出网的每 GB | 约 $0.045/GB(另有小时费) | 高 |
| 日志与遥测外发 | 日志投递到托管日志服务 | 摄入约 $0.50/GB 量级 | 极高 |
| 备份与归档取回 | 归档层读取 + 提前删除 | 取回费 + 最低存储时长罚金 | 高 |
| CDN 回源 | 边缘节点回源站 | 按回源流量计,通常低于直出 | 中 |
第一张对比表只放公网出流量这一个口径,因为它最常被拿来横向比较,也最容易被误读(阶梯、地域、免费额度三者叠加)。
| 项目 | AWS(us-east-1 / 新加坡量级) | Azure(Zone 1 量级) | Google Cloud(Premium 层量级) | 阿里云国际 | 腾讯云国际 |
|---|---|---|---|---|---|
| 每月免费额度 | 100 GB | 100 GB | 无实质额度(免费层 1 GB/月) | 以官网当期活动为准 | 以官网当期活动为准 |
| 首 10TB 单价 | $0.09/GB | 约 $0.087/GB | 约 $0.12/GB(Standard 层约 $0.085) | 约 ¥0.25–0.80/GB | 约 ¥0.45–0.80/GB |
| 10–50TB 单价 | $0.085/GB | 阶梯递减 | 阶梯递减 | 阶梯递减 | 阶梯递减 |
| 50–150TB 单价 | $0.07/GB | 阶梯递减 | 阶梯递减 | 阶梯递减 | 阶梯递减 |
| 150TB 以上 | $0.05/GB | 阶梯递减 | 阶梯递减 | 阶梯递减 | 阶梯递减 |
| 是否区分"切换"与"分发" | 不区分 | 不区分 | 不区分 | 不区分 | 不区分 |
口径说明:上表为公开官网价目表的量级参照,用于判断数量级与阶梯形状,不作为报价依据。人民币列不做汇率换算后与美元列排名(汇率、地域、计费颗粒度三者叠加后排名无意义);实际单价以控制台结算页与商务合同为准。唯一可靠的数字永远是你自己账单里的那个数——下一节就讲怎么取。
第二张表是隐形成本,这部分往往比公网单价更能解释"为什么账单对不上":
| 隐形成本项 | AWS 口径 | 阿里云口径 | 治理建议 |
|---|---|---|---|
| 跨 AZ 流量 | 双向计费,按 GB | 同地域 VPC 内互通通常不计费 | 跨 AZ 调用改本地亲和;读副本按 AZ 就近 |
| 跨地域复制 | 复制流量 + 请求费双向计 | 跨地域复制按流量计 | 只复制热数据,冷数据走归档 |
| NAT 处理费 | 每 GB 处理费 + 小时费 | 按 CU/规格 + 流量 | 大流量走 VPC 端点,绕开 NAT |
| 日志摄入 | 按 GB 摄入 + 存储 | 按写入量 + 存储 | 采样 + 冷热分层,禁全量 debug |
| 归档取回 | 取回费 + 最低存储 90/180 天 | 类似,档位不同 | 归档只放"一年不动"的数据 |
| 镜像跨区拉取 | 跨区流量计 | 跨地域同步计 | 用 P2P 分发或就近构建(见 09-15) |
一条容易被忽略的对照结论:AWS 的跨可用区流量是明码收费的,而阿里云同地域 VPC 内跨可用区通常不计费。这意味着同样一套"多 AZ 高可用"架构,在两家云上的账单结构完全不同——在 AWS 上,跨 AZ 数据搬运本身就是一个需要架构优化的成本项;在阿里云上,这个成本项不成立,但跨地域会立刻变得很贵。做跨云成本对比时,把"多 AZ"当成免费项是最常见的错误之一。
六、把"我们家的出口单价"测出来:三步取数实操
云厂商公开单价只能告诉你数量级,你的真实单价必须从自己的账单与流量数据里算。三步法:账单定性 → 流量定量 → 单价比对。
第一步,从账单里找出所有"传输类"计费项。 AWS 用 Cost Explorer 按 usage type 分组,这一步的目的是确认"传输类"占账单的比例,以及是否存在你完全没意识到的计费项。
aws ce get-cost-and-usage \
--time-period Start=2026-09-01,End=2026-10-01 \
--granularity MONTHLY \
--metrics UsageQuantity UnblendedCost \
--group-by Type=DIMENSION,Key=USAGE_TYPE \
--filter '{"Dimensions":{"Key":"USAGE_TYPE","Values":["DataTransfer-Out-Bytes","DataTransfer-Regional-Bytes","DataTransfer-In-Bytes","NatGateway-Bytes","CloudFront-Out-Bytes"]}}'
阿里云与腾讯云用各自的账单 API 取同一口径的数据,注意账单周期用的是自然月,与 AWS 的起止时间语义不同:
aliyun bssopenapi QueryInstanceBill --BillingCycle 2026-09 --IsBillingItem true --PageSize 300
tccli billing DescribeBillDetail --Month 2026-09 --Limit 100
第二步,用流量日志确认"谁在往外发"。 账单告诉你花了多少,但不会告诉你哪个服务在发。VPC Flow Logs 投递到 S3 后用 Athena 查,按目标地址聚合字节数,排除内网网段即为公网出口量:
SELECT srcaddr, dstaddr, sum(bytes) AS total_bytes, count(*) AS flows
FROM vpc_flow_logs
WHERE action = 'ACCEPT'
AND dstaddr NOT LIKE '10.%'
AND dstaddr NOT LIKE '172.16.%'
AND dstaddr NOT LIKE '192.168.%'
GROUP BY srcaddr, dstaddr
ORDER BY total_bytes DESC
LIMIT 50;
按 srcaddr 汇总就能得到"哪台机器/哪个 ENI 是出口大户",再与资产清单里的业务标签对齐,出口费立刻从"一笔糊涂账"变成"按业务分摊的科目"。这一步的副产品非常值钱:它同时是 FinOps 分账和退出成本测算的输入。
第三步,算单价比对。 用"账单金额 ÷ 日志字节数"得到你的实际混合单价,再与官网阶梯价对比。两者差距超过 20%,通常意味着三种情况之一:跨 AZ 流量占比高、NAT 处理费混入、或者存在跨区复制。这三种都不是"厂商多收钱",而是架构选择的结果。
七、50TB 数据迁出的四条通道:一次完整的成本测算
假设要把 50TB 数据从云 A 搬到云 B(业务停机窗口 30 天),四条通道的成本差异会大到影响决策。以下算例全部用公开单价计算,仅含"传输"相关费用,不含人力。
| 通道 | 计算过程 | 一次性成本 | 耗时(1Gbps 有效带宽) | 适用条件 |
|---|---|---|---|---|
| 公网直出(对象存储) | 100GB 免费 + 10TB×$0.09 + 40TB×$0.085 | 约 $4,394 | 约 4.7 天 | 数据量 20TB 以内、一次性 |
| CDN 中转 | 10TB×$0.085 + 40TB×$0.080 | 约 $4,147 | 约 4.7 天 | 已有 CDN、需全球分发 |
| 专线 / 云互联 | 1Gbps 端口 + 跨境段月费(量级 $1,200–3,000/月) | 约 $1,200–3,000(可摊销到常态互联) | 约 4.7 天 | 长期双云互联、有稳定回传需求 |
| 物理设备寄送 | 80TB 设备一次作业费 + 物流报关(量级 $300–600) | 约 $300–600 | 2–6 周(含物流) | 数据量 100TB 以上、可接受离线 |
| 零出口中转(R2/B2 类) | 存储 $0.015/GB-月 或 $6/TB-月;出口 $0 | 约 $768 / $300(每月) | 数天(并行上传下载) | 一次性搬出、需控制成本 |
几个必须点明的口径细节,否则这张表会被误用:
- 免费额度只抵消一次。100GB 免费额度在 50TB 面前等于零,且不跨月累积。
- CDN 只省 5.6%($4,394 → $4,147)。对一次性批量拉取来说,CDN 的缓存机制几乎不起作用(每个对象只被读一次,缓存命中率为零),省下的只是阶梯单价差异。指望靠 CDN 解决迁出成本是常见误区。
- 专线的价值不在这一次。它的成本是"月费",如果只是搬一次 50TB,公网反而更便宜;只有当你有持续的双云互联需求(比如双活、异地备份)时,专线才在总账上占优——这也是为什么 09-04 的互联架构和本文的退出成本必须一起算。
- 物理设备在跨境场景有隐性成本:报关、数据出境合规审查、设备清关时间。技术团队常低估这一段(往往占总周期的 50% 以上)。
- 零出口中转是很多团队不知道的一条路:先把数据推到出口费为零的对象存储(Cloudflare R2、Backblaze B2 这类),再从那里拉进目标云——目标云的入向流量通常免费,于是总传输费接近零,只剩存储月费。代价是多一跳、需要校验完整性、且要评估数据暂存地的合规性(数据在第三家手里停留是否可接受)。50TB 场景下这条路径比公网直出省约 82%($4,394 → $768)。
算例说明:以上金额按公开官网单价与 1024 进制换算,未含请求费、商务折扣、税费与人力;仅用于比较通道之间的相对成本。实际报价以厂商结算页为准。
八、退出友好的七条设计原则
这一节是全文的"可执行部分"——七条原则都可以在不迁移的前提下落地,代价是每个服务上线时多花一点设计时间。
graph LR
A[开放格式] --> B[元数据外置]
B --> C[薄适配层]
C --> D[语义标准化]
D --> E[网络资产化]
E --> F[备份可读]
F --> G[退出预算]
G --> H[可退出的多云]
配套的参考架构如下,注意"薄适配层"只包三类接口,这是刻意的克制:
┌─────────────────────────── 应用层(容器化,无云厂商 SDK 直调)───────────────────────────┐
│ 业务服务 │ 定时任务 │ 异步消费者 │
└───────────────┬──────────────────────────────────────────────────────────────────────┘
│ 只允许调用三类接口
┌──────────┴──────────┬───────────────────────┬────────────────────────┐
▼ ▼ ▼ ▼
┌─────────────┐ ┌──────────────────┐ ┌──────────────────┐ ┌────────────────────┐
│ 对象读写接口 │ │ 消息发布/订阅接口 │ │ 身份令牌接口 │ │ 其余一律用开源中间件 │
│ put/get/head│ │ publish/subscribe│ │ OIDC/JWT 校验 │ │ Postgres/Redis/Kafka│
└──────┬──────┘ └────────┬─────────┘ └────────┬─────────┘ └────────────────────┘
│ │ │
┌───┴────┐ ┌───┴────┐ ┌────┴─────┐
│ S3 实现 │ │ SQS 实现│ │ 云端 IAM │
│ OSS 实现│ │ Kafka 实现│ │ 外部 IdP │
└────────┘ └────────┘ └──────────┘
↑ 适配层薄 = 每个实现 200–500 行 = 可测试、可替换
原则一:一切长期数据用开放格式落盘。 Parquet/ORC/JSONL/CSV 加标准压缩(zstd/gzip),避免把业务数据存进只有某家云能读的专有格式。这条原则的成本几乎为零,收益是"未来任何分析引擎都能直接读"。
原则二:元数据必须外置。 对象存储的标签、ACL、生命周期规则、对象锁状态,很多在跨云复制时不会跟着数据走。正确做法是把业务元数据(谁上传的、属于哪个租户、保留到什么时候)存在自己的关系库里,对象存储只当"字节桶"。这样迁移时你搬的是字节,元数据本来就在你手里。
原则三:抽象层要薄,且只包三类接口。 过度抽象是真实存在的反模式:把两家云的所有能力抽象成统一接口,结果接口复杂度爆炸、谁都不好用。实践中最值得抽象的就是对象读写、消息发布订阅、身份令牌校验这三类,其余一律直接用云厂商能力(配合原则七的预算兜底)。
原则四:可观测语义标准化。 指标用 Prometheus 语义、追踪用 OpenTelemetry、日志用结构化 JSON。这样告警规则和仪表盘在换云时基本可以照搬,运维层锁定从"2 个月"降到"2 周"。反过来,如果你用了厂商私有的告警 DSL 写了 200 条规则,这些规则在迁移时全部作废。
原则五:网络资产化。 域名解析用中立 DNS(不绑死在云厂商的托管区)、TLS 证书走 ACME 自动化、公网 IP 与 ASN 建台账。这三件事做完,入口切换就退化成"改一条 DNS 记录 + 等 TTL",而不是"重新申请 IP 段、等备案、改防火墙白名单"。
原则六:备份必须"可读",而不只是"可恢复"。 厂商原生备份(快照、托管备份库)能保证你在这家云内部恢复,但不能保证你能把它拿到别处。所以要额外保留一份逻辑备份:数据库用 pg_dump 的逻辑导出、对象存储用清单(inventory)+ 原始字节、配置用 Git。判断标准很简单——在一台不属于任何云厂商的机器上,能不能把这份备份恢复起来。
原则七:把退出成本写进年度预算。 设一个科目叫"可移植性预算",内容是:每年一次退出演练的人天 + 按当前数据量估算的出口费 + 适配层维护成本。金额不必大,但必须存在。有了这个科目,"要不要做退出演练"就从"要不要花钱"变成"这笔预算怎么花"。
九、数据层可移植性:不同存储的"搬得动"程度差别巨大
数据层是退出成本的主体,但"数据"不是一个东西。下面这张表按类型给出迁出手段与真实坑点,建议直接当作迁移可行性评估的检查表。
| 存储类型 | 锁定度 | 迁出手段 | 最容易翻车的点 |
|---|---|---|---|
| 对象存储(S3/OSS/COS) | 低–中 | rclone / 各厂商 CLI / 跨云复制 | 元数据、ACL、对象锁、版本不随数据走;海量小文件时请求费高于流量费 |
| 关系型数据库(RDS/Aurora/PolarDB) | 中 | 逻辑导出、逻辑复制、DTS/DMS | 序列值、扩展(如 pg_cron)、时区、字符集、权限与角色 |
| NoSQL(DynamoDB 类) | 高 | 导出到对象存储再导入自建 | 无对等托管替代品,索引与容量模型需重新设计 |
| 缓存(Redis) | 低 | RDB/AOF 迁移 + 预热 | 迁移后冷启动击穿,需要限流与预热脚本 |
| 搜索(ES/OpenSearch) | 中 | 快照(需版本兼容)、远端重建索引 | 快照跨大版本不兼容;analyzer 与 mapping 需重建 |
| 数据仓库(Redshift/MaxCompute 类) | 高 | 导出 Parquet 到对象存储,湖上重建 | 存储过程与调度逻辑无法搬,需重写 |
| 消息(Kafka) | 低–中 | MirrorMaker 跨集群复制 | 位点偏移不保证一致,消费端必须幂等 |
| 文件(NFS/SMB) | 中 | rsync / robocopy | POSIX 权限、ACL、硬链接、大小写敏感性 |
具体到对象存储这条最常见、量最大的路径,实操分"预搬 + 追平 + 切换"三段。预搬用 rclone 并行拉,追平用增量复制,切换窗口只做最后的小流量校验:
rclone copy oss:prod-assets s3:prod-assets \
--transfers 32 --checkers 64 --fast-list --checksum --progress \
--log-file /var/log/rclone-migrate.log
预搬完成后必须做完整性校验,不能只看"传输成功"。rclone 的 check 子命令会逐对象对比大小与哈希,输出差异清单:
rclone check oss:prod-assets s3:prod-assets --size-only=false --one-way --missing-on-dst /tmp/missing.txt
对于关系型数据库,逻辑导出比物理备份更"可迁移",因为物理备份往往绑定版本与页格式:
pg_dump --format=custom --no-owner --no-privileges -f /backup/appdb.dump appdb
pg_dumpall --globals-only -f /backup/globals.sql
两条来自真实迁移的经验:第一,--no-owner 和 --no-privileges 几乎必加,否则导入到新环境时会因为角色不存在而失败;第二,一定要单独导出"序列当前值"和"扩展列表",这两样最容易被漏,漏了的症状是"数据都在,但新插入的主键从 1 开始冲突"。
十、计算层可移植性:托管服务的"替代成本"对照表
计算层的锁定不体现在虚拟机上(虚拟机到处都一样),而是体现在托管服务上。判断方法:为每个托管服务找"替代品",并估计改写工作量。找不到替代品或改写量超过两周的,就是硬锁定。
| 能力 | AWS | 阿里云 | 腾讯云 | 可替代的开源/自建方案 | 改写工作量 |
|---|---|---|---|---|---|
| 虚拟机 | EC2 | ECS | CVM | KVM / Proxmox | 极低 |
| 托管 K8s | EKS | ACK | TKE | kubeadm / RKE2 | 低(清单可复用) |
| 无服务器函数 | Lambda | 函数计算 FC | SCF | Knative / OpenFaaS | 中(入口适配层重写) |
| 托管消息 | MSK / SQS | Kafka 版 / RocketMQ | CKafka / TDMQ | 自建 Kafka / RabbitMQ | 低–中 |
| 托管关系库 | RDS / Aurora | RDS / PolarDB | TencentDB / TDSQL-C | PostgreSQL / MySQL | 中(连接串 + 参数) |
| 文档数据库 | DocumentDB | MongoDB 版 | TencentDB for MongoDB | MongoDB 社区版 | 中 |
| 对象存储 | S3 | OSS | COS | MinIO / Ceph | 低(接口兼容度高) |
| 数据仓库 | Redshift | MaxCompute | 数据仓库 CDW | ClickHouse / Trino + Iceberg | 高(SQL 方言 + 调度) |
| 工作流编排 | Step Functions | Serverless 工作流 | 云工作流 | Temporal / Argo Workflows | 高(状态机需重画) |
| 专有 AI 服务 | Bedrock | 百炼 | TI 平台 | vLLM + 自建向量库 | 高 |
三个可操作结论:
第一,容器化是性价比最高的一步。 从"虚拟机 + 部署脚本"迁到"容器 + Helm 清单",锁定度立刻从"高"降到"低",而且这一步在单云内部就有独立收益(发布一致性、环境一致性、回滚速度)。这也是为什么几乎所有退出友好的架构都长成同一副样子——它们不是为退出设计的,是为可运维设计的,退出能力只是副产品。
第二,无服务器函数的锁定被系统性低估。 函数在各家的编程模型不同:入口签名、上下文对象、事件结构、超时上限、并发模型都不一样。但真正的锁定不在代码,在事件源——你的函数绑定了某家的对象存储事件通知、消息队列触发器、网关集成,这些配置在迁移时全部要重写。所以如果业务重度使用 FaaS,必须把"事件源清单"当成迁移评估的一等公民。
第三,专有 AI 服务是 2026 年的新增锁定源。 模型 API、向量库、托管 RAG 流水线,这三样的迁移成本远高于传统中间件,因为涉及效果回归而不只是接口替换。建议至少把"embedding 与向量库"这一层保持可替换(自建 pgvector 或开源向量库),把模型 API 收敛到一个 OpenAI 兼容的网关后面——这样切换供应商时只改网关配置。
十一、IaC 与身份层:哪些抽象是真的,哪些是自欺
11.1 Terraform 不是可移植性工具
一个流传很广的误解:用了 Terraform,基础设施就"可移植"了。事实是——Terraform 的 provider 是云厂商各自实现的,aws_vpc 和 alicloud_vpc 没有任何关系。Terraform 给你的是"基础设施可复现",不是"基础设施可移植"。
真正可移植的是模块的接口契约,而不是模块的实现。所以正确的分层是三层,而不是"一份代码管两朵云":
| 层次 | 内容 | 是否跨云复用 | 说明 |
|---|---|---|---|
| Bootstrap 层 | 账号、后端存储、密钥、OIDC 信任 | 否(每云一份) | 每朵云的手工引导步骤,代码化但不可复用 |
| 平台模块层 | VPC、K8s、数据库、可观测 | 接口可复用、实现分云 | 同一组变量名,两套 provider 实现 |
| 应用层 | 工作负载、服务、配置 | 是(Helm + Kustomize) | 完全不感知云厂商 |
接口化的写法很朴素:同一个模块名,两套实现目录,变量契约完全一致。
variable "network_cidr" {
type = string
description = "VPC CIDR block, identical semantics across providers"
}
variable "private_subnets" {
type = list(string)
description = "Private subnet CIDRs, one per AZ"
}
variable "tags" {
type = map(string)
description = "Common tags; provider-specific keys are added in implementation"
}
三个反模式要避开:一个 state 管理两朵云(一次 plan 要加载全部 provider、故障面翻倍)、过早抽象成最小公分母(为了统一接口放弃了两家云的关键能力)、模块里硬编码区域与账号(迁移时全量改代码,等于没抽象)。
11.2 身份层的可移植性来自"外部化"
身份是最容易被忽视、但迁移时最痛的一层。判断标准只有一条:你的用户与工作负载,能不能在换云之后继续用同一套身份登录?
| 做法 | 可移植性 | 迁移时的工作量 |
|---|---|---|
| 云厂商 IAM 用户 + 长期 AccessKey | 极低 | 全部重建,且密钥需轮换 |
| 云厂商 IAM 角色 + 实例/工作负载身份 | 中 | 角色信任策略需重写 |
| 外部 IdP(Keycloak/Entra)+ OIDC 联邦 | 高 | 只需在目标云建一次信任 |
| 外部 IdP + SPIFFE/SPIRE 工作负载身份 | 最高 | 平台层不动,只换下游凭证 |
落地上有一个硬性纪律:长期 AccessKey 数量应当是 0。这不只是安全要求(10-22 已经讲透了机器身份的收敛),也是退出要求——每一把长期密钥都意味着一个"迁移时必须逐一处理"的隐式依赖。当所有凭证都来自 OIDC 联邦和短期令牌时,身份层的迁移退化成"在目标云注册一次 OIDC Provider",半天就能完成。
十二、90 天退出演练:不搬业务,只搬"证明"
退出演练(Exit Drill)的目的不是真的迁走,而是产出一份可审计的证据:如果明天必须走,我们能在多久内走完、花多少钱、卡在哪。下面这套剧本在 90 天内完成,投入约 3–5 个人月,全部在非生产环境进行。
| 阶段 | 时间 | 做什么 | 交付物 | 验收标准 |
|---|---|---|---|---|
| 一、盘点与度量 | D1–D30 | 六层锁定打分、出口费基线、依赖清单 | 打分矩阵 + 月度出口费报表 + 依赖热力图 | 每个业务域都有分数,出口费可按业务分摊 |
| 二、影子迁移 | D31–D60 | 选 1 个非核心服务 + 1 个数据集,迁到第二朵云跑通 | 迁移 Runbook + IaC 差异清单 + 成本实测 | 端到端可用,成本与预估偏差 < 25% |
| 三、压测与回滚 | D61–D75 | 在第二云做容量验证,演练回滚 | 容量报告 + 回滚脚本 | 回滚在 4 小时内完成且数据一致 |
| 四、报告与谈判 | D76–D90 | 出退出预案,更新商务条款 | 退出预案 v1 + 合同补充条款 | 法务/财务/技术三方签字 |
第一阶段的打分矩阵建议按"业务域 × 云"出表,第二阶段的选题原则是选"有代表性但不致命"的服务——太边缘证明不了问题,太核心没人敢批。判断标准:该服务能覆盖你 60% 以上的技术栈类型(有状态、有队列、有外部依赖)即可。
演练的关键产出是三个数字:迁移窗口(多少天)、迁移成本(出口费 + 人天)、以及不可迁移项清单。这三个数字就是你在续约谈判桌上的全部筹码。经验上,一家 200 人规模的 SaaS 公司做完第一次演练,通常会发现两件事:真正的瓶颈不是数据量而是身份与网络,以及商务条款的缺失比技术债更贵。
配套的检查清单如下,共 12 项,建议逐项打勾而不是打分:
| 序号 | 检查项 | 通过标准 |
|---|---|---|
| 1 | 数据资产清单 | 每个数据集有 owner、体量、格式、保留期 |
| 2 | 开放格式覆盖 | 长期数据 100% 为开放格式 |
| 3 | 元数据外置 | 业务元数据存放在自有数据库 |
| 4 | 逻辑备份可用 | 在第三方机器上成功恢复过一次 |
| 5 | 容器化率 | 核心服务容器化率 ≥ 80% |
| 6 | 专有 API 清单 | 有清单、有替代方案、有负责人 |
| 7 | 适配层覆盖 | 对象/消息/身份三类接口已抽象 |
| 8 | IaC 覆盖率 | 基础设施 90% 以上代码化 |
| 9 | 长期密钥清零 | 长期 AccessKey 数量 = 0 |
| 10 | 网络资产台账 | DNS/证书/公网 IP 全部登记且可切换 |
| 11 | 出口费可分摊 | 传输费用可按业务域拆账 |
| 12 | 商务条款齐备 | 切换协助、导出时限、删除证明、单价锁定四项齐全 |
十三、商务层:合同里必须写死的十个条款
技术团队做完演练,最常见的结局是"报告很漂亮,但合同没改,明年照旧"。商务条款是退出能力的法律外壳,没有它,技术上的可迁移性在关键时刻用不出来。
| 条款 | 为什么重要 | 建议写成什么样 |
|---|---|---|
| 数据导出 | 决定"能不能拿到数据" | 终止或请求后 30 天内提供,格式为开放格式 + 原始字节 + 完整元数据清单 |
| 切换协助 | 决定"搬得动不动" | 约定免费协助人天(如 ≥10 人天)与响应时限(如 5 个工作日内) |
| 删除证明 | 决定"是否可举证" | 终止后 60 天内出具书面删除证明,明确覆盖主副本、备份、衍生副本 |
| 出口单价锁定 | 决定"搬的时候贵不贵" | 合同期内单价锁定,年度涨幅上限(如不超过 5%) |
| 承诺消费处理 | 决定"走的时候赔不赔" | 明确未使用承诺额度的处理方式,争取按比例豁免或可转移 |
| 提前终止 | 决定"退出的违约金" | 设违约金上限(如剩余月费 × 3),而非"补足全部剩余承诺" |
| 过渡期 | 决定"走得从从容容吗" | 终止后保留访问权限 ≥90 天,用于数据导出与验证 |
| 服务信用 | 决定"SLA 违约有没有补偿" | 明确 credit 计算方式与申领流程 |
| 子处理者清单 | 决定"合规链条是否完整" | 变更子处理者须提前通知,并有异议权 |
| 价格保护 | 决定"会不会被新品背刺" | 同等规格新品降价时自动适用,或给予最惠客户待遇 |
这十条里,"过渡期"与"删除证明"是最容易被忽略、又最难事后补救的两条。过渡期不够,你会在最后两周疯狂赶工,出口费还因为带宽打满而更高;删除证明缺失,则面对监管问询时只能"口头保证",而这在审计场景下等于没说。
十四、低出口的中立方案:能省钱,但不能替代主云
既然出口费是退出成本的大头,自然会有人问"那我干脆不用这几家云不就行了"。中立存储确实便宜,但要看清它们能干什么、不能干什么。
| 方案 | 存储单价量级 | 出口费 | 适合放什么 | 不能替代什么 |
|---|---|---|---|---|
| Cloudflare R2 | $0.015/GB-月 | $0 | 静态资源、备份副本、迁移中转 | 不能跑计算,无完整 VPC 语义 |
| Backblaze B2 | $6/TB-月 | 存储量 3 倍以内免费 | 归档备份、冷数据 | 延迟与生态弱,不适合热路径 |
| Wasabi | 约 $7/TB-月 | 有免费额度,超量计费 | 备份目标端 | 需注意最短存储期条款 |
| 自建 MinIO(中立机房) | 硬件 + 机房 + 人力 | 取决于带宽合同 | 大体量冷数据、可控归档 | 运维责任全在自己,SLA 自担 |
选型上有一条务实建议:把"备份副本"和"迁移中转"放到零出口的对象存储,把"业务热数据"留在主云。这样做的收益有两层:日常备份的恢复成本接近于零,且一旦要迁移,数据已经在"出口免费"的地方,只需再从那里拉进目标云。50TB 的场景下,这条路径的一次性传输成本大约是公网直出的 18%(见第八节算例)。
但必须写清一个反面:中立存储不能替代主云。它没有完整的网络隔离语义、没有托管数据库、没有 IAM 体系、也没有合规认证的覆盖面。把它当成"数据保险箱"可以,当成"第二朵云"不行——这正是本文反复强调"分层"的原因,不同层用不同的成本结构,而不是找一个万能便宜方案。
总结
把这篇的结论压缩成五句话:
第一,锁定是分层的,数据层与商务层最贵,计算层与身份层最容易被高估或低估,先测量再投入。
第二,可移植性可以打分,8 个维度、满分 100,比"感觉被锁"更能驱动决策,也更能对齐技术与财务的语言。
第三,出口费必须自己测,账单定性、流量定量、单价比对三步,任何人都能在一天内拿到自家真实单价;隐形成本(跨 AZ、NAT、日志、归档取回)往往比公网单价更能解释账单。
第四,退出能力的核心是"薄适配层 + 开放格式 + 外部身份",而不是多云部署;过度抽象与"一份 Terraform 管两朵云"都是自欺。
第五,90 天演练的产出是三个数字——迁移窗口、迁移成本、不可迁移项清单。它们不是给技术看的,是给续约谈判桌看的。
延伸:把退出能力变成一项常态预算
最后补一个落地建议。退出工程最容易死在"做完一次就忘了",所以它必须被制度化:把"可移植性评分"放进架构评审模板(新服务上线必须打分)、把"出口费"放进 FinOps 月度报表(按业务域分摊)、把"退出演练"放进年度预算(每年一次,3–5 人月)、把"退出四条款"放进采购模板(新签合同必须包含)。
四件事都做完,退出能力就从"项目"变成了"能力"——它不再依赖某个人的记忆,而是依赖流程。这也是一家企业从"用云"走向"管云"的分界线。
🚀 企业出海需要云架构咨询?通过 7.chengzicloud.cloud 联系我们,获取专属方案。我们提供多云架构设计、成本优化、退出与迁移预案、合规审计支持。
相关阅读
- 企业出海多云统一出网架构:NAT 网关 + 私网访问 + 出口审计 — 出口流量怎么走、怎么审,是本文成本测算的架构前提
- 企业出海多云灾备编排与自动化切换 — 临时切换与永久退出的分工与差异
- 企业出海多云对象存储架构与跨云数据湖 — 跨云数据搬运的技术底座与元数据陷阱
- OpenTofu / Terraform 多云 IaC 实战指南 — 本文第十一节的 IaC 分层与模块接口设计
- 企业出海多云软件资产与许可合规治理 — 许可证能否跟着业务一起搬(BYOL 与绑定条款)
- GDPR 数据跨境传输技术落地指南 — 迁出时的数据出境合规与加密链路
- 企业出海多云数据主权与主权云架构 — 监管强制迁出场景下的目标架构选择
本文由 7.chengzicloud.cloud 提供,点击访问首页了解更多
常见问题(FAQ)
Q1:出口费和"退出成本"是一回事吗?
不是。出口费只是退出成本里最容易被看见的一项。完整的退出成本包括四块:出口流量费、双跑期成本(迁移期间两套环境同时付费)、改造人力(专有 API 重写、数据模型调整)、以及商务成本(提前终止违约金、未用承诺额度作废)。经验比例上,出口费通常只占总退出成本的 15%–30%,人力往往才是最大项。所以只盯着"每 GB 多少钱"做优化,收益有限。
Q2:做了多云部署是不是就没有锁定了?
不一定,而且经常相反。把同一套系统在两家云上各跑一份,如果没有做适配层与数据格式的标准化,你得到的是两套独立的锁定,运维成本翻倍、议价能力却没有提升。真正降低锁定的是"可迁移性"(开放格式、薄适配层、外部身份),而不是"部署数量"。多云部署只有在共享同一套应用层制品与数据标准时,才转化成退出能力。
Q3:2027 年 EU Data Act 的切换费归零后,出口费就没有了吗?
没有。法规取消的是"为阻碍切换而收取的切换费",不等于把公网数据传输变成免费。业务对外的内容分发、CDN 回源、跨区复制这些正常经营产生的流量,仍然按各家价目表计费。可以期待的改善是:切换场景下的数据导出成本会显著下降,且厂商必须提供标准化的导出手段——这让"退出"从"付钱赎身"变成"按流量付费搬家"。
Q4:Terraform 用得越多,可移植性就越好吗?
不是。Terraform 的 provider 由各厂商实现,aws_vpc 与 alicloud_vpc 之间没有任何继承或兼容关系。Terraform 提升的是可复现性(同一个仓库能重建出同样的环境),而可移植性来自模块接口契约的统一。判断方法很简单:把 provider 换掉,你的模块变量需要改几行?如果超过三行,说明抽象是假的。
Q5:数据引力(data gravity)怎么量化?
用一个可算的近似公式:迁移阻力 ≈ 数据量 × 单位出口成本 + 依赖该数据的服务数 × 改造人天。前半部分是钱,后半部分是时间。举例:50TB 数据、出口 $0.086/GB 混合单价、依赖服务 12 个、每个平均 5 人天改造——迁移阻力约为 4.4 千美元 + 60 人天。把这两个数字写在架构文档里,比写"数据量大迁移困难"有用得多,因为它可以被预算、被排期、被谈判。
Q6:多大规模的公司才值得做退出演练?
与技术规模关系不大,与云支出占比关系很大。一个可用的门槛:年云支出超过 50 万美元,或单一云占比超过 80%,就值得做第一次演练(3–5 人月)。低于这个门槛,做一份"可移植性打分 + 出口费基线"(约 5 人天)即可,不必启动完整的影子迁移。反过来说,即使云支出不高,如果业务涉及强监管行业(金融、医疗)或跨境数据,演练的价值会显著上升。
Q7:寄硬盘做离线迁移,真的比公网快吗?
取决于数据量和带宽,而不是"离线一定快"。判断标准是传输时间是否超过物流时间:1Gbps 有效带宽下,50TB 约需 4.7 天,而寄送设备从打包到上架通常 2–6 周(跨境还要加报关与合规审查)——这个量级下公网更快。当数据量达到数百 TB 以上、或跨境带宽受限(比如只有 100Mbps 的国际链路)时,离线才明显占优。另外别忘了离线方案有一个隐性成本:数据在物理介质上运输本身可能构成数据出境,需要提前过合规。
Q8:怎么向 CFO 证明"锁定风险"值多少钱?
用三块可折算的钱,不要用"战略风险"这种词。第一块是出口费溢价:当前出口费与市场中位单价的差额 × 年出网量。第二块是议价权折损:对比"有退出能力"与"无退出能力"两种情况下同类合同的折扣差异(通常 5%–15%)。第三块是紧急迁移的溢价成本:如果被迫在 90 天内迁走,人天成本约为计划迁移的 2–3 倍。三块相加就是"不做退出工程"的年化成本,再与演练投入(3–5 人月)对比,投资回报率通常很直观。