处理特殊情况

在组织之间迁移 Google Cloud 项目时,某些资源和配置需要执行额外的步骤,以保持服务连续性并防止配置冲突。这些特殊情况包括没有组织资源的项目、共享 VPC 资源、自定义角色和跨项目服务账号。在迁移项目之前,请确保您对该项目、其父级资源和目标资源拥有所需的 Identity and Access Management (IAM) 权限。

迁移未与组织资源关联的项目

您可以将创建时没有关联组织资源的项目迁移到组织资源的层次结构中。不过,您无法撤消此流程。如需将项目还原为无组织,请与 Cloud Customer Care 联系以寻求帮助。

如需迁移未与组织资源关联的项目,您必须对该项目拥有 roles/resourcemanager.projectIamAdmin 角色。您还必须具有目标组织资源上的 roles/resourcemanager.projectCreator 角色。

如果您对父级组织资源没有 resourcemanager.organizations.get 权限,则您的项目可能不会按预期显示在 Google Cloud 控制台中的组织下。这可能会让人觉得该项目未与组织资源相关联。如需了解详情,请参阅限制用户的项目可见性。

如需确定项目是否与组织资源相关联,请执行以下操作:

gcloud

运行以下命令:

gcloud projects describe PROJECT_ID

将 PROJECT_ID 替换为要迁移的项目 ID。

如果输出中未显示 parent 资源,则确认该项目未与组织资源关联。

如果输出中显示了父级资源(文件夹或组织资源),则确认该项目与组织资源相关联。

迁移不与组织资源关联的项目,其过程与在组织资源之间迁移项目的过程类似,但不需要执行迁移计划中的所有步骤。如需将项目迁移到组织资源中,请按以下步骤操作:

  1. 验证项目将继承的政策对此项目的影响。

  2. 如有需要,请在目标组织资源中创建专用导入文件夹。

  3. 为项目和目标父级资源分配 Identity and Access Management 权限,如分配权限中所述。

  4. 确定是否需要更改结算账号。

然后,您可以使用以下方法之一执行迁移:

控制台

  1. 在 Google Cloud 控制台中打开 IAM 和管理 > 设置页面。

    打开“设置”页面

  2. 使用项目选择器选择您的项目(未选择任何组织的项目)。

  3. 在设置页面顶部,点击迁移。

  4. 在显示的对话框中,选择要将项目迁移到的组织资源,然后点击迁移。

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
    }

如果源项目中启用了 Cloud OS Login API,请向有权访问该项目的任何主账号分配 roles/compute.osLoginExternalUser 角色。

共享 VPC

在特定条件下,您可以迁移共享 VPC 项目。首先,在源组织资源中具有 roles/orgpolicy.policyAdmin 角色的用户必须在要导出的项目的父级上设置包含 constraints/resourcemanager.allowEnabledServicesForExport 限制条件的组织政策。此限制条件应将 SHARED_VPC 列为 allowed_value。

您无需在迁移前停用共享 VPC。但是,您必须先迁移共享 VPC 宿主项目,然后再迁移其所有服务项目。我们建议您匹配来源和目标组织资源之间的防火墙规则,以最大限度地减少潜在问题并避免停机。如果您在迁移其他服务项目时将某些服务项目留在源组织资源中,我们无法保证您的网络运行状况。

如果您迁移宿主项目,则可以将其移回源组织资源。宿主项目和服务项目可以位于不同组织中的时间没有确切的截止日期。但是,一旦您开始迁移服务项目,就必须先迁移所有服务项目,然后才能再次迁移宿主项目。

自定义 IAM 角色

自定义 Identity and Access Management 角色可在组织资源级层提供对资源访问权限的精细控制,但这些角色仅在创建它们的组织资源中有效。如果您将包含允许政策绑定的项目迁移到组织级层的自定义 IAM 角色,则迁移会失败。该错误说明目标组织资源中不存在该角色。

如需列出组织资源中的所有自定义 IAM 角色,请运行以下命令:

gcloud iam roles list --organization ORGANIZATION_ID

将 ORGANIZATION_ID 替换为组织资源的 ID。 如需了解详情,请参阅获取组织资源 ID。

如需了解组织资源中的自定义 Identity and Access Management 角色,请运行以下命令:

gcloud iam roles describe --organization ORGANIZATION_ID \
    ROLE_ID

