处理特殊情况

本主题介绍了如何处理与迁移项目相关的特殊情况。

迁移没有组织资源的项目

您可以将未与组织资源关联的项目迁移到组织资源。但是,您无法通过此过程将其更改回无组织。如果您的项目与组织资源相关联,并且您希望将其还原为无组织状态,请与您的支持代表联系以获取帮助。

如果您对项目的父级组织资源没有 resourcemanager.organizations.get 权限,则您的项目可能无法在实际组织下按预期反映。如需了解详情,请参阅限制用户的项目公开范围

迁移未与组织资源关联的项目的流程类似于在组织资源之间迁移项目的流程,但不要求迁移计划中涉及的所有步骤。如需将项目迁移到组织资源,您应该按照以下步骤操作:

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

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

  3. 按照分配权限所述,分配对项目和目标父级的 Identity and Access Management 权限。

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

然后,您就可以执行迁移。

控制台

如需将项目迁移到组织资源,请执行以下操作:

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

    打开“设置”页面

  2. 选择页面顶部的项目选择器

  3. 组织选择器中选择无组织。如果您未与任何组织资源关联,则不会显示组织选择器,您可以跳过此步骤。

  4. 选择您要迁移的项目。

    项目选择器的屏幕截图

  5. 点击页面顶部的迁移

  6. 组织下拉列表中,选择要将项目迁移到的组织资源。

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 角色

您可以在组织资源层级创建 Custom 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-Bproject-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 同意屏幕,并且您将它迁移到另一个组织资源,则只有目标组织资源的成员才能为请求授权。此行为最多可能需要 24 小时才能生效。在此之前,源组织资源的成员可以向请求授权。

以下步骤说明了如何确保源组织资源的成员在迁移过程中不会失去访问权限。请考虑在目标组织资源中为组织资源成员创建新用户,这样您就无需更改 OAuth 同意屏幕配置。

为避免源组织资源的成员失去访问权限,请执行以下操作:

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

  2. 标记为内部并使用敏感数据的应用无需申请应用验证。如果应用使用敏感数据,那么当同意屏幕更新为外部时,来源组织资源的用户将在授权屏幕之前看到未验证的应用屏幕。为了避免这种情况,请针对使用敏感或受限范围的应用进行应用验证

OS Login

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

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

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

将所有者或使用方项目迁移到其他组织时,会发生以下情况:

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

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

将服务账号附加到资源

对于大多数 Google Cloud 服务,用户需要对服务帐号拥有 iam.serviceAccounts.actAs 权限,才能将该服务帐号关联到资源。但过去,为了简化新手入门流程,某些服务允许用户将服务帐号附加到资源,即使用户无权模拟服务帐号也是如此。如需了解将服务帐号附加到资源的权限,请参阅要求将服务帐号附加到资源一文。

如果客户的源组织资源具有旧版行为(无需正常角色授予即可关联服务帐号),而目标组织资源不具有旧版行为,请将 Service Account User 角色 (roles/iam.serviceAccountUser) 授予将这些服务帐号关联到资源的用户。如需了解将服务帐号附加到资源所需的权限,请参阅服务帐号身份验证的角色

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

  1. 在 Google Cloud 控制台中,转到组织政策页面。

    转到“组织政策”页面

  2. 从页面顶部的项目选择器中,选择要检查其旧版状态的组织资源。

  3. 在组织政策列表顶部的过滤条件框中,输入 constraints/appengine.enforceServiceAccountActAsCheck

  4. 如果 appengine.enforceServiceAccountActAsCheck 组织政策显示在列表中,则该组织资源具有旧版行为。

  5. 针对以下每个组织政策限制条件重复执行第 3 步和第 4 步:

    • appengine.enforceServiceAccountActAsCheck
    • dataflow.enforceComputeDefaultServiceAccountCheck
    • dataproc.enforceComputeDefaultServiceAccountCheck
    • composer.enforceServiceAccountActAsCheck
  6. 如果出现这些组织政策限制条件中的任何一项,您的组织资源会使用旧版行为。

如果源组织资源具有旧版行为,而目标位置不具有旧版行为,请授予上述角色。如果源组织资源和目标组织资源都具有旧版行为,则无需执行任何操作,但请考虑强制执行该政策以防止意外的模拟。

使用 Analytics Hub 迁移项目

如果您将使用 Analytics Hub 的项目迁移到其他组织资源,可能会遇到一些错误。如需解决任何错误,请与支持团队联系

使用备份和灾难恢复服务迁移项目

在将项目迁移到其他组织资源之前,您需要停用备份和灾难恢复服务。此时服务停用时,您需要考虑服务中断风险。完成迁移到新组织资源的操作后,您应重新启用备份和灾难恢复服务。

后续步骤

如需了解如何执行迁移,请参阅执行迁移