【问题标题】:Can not create gcp instance from machine image in a different project无法从不同项目中的机器映像创建 gcp 实例
【发布时间】:2021-04-27 12:03:30
【问题描述】:

我有两个 GCP 项目,projectA 和 projectB。在 projectB 中,我有一个机器映像 B-machine-image。我的目标是在 projectA 中制作机器映像的副本。但是由于没有办法直接将projectB中的机器镜像复制到projectA,所以我想我可以使用projectB中的机器镜像在projectA中创建一个实例,然后使用projectA中的新实例在本地创建机器镜像。

我为此找到了一个谷歌文档:https://cloud.google.com/compute/docs/machine-images/create-instance-from-machine-image 并按照步骤首先将 projectA 管理员角色中的服务帐户授予 projectB 中的机器映像 B-machine-image,然后运行命令使实例如下:

gcloud beta 计算实例创建 my-new-instance --project=projectA --zone us-central1-b --source-machine-image projects/projectB/global/machineImages/B-machine-image --service-帐号 123456789000-compute@developer.gserviceaccount.com

我得到了错误:

错误:(gcloud.beta.compute.instances.create)无法获取资源:

  • 字段“resource.networkInterfaces[0].network”的值无效:“projects/123456789000/global/networks/projectB-vpc”。找不到引用的网络资源。

在 projectB 中,我确实有一个名为 projectB-vpc 的 VPC。

我不明白的是,在“projects/123456789000/global/networks/projectB-vpc”中,123456789000 似乎是针对 projectA 的,因为它是 projectA 服务帐户的电子邮件的一部分,而 projectB-vpc 是针对 projectB 的。在我的命令中我有“projects/projectB/....”,为什么命令将“projectB”替换为 123456789000?

知道我哪里做错了吗?

谢谢, 菲利普

【问题讨论】:

  • 机器映像与常规计算引擎映像不同。机器映像已针对特定 VM 环境进行了预配置。我建议您创建一个常规的计算引擎实例映像。对于此问题,请尝试添加命令行选项 --network=default--subnet=default 或替换为您的实际网络名称。
  • 注意:您可能必须重复此过程并为存储在机器映像中的每个配置值指定覆盖。

标签: google-cloud-platform


【解决方案1】:

根据 GCP documentation,您可以直接使用来自不同项目的机器映像创建 VM。请注意,当您使用来自不同项目的机器映像创建 VM 时,您可能无法访问附加到该源项目的服务帐户。在我的复制步骤中,我遵循了以下步骤:

  1. 创建了多区域机器映像
2. gcloud beta compute machine-images add-iam-policy-binding rhel-machine-image \
    --project=source-project \
    --member='serviceAccount:Source-compute@developer.gserviceaccount.com' \
    --role='roles/compute.admin'
  1. 将源项目服务帐户作为 iam.serviceAccountUser 添加到目标项目
4. gcloud beta compute instances create machine-image-vm     --project=destination-project --zone us-central1-a --source-machine-image projects/source-project/global/machineImages/rhel-machine-image --service-account Destination-compute@developer.gserviceaccount.com

在最后一步中,我使用了目标项目 Compute Engine 默认服务帐户。

Created [https://www.googleapis.com/compute/beta/projects/destination-project/zones/us-central1-a/instances/machine-image-vm].
NAME              ZONE           MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP     STATUS
machine-image-vm  us-central1-a  e2-medium                  x0.xxx.0.18  35.2x3.18x.x59  RUNNING

【讨论】:

  • 谢谢大家的建议。我发现我遇到的问题就像上面 John 所说的那样,我需要在命令中专门给出 --network 和 --subnet,因为机器映像具有来自原始项目的网络和子网信息,它们的名称不同于目标项目中的那些。
  • 我按照文档来实现它并且它有效。它没有给我任何与网络相关的错误。如果问题已经解决,那就放手吧。
  • 谢谢。我相信在您的情况下,您在创建项目时保留了“默认”网络和子网,GCP 会为您做到这一点。我也相信大多数人会保留默认设置,这就是来自 google doc 的命令起作用的原因。但就我而言,我删除了这些默认值并创建了自己的网络和子网,因此我必须在 gcloud 命令中使用额外的参数 --network 和 --subnet 才能使其工作。
  • 我认为你是对的,因为我让项目上的机器映像有默认网络,我导入的地方也有默认网络。
【解决方案2】:

我相信如果您在创建项目时保留“默认”网络和子网,GCP 会为您做到这一点(我也相信大多数人会保留默认值),那么来自 Google 文档的命令将起作用。但就我而言,我删除了这些默认设置并创建了自己的网络和子网,因此我必须在 gcloud 命令中使用额外的参数 --network 和 --subnet 才能使其正常工作。

【讨论】:

    猜你喜欢
    • 2021-04-01
    • 2021-10-16
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多