工程 5 分钟阅读

将Google Cloud项目完整进行跨组织迁移,结果1天就搞定这件事

甚至特意写好了逐个迁移GCS的脚本,才发现其实可以直接按项目整体迁移,来自开发者的含泪记录

Terisuke
Share this article:
Google Cloud Platform 标志

将Google Cloud项目完整进行跨组织迁移,结果1天就搞定这件事

你好,我是 Terisuke。

今天来聊聊我浪费了大把时间的一段经历。

因为公司要整理云环境,需要把原本在 [email protected] 管理的项目迁移到 [email protected] 的组织中。

一开始我还信心满满地想着:“好,那就用 terraform 和 gcloud 一点一点把 GCS bucket 和 Compute 实例迁过去吧!”

然而,我后来才知道,如果同样是 Google Cloud,其实有办法把整个项目完整搬移过去。

结果就是,我辛辛苦苦写好的 GCS 迁移脚本彻底打了水漂(哭)。

不过,为了不重蹈覆辙,我也顺便把这个方法整理下来作为备忘。

前提条件

这部分非常关键。首先,必须满足以下条件:

  • 在两个组织中都拥有所有者(Owner)权限
  • 要迁移的项目没有使用 VPC Service Controls 或 Shared VPC
  • 未使用 Marketplace 的付费服务(否则需要重新购买)

实际操作的迁移步骤

1. 确认组织 ID

首先确认源组织和目标组织的组织 ID。这在后面的配置中至关重要。

# 移行元組織にログイン
gcloud config set account [email protected]
gcloud organizations list
# DISPLAY_NAME     ID             DIRECTORY_CUSTOMER_ID
# example-a.com    123456789012   C02xxxxxx

# 移行先組織にログイン  
gcloud config set account [email protected]
gcloud organizations list
# DISPLAY_NAME     ID             DIRECTORY_CUSTOMER_ID
# example-b.com    987654321098   C02yyyyyy

2. 事前确认

在迁移前最好确认以下几项。要是报错之后才发现,那可就太麻烦了。

# VPC Service Controlsの確認(エラーが出ればOK)
gcloud access-context-manager perimeters list

# Shared VPCの確認({}が返ればOK)
gcloud compute shared-vpc get-host-project your-project-id

# 現在の請求アカウントをメモ
gcloud beta billing projects describe your-project-id

3. 配置迁移通道(Migration Corridor)

这是最关键的一步。为了能在组织间移动项目,需要开通“迁移通道”。简单来说,就是让两个组织建立互信关系的配置。

在源组织中,配置允许导出。

# export-policy.yamlを作成
cat > export-policy.yaml << EOF
name: organizations/123456789012/policies/resourcemanager.allowedExportDestinations
spec:
  rules:
    - values:
        allowedValues:
          - under:organizations/987654321098
EOF

# ポリシーを適用
gcloud org-policies set-policy export-policy.yaml

在目标组织中,配置允许导入。

# 移行先組織にログイン
gcloud config set account [email protected]

# import-policy.yamlを作成
cat > import-policy.yaml << EOF
name: organizations/987654321098/policies/resourcemanager.allowedImportSources
spec:
  rules:
    - values:
        allowedValues:
          - under:organizations/123456789012
EOF

# ポリシーを適用
gcloud org-policies set-policy import-policy.yaml

4. 授予权限

我在这里踩了坑。即便拥有组织所有者权限,也仍然需要项目级别的权限。我是在报错之后才注意到的,需要以下权限:

# 移行元アカウントに戻る
gcloud config set account [email protected]

# プロジェクトと組織に権限を付与
gcloud projects add-iam-policy-binding your-project-id \
    --member="user:[email protected]" \
    --role="roles/resourcemanager.projectMover"

gcloud organizations add-iam-policy-binding 123456789012 \
    --member="user:[email protected]" \
    --role="roles/resourcemanager.projectMover"

# 移行先組織にも権限を付与(組織をまたいだ権限付与)
gcloud config set account [email protected]
gcloud organizations add-iam-policy-binding 987654321098 \
    --member="user:[email protected]" \
    --role="roles/resourcemanager.projectCreator"

5. 正式迁移

准备就绪后,只需一条命令即可完成迁移。

# 移行元アカウントで実行
gcloud config set account [email protected]
gcloud beta projects move your-project-id --organization 987654321098