替换以下内容:

  • ORGANIZATION_ID:组织资源的 ID
  • ROLE_ID:要描述的角色的名称

如需解决此错误,请为每个继承的组织级自定义角色创建等效的项目级自定义角色。然后,移除引用组织级层自定义角色的 IAM 角色绑定。

迁移项目后,您可以更新允许政策,以使用目标组织资源中的组织级自定义角色。

如需了解详情,请参阅创建和管理自定义角色。

存储桶锁定

借助 Cloud Storage 存储桶锁定功能,您可以为 Cloud Storage 存储桶配置数据保留政策。此政策用于控制对象必须保留多长时间。存储桶锁定功能使用安全锁进行保护,以防止项目被意外删除。

在迁移期间,保留政策和安全锁会与项目一起保留。安全锁不会阻止您迁移项目。

VPC Service Controls 安全边界

VPC Service Controls 通过在Google Cloud 服务周围设置基于项目的安全边界来降低数据渗漏风险。您无法迁移受 VPC Service Controls 安全边界保护的项目。

如需从安全边界中移除项目,请参阅管理服务边界。从服务边界中移除项目后,您可能需要几个小时或最多一天的时间才能迁移项目。

适用于服务账号的情境感知访问权限政策

情境感知访问权限可让用户根据网络、位置和时间等情境属性,为服务账号定义 Google Cloud 资源的访问权限政策。您无法迁移具有至少一个服务账号情境感知访问权限政策的项目。

如需删除服务账号的情境感知访问权限政策,请参阅管理访问权限绑定。

创建或删除政策时,请注意以下时间方面的注意事项:

  • 政策创建:新创建的情境感知访问权限政策可能不会立即阻止迁移。此传播延迟时间最长可持续到政策创建后 24 小时。
  • 政策删除:从项目中移除所有情境感知访问权限政策后,您可能需要等待几个小时才能迁移项目。

专用互连

我们建议将具有专用互连对象的项目和具有 VLAN 连接的项目一起迁移。包含这些对象的项目在组织资源之间迁移后仍可继续运行。但是,在组织资源拆分期间,您无法在组织资源之间创建新的 VLAN 连接。

对拆分项目所做的配置更改可能不会在组织资源中传播。我们建议您不要长时间拆分项目。

合作伙伴互连

迁移具有合作伙伴互连的项目没有任何特殊注意事项。使用合作伙伴互连迁移项目时,无需特别注意。

管理项目

管理项目是已启用应用的文件夹中的 Google Cloud 项目,用作所有以应用为中心的元数据的中央存储库。每个已启用应用的文件夹只能包含一个管理项目。 管理项目为应用库和 API 提供基础设施,包括结算、配额和访问权限控制。您无法迁移管理项目。

跨项目服务账号

迁移跨项目服务账号时,适用以下情况:

  • 如果您迁移的项目关联了跨项目服务账号,则该服务账号会继续在目标组织资源中运行。即使组织政策限制了网域,此规则也适用。
  • 如果您迁移的项目拥有其他项目使用的跨项目服务账号,则该服务账号会继续运行。但是,如果资源应用了网域限制组织政策,且该政策将资源限制在来源组织资源网域中,则您无法对这些资源使用此功能。

例如,假设 organizations/12345678901 中的 project-A 挂接了 serviceAccount-1。同一组织中的 project-B 和 project-C 也使用 serviceAccount-1。

project-C 具有仅允许 organizations/12345678901 网域的组织政策。

如果您在将 project-A 迁移到 organizations/45678901234 之前将 serviceAccount-1 添加到 project-C 的 IAM 绑定,则服务账号可以正常运行。

如果您将 project-A 迁移到 organizations/45678901234,然后尝试将 serviceAccount-1 添加到 project-C 的 IAM 绑定,则绑定会失败,因为它违反了网域限制。

支持请求

如果您迁移的项目有未解决的支持请求,请在迁移后通知 Cloud Customer Care。在 Cloud Customer Care 将元数据更新到新的组织资源之前,您无法查看这些支持请求。

如果您的项目使用内部 OAuth 权限请求页面,则只有目标组织资源成员才能在迁移后授权请求。此项更改最长可能需要 24 小时才能生效。在此之前,源组织资源成员仍然可以授权请求。

