导入和导出虚拟机映像的前提条件


本文档介绍了在 Compute Engine 上导入和导出映像的前提条件。

您可以通过从其他 Cloud Storage 导入和导出映像来共享其他云环境或本地环境中的虚拟机 (VM) 实例、虚拟磁盘文件和机器映像。以下核对清单总结了在导入和导出映像之前需要满足的要求:

  1. 设置对 Cloud Storage 存储桶的访问权限
  2. 为您的用户账号授予所需的角色
  3. 为 Cloud Build 服务账号授予所需的角色
  4. 为 Compute Engine 服务账号授予所需的角色

准备工作

  • 设置身份验证(如果尚未设置)。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。

    选择标签页以了解您打算如何使用本页面上的示例:

    控制台

    当您使用 Google Cloud 控制台访问 Google Cloud 服务和 API 时,无需设置身份验证。

    gcloud

    1. 安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init
    2. 设置默认区域和可用区

    REST

    如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。

      安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init

设置对 Cloud Storage 存储桶的访问权限

您必须有权访问导入或导出工具可以使用的 Cloud Storage 存储桶。如果您没有 Cloud Storage 存储桶,请参阅创建 Cloud Storage 存储桶

如需设置对 Cloud Storage 存储桶的访问权限,请参阅为您的账号授予所需的权限为 Compute Engine 服务账号授予所需的权限

  • 如果您要导出映像,导出工具会将映像上传到 Cloud Storage 存储桶。

  • 如果您要导入映像,则必须先将映像上传到 Cloud Storage 存储桶。导入工具将文件从 Cloud Storage 存储桶下载到 Compute Engine,然后该工具通过磁盘文件在 Compute Engine 中创建映像。

授予所需的 IAM 角色

虚拟机映像导入和导出工具需要以下账号才能代表您执行操作:

  • 用户账号。运行导入和导出命令使用的账号。
  • Cloud Build 服务账号。导入或导出工具启用 Cloud Build API 时创建的默认 Cloud Build 服务账号。
  • Compute Engine 服务账号。导入和导出工作流所需的默认或自定义 Compute Engine 服务账号。

为您的用户账号授予所需的角色

如需导入或导出映像,您的用户账号需要以下角色:

  • Storage Admin 角色 (roles/storage.admin)
  • Viewer 角色 (roles/viewer)
  • Project IAM Admin 角色 (roles/resourcemanager.projectIamAdmin)
  • Cloud Build Editor 角色 (roles/cloudbuild.builds.editor)

控制台

  1. 转到项目或组织对应的 IAM 和管理页面。

    转到“IAM 和管理”

  2. 找到您的账号,然后点击修改

  3. 选择角色列表中,选择以下角色:

    • Cloud Storage > Storage Admin
    • 项目 > Viewer
    • Resource Manager > Project IAM Admin
    • Cloud Build > Cloud Build Editor
  4. 保存更改。

gcloud

在以下步骤中,您将使用 gcloud projects add-iam-policy-binding 命令在项目级层授予所需的角色。

  1. 授予 roles/storage.admin 角色:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member='MEMBER' \
      --role='roles/storage.admin'
    

    替换以下内容:

    • PROJECT_ID:您的项目的 Google Cloud 项目 ID
    • MEMBER:运行导入和导出命令的账号,例如 user:export-user@gmail.com
  2. 授予 roles/viewer 角色:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member='MEMBER' \
      --role='roles/viewer'
    
  3. 授予 roles/resourcemanager.projectIamAdmin 角色:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member='MEMBER' \
      --role='roles/resourcemanager.projectIamAdmin'
    
  4. 授予 roles/cloudbuild.builds.editor 角色:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member='MEMBER' \
      --role='roles/cloudbuild.builds.editor'
    

REST

  1. 使用资源的 getIamPolicy 方法来读取现有政策。对于项目,请使用 projects.getIamPolicy 方法

    POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:getIamPolicy
    

    PROJECT_ID 替换为项目 ID,例如 my-project-1

  2. 如需为您的账号授予所需的角色,请使用文本编辑器修改政策。

    例如,如需为您的账号 user:export-user@gmail.com 授予所需的角色,请将以下绑定添加到政策中:

    {
       {
         "role":"roles/storage.admin",
         "member":[
           "user:export-user@gmail.com"
         ]
       }
       {
         "roles":"roles/viewer",
         "member":[
           "user:export-user@gmail.com"
         ]
       }
       {
         "roles":"roles/resourcemanager.projectIamAdmin",
         "member":[
           "user:export-user@gmail.com"
         ]
       }
       {
         "roles":"roles/cloudbuild.builds.editor",
         "member":[
           "user:export-user@gmail.com"
         ]
       }
    }
    
  3. 如需写入更新后的政策,请使用 setIamPolicy 方法。

    例如,要在项目级设置政策,请使用 project.setIamPolicy 方法。在请求正文中,提供上一步中更新的 IAM 政策。

    POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:setIamPolicy
    

