本文档介绍了如何在迁移项目时处理特殊情况。迁移项目时,请确保您已获得对项目、其父级资源和目标资源授予的必要 IAM 权限。
迁移未与组织资源关联的项目
您可以将尚未与组织资源关联的项目迁移到组织资源中。不过,您无法使用此过程将其更改回无组织。如果您的某个项目与您的组织资源关联,并且您希望将其还原为无组织,请联系您的支持代表寻求帮助。
您必须在目标组织资源上分配 roles/resourcemanager.projectCreator
角色。
如果您没有项目父级组织资源的 resourcemanager.organizations.get
权限,您的项目可能不会在 Google Cloud 控制台中的实际组织下按预期显示。这可能会使您看起来该项目与任何组织资源都不相关。如需了解详情,请参阅限制用户可以看到的项目。
如需确定项目是否与组织资源相关联,请执行以下操作:
gcloud
运行以下命令:
gcloud projects describe PROJECT_ID
将 PROJECT_ID 替换为您要迁移的项目的 ID。
如果输出中不显示父级资源,则表示该项目未与组织资源相关联。
如果输出中显示了父级资源(文件夹或组织资源),则表示该项目已与组织资源相关联。
迁移与组织资源无关的项目的过程与在组织资源之间迁移项目的过程类似,但并不需要迁移计划中涉及的所有步骤。如需将项目迁移到组织资源,您应该按以下步骤操作:
验证项目将继承的政策对此项目的影响。
必要的话,请在目标组织资源中创建一个专用导入文件夹。
按照分配权限中所述,为项目和目标父级资源分配 Identity and Access Management 权限。
确定是否需要更改结算账号。
然后,您就可以执行迁移。
控制台
如需将项目迁移到组织资源,请执行以下操作:
打开 Google Cloud 控制台中的 IAM 和管理 > 设置页面。
选择页面顶部的项目选择器。
从组织选择器中选择无组织。如果您未与任何组织资源建立关联,则系统不会显示组织选择器,因此您可以跳过此步骤。
选择您要迁移的项目。
点击页面顶部的迁移。
在组织下拉列表中,选择要将项目迁移到其中的组织资源。
gcloud
如需将项目迁移到组织资源,请运行以下命令:
gcloud beta projects move PROJECT_ID \ --organization ORGANIZATION_ID
其中:
- PROJECT_ID 是您要迁移到组织资源的项目的 ID。
- ORGANIZATION_ID 是您要将项目迁移到的组织资源的 ID。
API
您可以使用 Resource Manager API 将项目迁移到组织资源中,为此,只需将其 parent
字段设置为相应组织资源的组织资源 ID 即可。
如需将项目迁移到组织资源,请执行以下操作:
- 使用
projects.get()
方法获取project
对象。 - 将其
parent
字段设置为组织资源的组织资源 ID。 - 使用
projects.update()
方法更新project
对象。
parent
字段一经设置便无法更改。
以下代码段展示了上述步骤:
project = crm.projects().get(projectId=flags.projectId).execute()
project['parent'] = {
'type': 'organization',
'id': flags.organizationId
}
如果源项目中启用了 OS Login,您需要向有权访问该项目的所有主账号分配 roles/compute.osLoginExternalUser
角色。
共享 VPC
共享 VPC 项目可以根据特定条件进行迁移。首先,源组织资源中拥有 roles/orgpolicy.policyAdmin
角色的用户必须设置组织政策,其中包含要导出的项目的父级上的 constraints/resourcemanager.allowEnabledServicesForExport
限制条件。此限制条件应将 SHARED_VPC
列为 allowed_value。
您无需在迁移前停用共享 VPC。不过,必须先迁移共享 VPC 宿主项目,然后再迁移其所有服务项目。我们建议您在源位置和目标位置的组织资源之间匹配防火墙规则,这可以最大限度地减少潜在问题,并避免项目和网络在迁移期间出现任何停机时间。如果您在迁移其他服务项目时无限期地将一些服务项目留在源组织资源中,我们不能保证您的网络的健康。
如果您迁移宿主项目,则可以将其移回源组织资源。宿主项目和服务项目在不同组织中可以存在多长时间没有确切期限。但是,在开始迁移服务项目后,您必须先迁移所有项目,然后才能再次迁移宿主项目。
自定义 Identity and Access Management 角色
您可以在组织资源级层创建自定义 Identity and Access Management 角色,以便精细控制对资源的访问权限,但这些角色仅在创建它们的组织资源中有效。如果您尝试将包含用户的 IAM 政策绑定的项目迁移到组织资源级层的自定义 IAM 角色,则该迁移将会失败并显示失败的前提条件错误,说明相关角色不存在于目标组织资源中。
如需列出组织资源级层的所有自定义 IAM 角色,请运行以下 Google Cloud CLI 命令:
gcloud iam roles list --organization ORGANIZATION_ID
其中,ORGANIZATION_ID
是您要列出其角色的组织资源 ID。如需了解如何查找组织资源 ID,请参阅创建和管理组织资源。
如需了解组织资源中的自定义 Identity and Access Management 角色,请运行以下 Google Cloud CLI 命令:
gcloud iam roles describe --organization ORGANIZATION_ID \ ROLE_ID
其中:
ORGANIZATION_ID
是角色父级组织资源的组织资源 ID。ROLE_ID
是您要描述的角色的名称。
如要解决失败的前提条件错误,您应该为项目继承的每个组织级层自定义角色创建等效的项目级层自定义角色。然后,移除引用组织级层自定义角色的 IAM 角色绑定。
项目迁移后,您便可以更新 IAM 政策以使用目标组织资源中的组织层级自定义角色。
如需进一步了解自定义角色,请参阅创建和管理自定义角色。
存储分区锁定
借助 Cloud Storage 存储分区锁定,您可以在 Cloud Storage 存储分区中配置数据保留政策,来管理存储分区中对象必须保留多长时间。存储分区锁定是使用安全锁进行保护,防止意外删除项目。
在迁移过程中,保留政策和安全锁将保留在项目中,但您应该清楚是否迁移强制执行存储桶锁定的项目,并防止意外移动。
VPC Service Controls 安全边界
借助 VPC Service Controls,用户可以围绕其 Google Cloud 服务设置基于项目的安全边界,从而降低数据渗漏风险。您无法迁移 VPC Service Controls 安全边界保护的项目。
如需从安全边界中移除项目,请参阅管理服务边界。位于 VPC Service Controls 边界内的项目可能无法在组织资源之间迁移。此准则适用于在创建或更新边界后的最多一天内。从服务边界中移除项目后,可能需要几个小时的时间才能迁移项目。
专用互连
我们建议将包含专用互连对象的项目以及带有 VLAN 连接的项目一起迁移。具有专用互连对象或关联了这些对象的 VLAN 连接的项目在组织资源之间迁移后将继续正常运行。唯一的限制是,您无法在组织资源拆分之间创建新的 VLAN 连接。
对一个组织资源中附加了专用互连对象或关联了该对象的 VLAN 连接进行的项目配置更改可能不会传播到另一个组织资源。我们建议您尽可能不要让此类项目在组织资源之间拆分太长时间。
合作伙伴互连
使用合作伙伴互连迁移项目时,无需特别注意。
跨项目服务账号
在迁移跨项目服务账号时,适用以下情况:
- 如果您要迁移的项目附加了跨项目服务账号,那么该服务账号在目标组织资源中仍将有效。即使存在组织政策对附加了服务账号的项目限制网域,该项目也会继续工作。
- 如果您要迁移的项目拥有连接到源组织资源中其他项目的跨项目服务账号,则该服务账号将继续在目标组织资源中有效。但是,对于已应用网域限制组织政策的任何资源(限制资源属于源组织资源所在的网域),您将无法对其使用该服务账号。
例如,假设您在 organizations/12345678901
中拥有 project-A
。此项目附加了 serviceAccount-1
,用于将其设置为跨项目服务账号。project-B
和 project-C
也同样位于 organizations/12345678901
并且同样使用 serviceAccount-1
。
您已将一项具有网域限制条件的组织政策应用于 project-C
,从而仅允许它访问 organizations/12345678901.
的网域
如果将 serviceAccount-1
添加到 project-C
的 IAM 绑定中,然后将 project-A
迁移到 organizations/45678901234
,则该服务账号将正常运行。
如果您将 project-A
迁移到 organizations/45678901234
,然后尝试将 serviceAccount-1
添加到 project-C
的 IAM 绑定中,则绑定会因违反网域限制条件而失败。
支持案例
如果您迁移的项目具有待处理的支持请求,则需要与您的 Google 支持团队联系,以通知他们迁移已完成。具有待 Google 处理的支持请求的任何项目都将无法查看这些支持请求,除非 Google 支持团队更新请求元数据以指向新的组织资源。
OAuth 权限请求页面
如果您的项目配置为使用内部 OAuth 同意屏幕,并且您已将其迁移到另一个组织资源,则只有目标组织资源的成员才能授权请求。此行为最长可能需要 24 小时才能生效。在此之前,源组织资源的成员可以对请求进行授权。
以下步骤介绍了如何确保源组织资源的成员在迁移过程中不会失去访问权限。您可以考虑在目标组织资源中为组织资源成员创建新用户,这样您就无需更改 OAuth 同意屏幕配置。
为了避免源组织资源的成员失去访问权限,请执行以下操作:
将 OAuth 同意屏幕更新为外部而不是内部。
标记为内部且使用敏感数据的应用不需要申请应用验证。如果应用使用敏感数据,则当同意屏幕更新为外部时,源组织资源的用户将在将在授权屏幕之前看到未验证的应用程序屏幕。为了避免这种情况,请针对使用敏感或受限范围的应用进行应用验证。
OS Login
如果源项目中启用了 OS Login,您需要向有权访问该项目的所有主账号分配 roles/compute.osLoginExternalUser
角色。这样可确保这些主账号不会失去对目标组织资源的访问权限。
虚拟机 (VM) 实例的共享预留
在共享预留中,创建预留的项目(所有者项目)或与之共享预留的任何项目(使用方项目)都可以通过创建虚拟机实例来使用预留。您只能与所有者项目所在组织中的项目共享预留。
将所有者或使用方项目迁移到其他组织时,会发生以下情况:
- 如果您将所有者项目迁移到其他组织,Compute Engine 会删除所有者项目创建的所有预留。正在运行的虚拟机实例不受影响。
- 如果您将使用方项目迁移到其他组织,则使用方项目会停止使用之前组织中的任何共享预留中的资源。
如需了解详情,请参阅共享预留的工作原理。
将服务账号附加到资源
对于大多数 Google Cloud 服务,用户需要具有服务账号的 iam.serviceAccounts.actAs
权限才能将该服务账号关联到资源。不过,在过去,为了方便某些服务的使用,即使用户不具备模拟服务账号的权限,某些服务也允许用户将服务账号关联到资源。如需了解详情,请参阅需要具备将服务账号关联到资源的权限。
如果客户的源组织资源具有旧版行为(可以在没有正常角色授予的情况下附加服务账号),而目标组织资源则没有,则将 Service Account User 角色 (roles/iam.serviceAccountUser
) 授予将这些服务账号附加到资源的用户。如需了解将服务账号附加到资源所需的权限,请参阅服务账号身份验证角色。
如要查看您的组织资源是否有旧版行为,请执行以下操作:
在 Google Cloud 控制台中,转到组织政策页面。
从页面顶部的项目选择器中,选择要检查旧版状态的组织资源。
在组织政策列表顶部的过滤条件框中,输入
constraints/appengine.enforceServiceAccountActAsCheck
。如果
appengine.enforceServiceAccountActAsCheck
组织政策出现在列表中,则该组织资源将具有旧版行为。对以下组织政策限制条件重复步骤 3 和 4:
appengine.enforceServiceAccountActAsCheck
dataflow.enforceComputeDefaultServiceAccountCheck
dataproc.enforceComputeDefaultServiceAccountCheck
composer.enforceServiceAccountActAsCheck
如果出现任何组织政策限制条件,则您的组织资源将使用旧版行为。
如果源组织资源具有旧版行为,而目标组织没有,则授予上述角色。如果源组织资源和目标组织资源都具有旧版行为,则无需执行任何操作,但建议强制执行政策以防止意外模拟。
使用 Analytics Hub 迁移项目
如果您将使用 Analytics Hub 的项目迁移到其他组织资源,可能会遇到一些错误。如需解决任何错误,请与支持团队联系。
如果旧组织的数据交换资源未显示在新组织的 Analytics Hub 管理员页面中,请使用 Analytics Hub API 更新新组织中的数据交换。
使用 projects.locations.dataExchanges.patch
方法。
PATCH https://analyticshub.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/dataExchanges/DATA_EXCHANGE_ID?update_mask=UPDATE_DX_FIELD -d { UPDATE_DX_FIELD:UPDATE_DX_VALUE }
替换以下内容:
- PROJECT_ID 是项目的唯一标识符。
- LOCATION 是数据交换的位置。
- DATA_EXCHANGE_ID 是数据交换的 ID。
- UPDATE_DX_FIELD 是要更新的字段。
- UPDATE_DX_VALUE 是字段的更新值。
使用备份和灾难恢复服务迁移项目
您需要先停用备份和灾难恢复服务,然后才能将项目迁移到其他组织资源。目前,该服务已停用,您需要考虑服务中断的风险。迁移到新组织资源完成后,您应重新启用备份和灾难恢复服务。
后续步骤
如需了解如何执行迁移,请参阅执行迁移。