为确保来源成员不会失去访问权限,请考虑在目标组织资源中创建新用户,或更新 OAuth 权限请求页面配置:

  1. 将 OAuth 同意屏幕更新为外部而不是内部。

  2. 如果应用使用敏感数据,请针对敏感或受限范围申请应用验证。否则,用户会看到表明应用未经验证的屏幕。

Cloud OS Login API

如果源项目中启用了 Cloud OS Login API,请向有权访问该项目的任何主账号分配 roles/compute.osLoginExternalUser 角色。这样可以确保这些主账号不会失去对目标组织资源的访问权限。

虚拟机 (VM) 实例的共享预留

在共享预留中,创建预留的项目(所有者项目)或与之共享预留的任何项目(使用方项目)都可以通过创建虚拟机实例来使用预留。您只能与所有者项目所在组织中的项目共享预留。

迁移所有者或使用方项目时,会发生以下情况:

  • 如果您迁移所有者项目,Compute Engine 会删除该项目创建的所有预留。正在运行的虚拟机实例不受影响。
  • 如果您迁移使用方项目,该项目会停止使用之前组织中任何共享预留中的资源。

如需了解详情,请参阅共享预留的工作原理。

将服务账号附加到资源

对于大多数 Google Cloud 服务,您需要具备 iam.serviceAccounts.actAs 权限才能将服务账号关联到资源。不过,某些服务过去允许在没有明确模拟权限的情况下执行此操作。需要具备将服务账号关联到资源的权限中对此进行了说明。

如果您的来源组织资源具有此旧版行为,但目标组织资源没有,请向附加这些服务账号的用户授予 roles/iam.serviceAccountUser 角色。如需详细了解权限,请参阅服务账号验证角色。

如需检查您的组织资源是否具有旧版行为,请执行以下操作:

  1. 在 Google Cloud 控制台中,前往组织政策页面:

    转到“组织政策”页面

  2. 在资源选择器中,选择要检查的组织资源。

  3. 在过滤条件框中,输入 constraints/appengine.enforceServiceAccountActAsCheck。

  4. 如果该政策出现,则表示组织资源具有旧版行为。

  5. 针对以下每项限制重复执行第 3 步和第 4 步:

    • appengine.enforceServiceAccountActAsCheck
    • dataflow.enforceComputeDefaultServiceAccountCheck
    • dataproc.enforceComputeDefaultServiceAccountCheck
    • composer.enforceServiceAccountActAsCheck

如果出现上述任何限制条件,则表示您的组织资源使用的是旧版行为。如果两个组织资源都使用旧版行为,则无需执行任何操作,但请考虑强制执行该政策,以防止意外模拟。

迁移使用 BigQuery Sharing 的项目

如果您将使用 BigQuery Sharing 的项目迁移到其他组织资源,则可能会遇到错误。如需解决这些问题,请与 Cloud Customer Care 团队联系。

如果新组织的“共享”管理员页面中未显示上一个组织的数据交换资源,请使用 BigQuery Sharing API 更新某个字段(例如 description),以触发缓存刷新。

使用 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:要更新的字段,例如 description
  • UPDATE_DX_VALUE:更新后的值

Backup and DR Service

在将项目迁移到其他组织资源之前,请先停用 Backup and DR。考虑停用服务时的服务中断风险。 迁移完成后,重新启用 Backup and DR。

工作负载身份联合

借助工作负载身份联合,您可以授予本地或多云工作负载对 Google Cloud 资源的访问权限。工作负载身份联合池是项目级资源。

迁移项目时,在该项目中配置的工作负载身份池及其提供方会随项目一起迁移。您无需执行任何额外操作,即可让使用这些池的工作负载继续拥有访问权限。

标记

标记是附加到资源的键值对。在组织级层创建的标记不会迁移。

如果您的项目使用组织级标记进行政策绑定或限制,则您必须在目标组织资源中重新创建标记键和值,并将其重新附加到迁移的项目。

迁移具有继承的 Privileged Access Manager 授权的项目

在迁移项目之前,我们建议您撤消该项目的所有有效范围授权。限定范围的授权是在从文件夹或组织继承的使用权上创建的,然后限定到子项目。

如果您迁移的项目具有有效的作用域内授权,则 IAM 政策会移至新组织,但管理该政策的授权仍保留在之前的组织中。Privileged Access Manager 服务代理会失去修改新组织中的 IAM 政策的权限。因此,对该授权执行的任何撤消或撤回操作都会失败,并且请求者会保留访问权限,直到授权到期。

后续步骤