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


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

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

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

准备工作

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

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. REST

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

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证

设置对 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 服务账号

根据您的组织政策配置,默认服务账号可能会自动被授予项目的 Editor 角色。我们强烈建议您通过强制执行 iam.automaticIamGrantsForDefaultServiceAccounts 组织政策限制条件来停用自动角色授予功能。如果您的组织是在 2024 年 5 月 3 日之后创建的,则默认情况下会强制执行此限制条件。

如果您停用自动角色授予功能,则必须决定向默认服务账号授予哪些角色,然后自行授予这些角色

如果默认服务账号已具有 Editor 角色,我们建议您将 Editor 角色替换为权限较少的角色。如需安全地修改服务账号的角色,请使用 Policy Simulator 查看更改的影响,然后授予和撤消相应的角色

您的 Compute Engine 服务账号必须具有以下角色:

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

控制台

  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 服务账号,请参阅以下资源:

后续步骤