为 Cloud Build 服务账号授予所需的角色

首次使用 Google Cloud 控制台或 gcloud CLI 导入或导出映像时,该工具会尝试启用 Cloud Build API 并为 Cloud Build 服务账号授予所需的角色。

  • Service Account Token Creator 角色 (roles/iam.serviceAccountTokenCreator)
  • Service Account User 角色 (roles/iam.serviceAccountUser)
  • Compute Admin 角色 (roles/compute.admin)

    为避免授予 Compute Admin 角色,您可以创建具有以下 Compute Engine IAM 权限的自定义角色,并为 Cloud Build 服务账号授予此角色

  • Compute Network User 角色 (roles/compute.networkUser)

    只有在导入或导出使用共享 VPC 的映像时,才需要此角色。

    在共享 VPC 项目中,将 Compute Network User 角色授予您为其导入或导出映像的项目内的 Cloud Build 服务账号。

不过,您可以手动授予这些角色,以确保所需权限已生效:

控制台

  1. 启用 Cloud Build API 后,转到项目或组织对应的 IAM 和管理页面。

    转到“IAM 和管理”

  2. 找到 Cloud Build 服务账号,然后点击修改

  3. 如果未列出所需的角色,请执行以下操作:

    1. 点击 添加其他角色
    2. 选择角色列表中,选择要添加的所需角色:

      • 服务账号 > Service Account Token Creator
      • 服务账号 > Service Account User
      • Compute Engine > Compute Admin

        或者,您也可以选择自定义角色。请参阅本文档前面的自定义角色所需的权限

    3. 点击保存以保存所做更改。

  4. 可选:如果您要导入或导出使用共享 VPC 的映像,请在共享 VPC 项目中选择 Compute Network User 角色:

    1. 从控制台顶部的项目选择器中,选择共享 VPC 宿主项目。
    2. IAM 和管理页面上,点击 授予访问权限
    3. 新的主账号中,输入 Cloud Build 服务账号的电子邮件地址。
       PROJECT_NUMBER@cloudbuild.gserviceaccount.com'
       
      PROJECT_NUMBER 替换为要为其导入或导出映像的项目的唯一编号。
    4. 选择角色列表中,选择 Compute Engine > Compute Network User 角色。
    5. 点击保存以保存所做更改。

gcloud

在以下步骤中,您将使用 gcloud projects add-iam-policy-binding 命令在项目级层授予所需的角色。

  1. roles/compute.admin 角色授予 Cloud Build 服务账号:为避免授予 roles/compute.admin 角色,您可以创建具有所需权限的自定义角色,然后将该角色授予 Cloud Build 服务账号。请参阅本文档前面的自定义角色所需的权限

    gcloud projects add-iam-policy-binding PROJECT_ID \
       --member='serviceAccount:PROJECT_NUMBER@cloudbuild.gserviceaccount.com' \
       --role='roles/compute.admin'
    

    替换以下内容:

  2. 授予 roles/iam.serviceAccountUser 角色:

    gcloud projects add-iam-policy-binding PROJECT_ID \
       --member='serviceAccount:PROJECT_NUMBER@cloudbuild.gserviceaccount.com' \
       --role='roles/iam.serviceAccountUser'
    
  3. 授予 roles/iam.serviceAccountTokenCreator 角色:

    gcloud projects add-iam-policy-binding PROJECT_ID \
       --member='serviceAccount:PROJECT_NUMBER@cloudbuild.gserviceaccount.com' \
       --role='roles/iam.serviceAccountTokenCreator'
    
  4. 可选:如果您要导出或导入使用共享 VPC 的映像,请授予 roles/compute.networkUser 角色:

    gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
       --member='serviceAccount:PROJECT_NUMBER@cloudbuild.gserviceaccount.com' \
       --role='roles/compute.networkUser'
    

    替换以下内容:

    • HOST_PROJECT_ID:共享 VPC 所在宿主项目的 ID
    • PROJECT_NUMBER:您为其导入或导出映像的项目的唯一编号

