将 VPC 网络迁移到独立边界的示例

此示例展示了如何将已包含在服务边界内的现有宿主项目的 VPC 网络迁移到单独的边界。

在此示例中,宿主项目由两个 VPC 网络组成。两个服务项目托管着其 Cloud Storage 资源。

下图显示了迁移之前示例宿主项目的边界配置:

迁移前的宿主项目

架构图显示了以下组件:

  • 宿主项目。宿主项目包含两个 VPC 网络(VPC1VPC2)。
  • 服务项目。服务项目 service-project-1service-project-2 包含 Cloud Storage 存储桶,且受服务边界的保护。
  • 边界。服务边界 perimeter-1 可保护整个宿主项目和服务项目。VPC 网络 VPC1 中的虚拟机 VM1 和 VPC 网络 VPC2 中的虚拟机 VM2 可以访问 service-project-1service-project-2 中的资源。

下图显示了迁移后宿主项目的边界配置。

迁移后的宿主项目

架构图显示了以下组件:

  • Perimeter-1。此边界可保护 VPC 网络 VPC1 和服务项目 service-project-1。虚拟机 VM1 可以访问 service-project-1 中的 Cloud Storage 存储桶,但无法访问 service-project-2 中的 Cloud Storage 存储桶。
  • Perimeter-2。此边界可保护 VPC 网络 VPC2 和服务项目 service-project-2。虚拟机 VM2 可以访问 service-project-2 中的 Cloud Storage 存储桶,但无法访问 service-project-1 中的 Cloud Storage 存储桶。

在此迁移示例中,配置更改在试运行模式下进行,然后在强制执行试运行配置之前进行验证。此过程可确保 VPC 网络和资源得到保护,并且从 VPC1service-project-1 以及从 VPC2service-project-2 的生产流量不会中断。

此迁移过程包括以下步骤:

  • 获取 VPC 网络和边界详情
  • 设置试运行边界配置
  • 验证试运行设置
  • 实施试运行配置

获取 VPC 网络和边界详情

在此示例中,您必须先获取 VPC 网络和边界详情列表,然后才能开始迁移。

列出宿主项目中的 VPC 网络

以下命令可以列出 network-host-project 中的 VPC 网络:

    gcloud compute networks list --project=network-host-project
  

此示例生成以下输出:

    NAME  SUBNET_MODE  BGP_ROUTING_MODE  IPV4_RANGE  GATEWAY_IPV4
    vpc1  AUTO         REGIONAL
    vpc2  AUTO         REGIONAL
  

获取边界详情

以下命令可获取边界的详细信息:

    gcloud access-context-manager perimeters describe perimeter-1
  

此示例生成以下输出:

name: accessPolicies/<access policy number>/servicePerimeters/perimeter-1
status:
…
  resources:
  - projects/<network-host-project number>
  - projects/<service-project-1 number>
  - projects/<service-project-2 number>

<access policy number> 用于示例试运行模式命令。您还可以使用以下命令设置默认访问权限政策:

    gcloud alpha config set access_context_manager/policy<access policy number>
  

设置试运行配置

在此示例中,您将使用试运行命令更新边界 perimeter-1,以移除 network-host-projectservice-project-2 并添加 VPC1。然后,运行试运行命令以创建新边界 perimeter-2,并添加 service-project-2VPC2

更新试运行配置

以下命令会更新边界 perimeter-1 以移除 network-host-projectservice-project-2,并添加 VPC1

    gcloud access-context-manager perimeters dry-run update perimeter-1
     --remove-resources="projects/<network-host-project number>,projects/<service-project-2 number>"
     --add-resources="//compute.googleapis.com/projects/network-host-project/global/networks/vpc1"
     --policy=<access policy number>
  

在试运行模式下创建新边界

以下命令会创建边界 perimeter-2 并添加 service-project-2VPC1

    gcloud access-context-manager perimeters dry-run create perimeter-2
    --title=perimeter-2 --type="regular"
    --resources="projects/<service-project-2 number>,//compute.googleapis.com/projects/network-host-project/global/networks/vpc2"
    --restricted-services="storage.googleapis.com"
    --policy=<access policy number>
  

验证试运行配置

在此示例中,请运行以下命令,以确保在 VPC1service-project-1 以及 VPC2service-project-2 期间没有试运行错误:

如需列出 service-project-1 中的 Cloud Storage 存储桶,请登录 VPC1 中的 VM1 并运行以下命令:

    gsutil ls -p service-project-1
  

如需列出 service-project-2 中的 Cloud Storage 存储桶,请运行以下命令:

    gsutil ls -p service-project-2
  

该命令会成功运行,因为试运行配置不会影响生产流量。但是,对于从 VM1 访问 service-project-2network-host-project,审核日志中会显示以下试运行错误:

    egressViolations: [
    0: {
    servicePerimeter: "accessPolicies/<access policy number>/servicePerimeters/perimeter-1"
    source: "//compute.googleapis.com/projects/network-host-project/global/networks/VPC1"
    sourceType: "Network"
    targetResource: "projects/<service-project-2 number>"
    }
    ]
  

同样,从 VM2service-project-2 的 Cloud Storage 请求没有试运行错误,并且从 VM2service-project-1 的请求在 network-host-project 的审核日志中存在以下试运行错误:

    egressViolations: [
    0: {
    servicePerimeter: "accessPolicies/<access policy number>/servicePerimeters/perimeter-2"
    source: "//compute.googleapis.com/projects/network-host-project/global/networks/VPC2"
    sourceType: "Network"
    targetResource: "projects/<service-project-1 number>"
    }
    ]
  

实施试运行配置

您必须在一项原子事务中一次性强制执行所有试运行配置。

如需强制执行试运行配置,请运行以下命令:

    gcloud access-context-manager perimeters dry-run enforce-all --policy=<access policy number>
  

强制执行试运行配置后,请运行以下命令来描述 perimeter-1

    gcloud access-context-manager perimeters describe perimeter-1 --policy=<access policy number>
  

此示例会生成以下输出结果,其中移除了 network-host-projectservice-project-2,并将 VPC1 添加到了 perimeter-1

    name: accessPolicies/<access policy number>/servicePerimeters/perimeter-1
    status:
    …
    resources:
    - projects/<service-project-1 number>
    - //compute.googleapis.com/projects/<network-host-project>/global/networks/VPC1
  

运行以下命令以描述 perimeter-2

    gcloud access-context-manager perimeters describe perimeter-2 --policy=<access policy number>
  

此示例会生成以下输出,其中 service-project-2VPC2 已添加到 perimeter-2

    name: accessPolicies/<access policy number>/servicePerimeters/perimeter-2
    status:
    …
    resources:
    - projects/<service-project-2 number>
    - //compute.googleapis.com/projects/<network-host-project>/global/networks/VPC2
    title: perimeter-2