虽然会弹出警告,但输入 Y 继续即可。迁移还不到 1 分钟就完成了。速度快得让人猝不及防。

6. 更改结算账号

虽然项目已经移动过去了,但结算账号并没有改变。如果忘了这一步,账单就会一直寄给旧组织,麻烦可就大了。

# 移行先アカウントに切り替え
gcloud config set account [email protected]

# 新しい請求先に紐付け
gcloud beta billing accounts list
gcloud beta billing projects link your-project-id --billing-account NEW-BILLING-ID

这里也报了权限错误,因此需要给目标账号授予项目所有者权限。

# 移行元アカウントで実行
gcloud config set account [email protected]
gcloud projects add-iam-policy-binding your-project-id \
    --member="user:[email protected]" \
    --role="roles/owner"

7. 清理工作

堵上为了迁移而开辟的“安全漏洞”。这一步极其重要,要是忘了,两个组织之间就会一直处于可以随意移动项目的状态。

# 組織ポリシーを削除
gcloud config set account [email protected]
gcloud org-policies delete resourcemanager.allowedExportDestinations --organization=123456789012

gcloud config set account [email protected]
gcloud org-policies delete resourcemanager.allowedImportSources --organization=987654321098

# 組織間の権限も削除
gcloud organizations remove-iam-policy-binding 987654321098 \
    --member="user:[email protected]" \
    --role="roles/resourcemanager.projectCreator"

迁移后的注意事项

  • 继承的 IAM 策略将会丢失。在组织级别授予的权限需要重新配置
  • 预算提醒也需要重新设置。新的结算账号不会继承原有的预算设置
  • 服务运行确认必不可少。特别是与外部联动的服务,务必要仔细检查

结尾反转:彻底白费的 GCS 迁移脚本

实际上在刚开始动手迁移时,我还专门写了一个通过本地中转来迁移 GCS bucket 的脚本。

我甚至还实现了并行下载、进度显示和错误处理,当时还斗志昂扬地想着:“这下大量 bucket 也能轻松迁移了!”

然而,在得知可以直接整个项目搬移的那一瞬间,这一切全都白费了。

不过嘛,这也算学到了 gsutil 的并行处理以及用 Python 操作 GCS 的知识,而且在无法跨组织移动的情况下也能派上用场,我只能这样安慰自己:这也不算完全白费吧。

总结

只要拥有合适的权限并完成相应配置,Google Cloud 的项目迁移出乎意料地简单。不过,千万别忘了清理安全配置。

如果有其他人要做类似的迁移工作,建议一开始就去查查 gcloud beta projects move 的相关资料。重新发明轮子虽然有趣,但时间是有限的。

话虽如此,真想把写那个 GCS 迁移脚本耗费的 3 天时间拿回来啊。


感谢阅读。

如果你也有过类似的经历,或者正准备进行迁移工作,欢迎在评论区告诉我。咱们一起抱头痛哭吧哈哈。

想在贵公司推进本文的内容?

AI 受托开发的咨询,由 AI 接待「Cloudia」受理。

详细了解AI 基础设施与受托开发

Support this article

If this article was helpful, please support us with a tip. You can choose any amount.

Secure payment via Stripe
最后更新: 2026年10月23日

相关文章

阅读文章
工程

从Git历史中能看到什么、看不到什么。用Grift核算了4个OSS

本文分开写:按明示的规则,从git历史中能数出什么,数不出什么。对4个真实OSS按仓库做了核算。这不保证人的能力,也不保证记录是完整的。

#Grift #OSS +3
阅读文章
工程

如何在实现中坚守“不评分、不排名”。Grift CLI在下一版本中确定的5项条件

Grift CLI承诺不给出分数或排名。在2026年10月的核对中发现,虽然在注释中写明了并非排名,但表格仍是按提交次数从多到少排列的。面向发包方、SES销售以及工程师,我们将以通俗易懂的方式阐述对0.8版本设定的5项验收条件。

#Grift #OSS +3
阅读文章
工程

AI开发与定制开发的估算陷入个人经验化的原因——将估算依据转化为公司资产的方法

本文将解析定制开发的估算因人而异的原因,并讲解如何利用GitHub实际业绩、市场行情和工时明细,打造具有充分说服力的估算依据。同时介绍Grift的应用思路。

#見積もり #受託開発 +2