REST

  1. 使用资源的 getIamPolicy 方法来读取现有政策。对于项目,请使用 projects.getIamPolicy 方法

    POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:getIamPolicy
    

    PROJECT_ID 替换为项目 ID,例如 my-project-1

  2. 如需为您的账号授予所需的角色,请使用文本编辑器修改政策。

    例如,如需为 serviceAccount:12345@cloudbuild.gserviceaccount.com 授予所需的角色,请将以下绑定添加到政策中:

    {
       {
         "role":"roles/compute.admin",
         "member":[
           "serviceAccount:12345@cloudbuild.gserviceaccount.com"
         ]
       }
       {
         "roles":"roles/iam.serviceAccountUser",
         "member":[
           "serviceAccount:12345@cloudbuild.gserviceaccount.com"
         ]
       }
      {
         "roles":"roles/iam.serviceAccountTokenCreator",
         "member":[
           "serviceAccount:12345@cloudbuild.gserviceaccount.com"
         ]
       }
    }
    

    为避免授予 roles/compute.admin 角色,您可以创建具有所需权限的自定义角色,然后将该角色授予 Cloud Build 服务账号。请参阅本文档前面的自定义角色所需的权限

  3. 可选:如果您要导出或导入使用共享 VPC 的映像,请在共享 VPC 项目中授予 roles/compute.networkUser 角色。

    POST https://cloudresourcemanager.googleapis.com/v1/projects/HOST_PROJECT_ID:getIamPolicy
    

    HOST_PROJECT_ID 替换为共享 VPC 宿主项目的 ID。

    将以下 IAM 绑定添加到 Cloud Build 服务账号:

    {
       {
         "roles":"roles/compute.networkUser",
         "member":[
           "serviceAccount:12345@cloudbuild.gserviceaccount.com"
         ]
       }
    }
    
  4. 如需写入更新后的政策,请使用 setIamPolicy 方法。

    例如,要在项目级设置政策,请使用 project.setIamPolicy 方法。在请求正文中,提供上一步中更新的 IAM 政策。

    POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:setIamPolicy
    

如需详细了解如何管理对资源的访问权限,请参阅授予、更改和撤消对资源的访问权限

为 Compute Engine 服务账号授予所需的角色

首次使用 Google Cloud 控制台或 gcloud CLI 导入或导出映像时,该工具会尝试将所需角色授予默认 Compute Engine 服务账号。默认情况下,此账号拥有足以完成该过程的项目的 IAM Editor 角色 (roles/editor)。您的 Compute Engine 服务账号必须具有以下角色:

  • Compute Storage Admin 角色 (roles/compute.storageAdmin):导出和导入虚拟机映像所需的角色
  • Storage Object Viewer 角色 (roles/storage.objectViewer):导入虚拟机映像所需的角色
  • Storage Object Admin 角色 (roles/storage.objectAdmin):导出虚拟机映像所需的角色

但是,如果您修改了 Compute Engine 服务账号的默认角色和权限,请确保该服务账号仍然应用所需的角色。

控制台

  1. 转到项目或组织对应的 IAM 和管理页面。

    转到“IAM 和管理”

  2. 找到 Compute Engine 服务账号,然后点击 修改

  3. 选择角色列表中,选择以下角色:

    • Compute Engine > Compute Storage Admin
    • Cloud Storage > Storage Object Viewer
    • Cloud Storage > Storage Object Admin
  4. 保存更改。

gcloud

在以下步骤中,您将使用 gcloud projects add-iam-policy-binding 命令在项目级层授予所需的角色。

  1. 授予 roles/compute.storageAdmin 角色:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member='serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com' \
      --role='roles/compute.storageAdmin'
    
  2. 如果您要导入映像,请授予 roles/storage.objectViewer 角色:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member='serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com' \
      --role='roles/storage.objectViewer'
    
  3. 如果您要导出映像,请授予 roles/storage.objectAdmin 角色:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member='serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com' \
      --role='roles/storage.objectAdmin'
    

REST

  1. 使用资源的 getIamPolicy 方法来读取现有政策。对于项目,请使用 projects.getIamPolicy 方法

    POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:getIamPolicy
    

    PROJECT_ID 替换为项目 ID,例如 my-project-1

  2. 如需为您的账号授予所需的角色,请使用文本编辑器修改政策。

    例如,如需为 serviceAccount:12345-compute@developer.gserviceaccount.com 授予导入映像所需的角色,请将以下绑定添加到政策中:

    {
       {
         "role":"roles/compute.storageAdmin",
         "member":[
           "serviceAccount:12345-compute@developer.gserviceaccount.com"
         ]
       }
       {
         "roles":"roles/storage.objectViewer",
         "member":[
           "serviceAccount:12345-compute@developer.gserviceaccount.com"
         ]
       }
    }
    
  3. 如需写入更新后的政策,请使用 setIamPolicy 方法。

    例如,要在项目级设置政策,请使用 project.setIamPolicy 方法。在请求正文中,提供上一步中更新的 IAM 政策。

    POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:setIamPolicy
    

如果您不想使用默认的 Compute Engine 服务账号,则可以使用 gcloud 中的 --compute-service-account 标志来指定用户管理的服务账号导入和导出命令。如需详细了解如何使用自定义 Compute Engine 服务账号,请参阅以下资源:

后续步骤