管理对自定义映像的访问权限


如需允许用户创建、删除、使用或共享您的自定义映像,您必须向其授予适当的 Identity and Access Management (IAM) 角色。本文档介绍了创建和管理自定义映像所需的 IAM 权限,以及如何将这些映像提供给用户。

如需了解有关授予 Compute Engine 资源访问权限的一般信息,请参阅管理对 Compute Engine 资源的访问权限。 如需了解 IAM,请参阅 IAM 文档

准备工作

  • 如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 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 时进行身份验证

      所需的角色

      如需获得管理对自定义图片的访问权限所需的权限,请让管理员向您授予以下 IAM 角色:

      如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

      这些预定义角色包含管理对自定义图片的访问权限所需的权限。如需查看所需的确切权限,请展开所需权限部分:

      所需权限

      您需要具备以下权限才能管理对自定义图片的访问权限:

      • 如需向用户或服务账号授予创建和共享自定义图片所需的权限,请执行以下操作:
        • 针对项目的 resourcemanager.projects.getIamPolicy 权限
        • 针对项目的 resourcemanager.projects.setIamPolicy 权限
      • 如需向用户或服务账号授予删除自定义图片所需的权限,请执行以下操作:
        • 针对项目的 resourcemanager.projects.getIamPolicy 权限
        • 针对项目的 resourcemanager.projects.setIamPolicy 权限
        • compute.images.getIamPolicy 图片
        • 图片的 compute.images.setIamPolicy 权限
      • 如需撤消用户或服务账号对自定义映像的访问权限,请执行以下操作:
        • 针对项目的 resourcemanager.projects.getIamPolicy 权限
        • 针对项目的 resourcemanager.projects.setIamPolicy 权限
      • 如需使用共享映像创建虚拟机,请执行以下操作:
        • 针对项目的 compute.instances.create 权限
        • 使用自定义映像创建虚拟机:针对映像的 compute.images.useReadOnly 权限
        • 使用快照创建虚拟机:针对快照的 compute.snapshots.useReadOnly 权限
        • 使用实例模板创建虚拟机:针对实例模板的 compute.instanceTemplates.useReadOnly 权限
        • 为虚拟机分配旧版网络:针对项目的 compute.networks.use 权限
        • 为虚拟机指定静态 IP 地址:针对项目的 compute.addresses.use 权限
        • 使用旧版网络时为虚拟机分配外部 IP 地址:针对项目的 compute.networks.useExternalIp 权限
        • 为虚拟机指定子网:针对项目或所选子网的 compute.subnetworks.use 权限
        • 在使用 VPC 网络时为虚拟机分配外部 IP 地址:针对项目或所选子网的 compute.subnetworks.useExternalIp 权限
        • 为虚拟机设置虚拟机实例元数据:针对项目的 compute.instances.setMetadata 权限
        • 为虚拟机设置标记:针对虚拟机的 compute.instances.setTags 权限
        • 为虚拟机设置标签:针对虚拟机的 compute.instances.setLabels 权限
        • 为虚拟机设置要使用的服务账号:针对虚拟机的 compute.instances.setServiceAccount 权限
        • 为虚拟机创建新磁盘:针对项目的 compute.disks.create 权限
        • 以只读或读写模式挂接现有磁盘:针对磁盘的 compute.disks.use 权限
        • 以只读模式挂接现有磁盘:针对磁盘的 compute.disks.useReadOnly 权限

      您也可以使用自定义角色或其他预定义角色来获取这些权限。

      限制

      您无法在映像上向特殊成员类型 allUsers 授予角色。

      授予创建自定义映像的权限

      您可以为用户授予在组织或项目中创建自定义映像的权限。

      Compute Engine 提供了预定义的 Compute Storage Admin 角色 (roles/compute.storageAdmin);您可以将该角色分配给用户,使其能够创建、删除和管理存储相关资源(包括映像、磁盘和快照)。如果您需要一个仅允许创建映像的角色,则必须创建自定义角色。在您的自定义角色中,添加以下权限:

      • compute.images.create(用于创建新映像)
      • compute.images.list(用于列出项目中的映像)
      • compute.disks.use(如果映像是基于磁盘创建的)
      • compute.disks.list(如果用户需要列出项目中的所有磁盘)

      如果您允许用户在组织级层创建自定义映像,则用户可以为组织内的任何项目创建自定义映像。

      控制台

      1. 在 Google Cloud Console 中,转到项目或组织的 IAM 页面。

        转到 IAM

      2. 如需添加新成员,请点击 授予访问权限

      3. 新主账号字段中,输入您要向其授予访问权限的身份的电子邮件地址。

        例如:

        • Google 账号电子邮件地址:test-user@gmail.com
        • Google 群组:admins@googlegroups.com
        • 服务账号:server@example.gserviceaccount.com
        • Google Workspace 网域:example.com
      4. 选择角色列表中,选择 Compute Engine > Compute Storage Admin,或者选择一个自定义角色(如果已创建)。

      5. 可选:如需进一步控制用户对 Google Cloud 资源的访问权限,请添加条件角色绑定

      6. 保存更改。

      gcloud

      如需在组织级层授予 roles/compute.storageAdmin 角色,请使用 gcloud organizations add-iam-policy-binding 命令

      gcloud organizations add-iam-policy-binding ORGANIZATION_ID \
          --member='MEMBER' \
          --role='roles/compute.storageAdmin'
      

      如需在项目级授予 roles/compute.storageAdmin 角色,请使用 gcloud projects add-iam-policy-binding 命令

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

      请替换以下内容:

      • ORGANIZATION_IDPROJECT_ID:组织 ID 或项目 ID,例如 my-organization-1my-project-1
      • MEMBER:您要向其授予相应角色的有效身份。

        例如:

        • Google 账号电子邮件地址:user:user@gmail.com
        • Google 群组:group:admins@googlegroups.com
        • 服务账号:serviceAccount:server@example.gserviceaccount.com
        • Google Workspace 网域:domain:example.com

      REST

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

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

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

        对于组织,请使用 organizations.getIamPolicy 方法

        POST https://cloudresourcemanager.googleapis.com/v1/organizations/ORGANIZATION_ID:getIamPolicy
        

        ORGANIZATION_ID 替换为组织 ID,例如 123456578920

        Compute Engine 会在响应中返回当前政策。

      2. 如需添加或移除成员及其关联的角色,请使用文本编辑器修改该政策。请按以下格式添加成员:

        • user:test-user@gmail.com
        • group:admins@example.com
        • serviceAccount:test123@example.domain.com
        • domain:example.domain.com

        例如,如需向 group:admins@example.com 授予 roles/compute.storageAdmin 角色,请将以下绑定添加到政策中:

        {
         "members": [
           "group:admins@example.com"
         ],
         "role":"roles/compute.storageAdmin"
        }
        
      3. 使用 setIamPolicy 方法写入更新后的政策。

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

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

        PROJECT_ID 替换为项目 ID。

      授予删除自定义映像的权限

      您可以根据自己的需求授予用户执行以下操作的权限:

      • 删除特定映像
      • 删除特定项目拥有的映像
      • 删除组织内任何项目的映像

      在项目级授予权限后,用户可以删除该项目拥有的所有映像。向用户授予组织级层权限后,用户可以删除该组织拥有的所有映像,无论映像属于哪个项目。

      Compute Engine 提供了预定义的 Compute Storage Admin 角色 (roles/compute.storageAdmin);您可以将该角色分配给用户,使其能够创建、删除和管理存储相关资源(包括映像、磁盘和快照)。如果您需要一个仅允许删除映像的角色,则必须创建自定义角色。在您的自定义角色中,添加以下权限:

      • compute.images.delete(用于删除映像)
      • compute.images.list(如果用户需要列出项目或组织中的映像)
      • compute.images.get(用于获取映像)

      控制台

      如需授予删除特定映像的权限,请执行以下操作:

      1. 在 Google Cloud Console 中,转到映像页面。

        转到“映像”

      2. 选择您要授予其权限的映像。

      3. 如需展开权限列,请点击显示信息面板

      4. 要添加一个或多个成员,请点击添加主账号

      5. 新主账号字段中,输入您要与之共享映像的身份的电子邮件地址。

        例如:

        • Google 账号电子邮件地址:test-user@gmail.com
        • Google 群组:admins@googlegroups.com
        • 服务账号:server@example.gserviceaccount.com
        • Google Workspace 网域:example.com
      6. 角色列表,将指针悬停在 Compute Engine 上方,然后选择 Storage Admin,或者从自定义列表中选择一个自定义角色。

      7. 可选:如需进一步控制用户对 Google Cloud 资源的访问权限,请添加条件角色绑定

      8. 保存更改。

      如需授予删除项目或组织的映像的权限,请执行以下操作:

      1. 转到项目或组织的 IAM 页面。

        转到 IAM

      2. 点击 授予访问权限

      3. 新主账号字段中,输入您要向其授予访问权限的身份的电子邮件地址。例如:

        • Google 账号电子邮件地址:test-user@gmail.com
        • Google 群组:admins@googlegroups.com
        • 服务账号:server@example.gserviceaccount.com
        • Google Workspace 网域:example.com
      4. 角色列表,将指针悬停在 Compute Engine 上方,然后选择 Storage Admin,或者从自定义列表中选择一个自定义角色。

      5. 可选:如需进一步控制用户对 Google Cloud 资源的访问权限,请添加条件角色绑定

      6. 保存更改。

      gcloud

      如需在组织级层授予删除映像的权限,请使用 gcloud organizations add-iam-policy-binding 命令

      gcloud organizations add-iam-policy-binding ORGANIZATION_ID \
          --member='MEMBER' \
          --role='ROLE'
      

      如需在项目级授予删除映像的权限,请使用 gcloud projects add-iam-policy-binding 命令

      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member='MEMBER' \
          --role='ROLE'
      

      如需授予删除特定映像的权限,请使用 gcloud compute images add-iam-policy-binding 命令

      gcloud compute images add-iam-policy-binding IMAGE_NAME \
          --member='MEMBER' \
          --role='ROLE'
      

      请替换以下内容:

      • ORGANIZATION_IDPROJECT_IDIMAGE_NAME:12 位数字的组织 ID、项目 ID 或映像名称,例如 123456578920my-project-1my-custom-image
      • MEMBER:您要向其授予相应角色的有效身份。

        例如:

        • Google 账号电子邮件地址:user:user@gmail.com
        • Google 群组:group:admins@googlegroups.com
        • 服务账号:serviceAccount:server@example.gserviceaccount.com
        • Google Workspace 网域:domain:example.com
      • ROLE:要分配给此身份的角色,例如 roles/compute.storageAdmin 角色或 roles/customImageDeletionRole 等自定义角色

      REST

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

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

        PROJECT_ID 替换为项目 ID。

        对于组织,请使用 organizations.getIamPolicy 方法

        POST https://cloudresourcemanager.googleapis.com/v1/organizations/ORGANIZATION_ID:getIamPolicy
        

        ORGANIZATION_ID 替换为 12 位数字的组织 ID。

        对于特定映像,请使用 images.getIamPolicy 方法

        POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/images/IMAGE_NAME:getIamPolicy
        

        请替换以下内容:

        • PROJECT_ID:项目 ID
        • IMAGE_NAME:映像的名称

        Compute Engine 会在响应中返回当前政策。

      2. 如需添加或移除成员及其关联的角色,您可以使用文本编辑器修改该政策。请按以下格式添加成员:

        • user:test-user@gmail.com
        • group:admins@example.com
        • serviceAccount:test123@example.domain.com
        • domain:example.domain.com

        例如,如需向 user:test-email@example.com 授予 roles/compute.storageAdmin 角色,请将以下绑定添加到政策中:

        {
         "members": [
           "user:test-email@example.com"
         ],
         "role":"roles/compute.storageAdmin"
        }
        
      3. 使用 setIamPolicy 方法写入更新后的政策。

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

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

        PROJECT_ID 替换为项目 ID。

      授予在组织内共享自定义映像的权限

      如果您的项目属于某个组织,那么该组织可能还有若干其他项目,并且这些项目可能对其他项目具有不同级别的访问权限。创建自定义映像时,您可以与属于组织中其他项目的其他用户共享这些映像。

      Compute Engine 提供了以下可用于映像管理的预定义 IAM 角色:

      • Compute Image User (roles/compute.imageUser):拥有在请求中列出、读取和使用映像的权限,但不具备映像的其他权限
      • Compute Storage Admin (roles/compute.storageAdmin):拥有创建、修改和删除磁盘、映像及快照的权限

      或者,您也可以自行创建自定义 IAM 角色

      我们建议的最佳做法是将所有自定义映像保存在一个专用于托管这些映像的项目中。这样可以改善对这些映像的管理,并可让您允许特定团队仅访问其所需的映像。您还可以向团队授予对整个映像项目的访问权限,但由于允许团队访问整个映像项目违反了最小权限原则,因此我们不建议您这样做。

      以下示例展示了如何添加群组以使该群组的用户可以访问映像。

      控制台

      1. 在 Google Cloud 控制台中,转到映像页面。

        转到“映像”

      2. 选择要与其他用户共享的映像。

      3. 如需展开权限列,请点击显示信息面板

      4. 要添加一个或多个成员,请点击添加主账号

      5. 新主账号字段中,输入您要与之共享映像的身份的电子邮件地址。

        例如:

        • Google 账号电子邮件地址:test-user@gmail.com
        • Google 群组:admins@googlegroups.com
        • 服务账号:server@example.gserviceaccount.com
        • Google Workspace 网域:example.com
      6. 角色列表中,将指针悬停在 Compute Engine 上,然后选择 Image UserStorage Admin,或者选择一个自定义角色。

      7. 可选:如需进一步控制用户对 Google Cloud 资源的访问权限,请添加条件角色绑定

      8. 保存更改。

      如需允许用户从 Google Cloud 控制台启动共享自定义映像,请向用户授予映像项目的 Viewer IAM 角色 (roles/viewer)。授予此角色有助于确保共享映像显示在映像选择列表中。

      1. 在 Google Cloud 控制台中,前往 IAM 页面。

        转到 IAM

      2. 点击 授予访问权限

      3. 新主账号字段中,输入您要与之共享映像的身份的电子邮件地址。例如:

        • Google 账号电子邮件地址:test-user@gmail.com
        • Google 群组:admins@googlegroups.com
        • 服务账号:server@example.gserviceaccount.com
        • Google Workspace 网域:example.com
      4. 角色列表中,将指针悬停在项目上,然后选择 Viewer

      5. 可选:如需进一步控制用户对 Google Cloud 资源的访问权限,请添加条件角色绑定

      6. 保存更改。

      gcloud

      如需更新特定映像的 IAM 政策,请使用 gcloud compute images add-iam-policy-binding 命令

      gcloud compute images add-iam-policy-binding IMAGE_NAME \
          --member='MEMBER' \
          --role='ROLE'
      

      请替换以下内容:

      • IMAGE_NAME:映像的名称,例如 custom-centos-8
      • MEMBER:您要向其授予相应角色的有效身份。

        例如:

        • user:test-user@gmail.com
        • group:admins@example.com
        • serviceAccount:test123@example.domain.com
        • domain:example.domain.com
      • ROLE:要向其分配此身份的角色,例如 roles/compute.imageUserroles/compute.storageAdmin 或自定义角色

      或者,如需允许用户在其 images.list 请求中查看这些共享映像,请使用 gcloud projects add-iam-policy-binding 命令向用户授予映像项目的 Viewer IAM 角色 (roles/viewer)。如果您不需要用户能够查看共享映像列表,则可以跳过此步骤。

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

      REST

      1. 使用资源的 getIamPolicy 方法来读取现有政策。例如,要获取特定映像的政策,请使用 images.getIamPolicy 方法

        POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/images/IMAGE_NAME:getIamPolicy
        

        请替换以下内容:

        • PROJECT_ID:此映像所属项目的 ID。
        • IMAGE_NAME:映像的名称

        Compute Engine 会在响应中返回当前政策。

      2. 如需添加或移除成员及其关联的角色,请使用文本编辑器修改该政策。请按以下格式添加成员:

        • user:test-user@gmail.com
        • group:admins@example.com
        • serviceAccount:test123@example.domain.com
        • domain:example.domain.com

        例如,如需向 test-email@example.com 授予 roles/compute.imageUser,请将以下绑定添加到政策:

        {
         "members": [
           "user:test-email@example.com"
         ],
         "role":"roles/compute.imageUser"
        }
        
      3. 使用 setIamPolicy 方法写入更新后的政策。例如,如需针对特定映像设置政策,请使用 project.setIamPolicy 方法。在请求正文中,提供上一步中更新的 IAM 政策。

        POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/images/IMAGE_NAME:setIamPolicy
        

        请替换以下内容:

        • PROJECT_ID:此映像所属项目的 ID。
        • IMAGE_NAME:映像的名称

      或者,如需允许用户在其 images.list 请求中查看这些共享映像,请使用 projects.setIamPolicy 方法向用户授予映像项目的 Viewer IAM 角色 (roles/viewer)。如果您不需要用户能够查看共享映像列表,则可以跳过此步骤。

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

      授予在组织之间共享自定义映像的权限

      如果您要与贵组织外部的合作伙伴、用户或承包商共享映像,创建自定义映像目录会很有帮助。如需与组织外部的用户共享您的映像,请将他们作为映像用户添加到您的项目中:

      控制台

      1. 在 Google Cloud 控制台中,转到映像页面。

        转到“映像”

      2. 选择要与其他用户共享的映像。

      3. 如需展开权限列,请点击显示信息面板

      4. 要添加一个或多个成员,请点击添加主账号

      5. 新主账号字段中,输入您要与之共享映像的群组的电子邮件地址。例如 admins@example.com

      6. 角色列表中,将指针悬停在 Compute Engine 上,然后选择 Compute Image User

      7. 可选:如需进一步控制用户对 Google Cloud 资源的访问权限,请添加条件角色绑定

      8. 保存更改。

      如需允许用户从 Google Cloud 控制台启动共享自定义映像,请向用户授予映像项目的 Viewer IAM 角色 (roles/viewer)。授予此角色有助于确保共享映像显示在映像选择列表中。

      1. 在 Google Cloud 控制台中,前往 IAM 页面。

        转到 IAM

      2. 点击 授予访问权限

      3. 新主账号字段中,输入您要与之共享映像的身份的电子邮件地址。例如 admins@example.com

      4. 角色列表中,将指针悬停在项目上,然后选择 Viewer

      5. 可选:如需进一步控制用户对 Google Cloud 资源的访问权限,请添加条件角色绑定

      6. 保存更改。

      gcloud

      如需向用户授予 roles/compute.imageUser 角色,请使用 gcloud compute images add-iam-policy-binding 命令

      gcloud compute images add-iam-policy-binding IMAGE_NAME \
          --member='MEMBER' \
          --role='roles/compute.imageUser'
      

      请替换以下内容:

      • IMAGE_NAME:映像的名称,例如 custom-centos-8
      • MEMBER:您要向其授予相应角色的有效身份,例如 group:admins@example.com

      或者,如需允许用户在其 images.list 请求中查看这些共享映像,请使用 gcloud projects add-iam-policy-binding 命令向用户授予映像项目的 Viewer IAM 角色 (roles/viewer)。如果您不需要用户能够查看共享映像列表,则可以跳过此步骤。

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

      REST

      1. 使用资源的 getIamPolicy 方法来读取现有政策。例如,要获取特定映像的政策,请使用 images.getIamPolicy 方法

        POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/images/IMAGE_NAME:getIamPolicy
        

        请替换以下内容:

        • PROJECT_ID:此映像所属项目的 ID。
        • IMAGE_NAME:映像的名称

        Compute Engine 会在响应中返回当前政策。

      2. 如需添加或移除成员及其关联的角色,您可以使用文本编辑器修改该政策。请按以下格式添加成员:

        • user:test-user@gmail.com
        • group:admins@example.com
        • serviceAccount:test123@example.domain.com
        • domain:example.domain.com

        例如,如需向 test-user@example.com 授予 roles/compute.imageUser,请将以下绑定添加到政策:

        {
          "members": [
            "user:test-user@example.com"
          ],
          "role":"roles/compute.imageUser"
        }
        
      3. 使用 setIamPolicy 方法写入更新后的政策。例如,如需对特定映像设置政策,请使用 images.setIamPolicy 方法。在请求正文中,提供上一步中更新的 IAM 政策。

        POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/images/IMAGE_NAME:setIamPolicy
        

        请替换以下内容:

        • PROJECT_ID:此映像所属项目的 ID。
        • IMAGE_NAME:映像的名称

        或者,如需允许用户在其 images.list 请求中查看这些共享映像,请使用 projects.setIamPolicy 方法向用户授予映像项目的 Viewer IAM 角色 (roles/viewer)。如果您不需要用户能够查看共享映像列表,则可以跳过此步骤。

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

      授予公开共享自定义映像的权限

      您可以与所有经过身份验证的 Compute Engine 用户共享您的自定义映像,无论这些用户是否属于您的组织或项目。

      您只能与所有经过身份验证的用户共享资源(例如映像),而无法与所有经过身份验证的用户共享项目或组织。这种限制和资源层次结构有助于防止组织无意中与所有经过身份验证的 Compute Engine 用户共享其整个项目。

      以下示例展示了如何向所有经过身份验证的 Compute Engine 用户授予自定义映像的 Compute Image User 角色 (roles/compute.imageUser)。

      gcloud

      如需公开映像,请使用 gcloud compute images add-iam-policy-binding 命令

      gcloud compute images add-iam-policy-binding IMAGE_NAME \
          --member='allAuthenticatedUsers' \
          --role='roles/compute.imageUser'
      

      IMAGE_NAME 替换为资源名称,例如 my_image

      REST

      1. 使用 getIamPolicy 方法读取现有政策。例如,要获取特定映像的政策,请使用 images.getIamPolicy 方法

        POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/images/IMAGE_NAME:getIamPolicy
        

        请替换以下内容:

        • PROJECT_ID:此映像所属项目的 ID。
        • IMAGE_NAME:映像的名称

        Compute Engine 会在响应中返回当前政策。

      2. 如需添加或移除成员及其关联的角色,请使用文本编辑器修改该政策:

        {
         "members": [
           "allAuthenticatedUsers"
         ],
         "role":"roles/compute.imageUser"
        }
        
      3. 使用 setIamPolicy 方法写入更新后的政策。例如,如需对特定映像设置政策,请使用 images.setIamPolicy 方法。在请求正文中,提供上一步中更新的 IAM 政策。

        POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/images/IMAGE_NAME:setIamPolicy
        

        请替换以下内容:

        • PROJECT_ID:此映像所属项目的 ID。
        • IMAGE_NAME:映像的名称

      向代管式实例组授予映像访问权限

      通过 Compute Engine,您可以托管非托管实例组的形式创建虚拟机组。如果创建代管式实例组 (MIG),Compute Engine 将使用 Google API 服务代理来调用 Compute Engine API 并执行与该组相关的操作,例如重新创建运行状况不佳的虚拟机和更新虚拟机。

      如果您想使用其他项目中的映像创建 MIG,请向属于创建该 MIG 的项目的 API 服务账号授予 Compute Image User 角色 (roles/compute.imageUser)。例如:

      1. 项目 A 希望使用项目 B 拥有的映像创建 MIG。
      2. 项目 B 向项目 A 的服务账号授予 Compute Image User 角色。
      3. 现在,项目 A 可以使用项目 B 中的映像来创建 MIG。

      授予 Compute Image User 角色后,您可以在为托管组创建实例模板时,使用控制台或映像网址访问其他项目中的映像。

      输入服务账号的电子邮件地址

      1. 在 Google Cloud 控制台中,转到您要向其服务账号授予访问权限的项目对应的 IAM 页面。

        转到 IAM

      2. 如果出现提示,请从列表中选择您的项目。

      3. 查找电子邮件地址采用以下格式的 Google API 服务代理

        PROJECT_NUMBER@cloudservices.gserviceaccount.com
        

      检索服务账号的电子邮件地址后,您可以转到以下任一部分:

      向 MIG 授予对项目中所有映像的访问权限

      现在您已经获得服务账号的电子邮件地址,接下来可以将该地址添加到其他项目中,并向其授予 Compute Image User 角色 (roles/compute.imageUser)。

      控制台

      1. 在 Google Cloud Console 中,转到映像项目的 IAM 页面。

        转到 IAM

      2. 如需添加新成员,请点击 授予访问权限

      3. 新主账号字段中,添加服务账号电子邮件地址。

      4. 角色列表中,将指针悬停在计算上,然后选择 Compute Image User

      5. 可选:如需进一步控制用户对 Google Cloud 资源的访问权限,请添加条件角色绑定

      6. 点击保存

      7. 切换回该服务账号所属的项目。

      现在,您可以根据映像项目中的映像创建实例模板,并根据实例模板创建 MIG

      gcloud

      使用 gcloud projects add-iam-policy-binding 命令从映像项目添加服务账号:

      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member='serviceAccount:SERVICE_ACCOUNT_EMAIL' --role='roles/compute.imageUser'
      

      请替换以下内容:

      • PROJECT_ID:要共享的映像所属项目的 ID
      • SERVICE_ACCOUNT_EMAIL:服务账号的电子邮件地址

      现在,您可以根据映像项目中的映像创建实例模板,并根据实例模板创建 MIG

      REST

      1. 使用 projects.getIamPolicy 方法获取映像项目的 IAM 政策:

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

        PROJECT_ID 替换为映像项目的 ID。

      2. 如需向服务账号授予 roles/compute.imageUser 角色,请使用文本编辑器修改该政策:

        {
          "bindings": [
             {
              "role": "roles/compute.imageUser",
              "members": [
                "serviceAccount:SERVICE_ACCOUNT_EMAIL"
              ]
            }
          ]
        }
        

        SERVICE_ACCOUNT_EMAIL 替换为服务账号电子邮件地址。

      3. 使用 projects.setIamPolicy 写入更新后的政策。在请求正文中,提供上一步中更新的 IAM 政策。

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

        PROJECT_ID 替换为映像项目的产品 ID。

        现在,您可以根据映像项目中的映像创建实例模板,并根据实例模板创建 MIG

      向 MIG 授予对项目中特定映像的访问权限

      现在您已经获得服务账号的电子邮件地址,接下来可以将该地址添加到其他项目中,并向其授予特定映像的 Compute Image User 角色 (roles/compute.imageUser)。

      控制台

      1. 在 Google Cloud 控制台中,转到映像项目对应的映像页面。

        转到“映像”

      2. 选中您要共享的映像旁边的复选框。

      3. 如需展开权限列,请点击显示信息面板

      4. 权限面板中,点击添加主账号

      5. 新主账号字段中,输入您要与之共享映像的服务账号电子邮件地址。例如 test123@example.domain.com

      6. 角色列表中,选择计算,然后选择 Compute Image User

      7. 可选:如需进一步控制用户对 Google Cloud 资源的访问权限,请添加条件角色绑定

      8. 点击保存

      9. 切换回该服务账号所属的项目。

      现在,您可以根据映像项目中的映像创建实例模板,并根据实例模板创建 MIG

      gcloud

      如需向服务账号授予对特定映像的访问权限,请使用 gcloud compute images add-iam-policy-binding 命令

      gcloud compute images add-iam-policy-binding IMAGE_NAME \
          --member='serviceAccount:SERVICE_ACCOUNT_EMAIL' \
          --role='roles/compute.imageUser'
      

      请替换以下内容:

      • IMAGE_NAME:您要共享的映像名称
      • SERVICE_ACCOUNT_EMAIL:服务账号的电子邮件地址

      现在,您可以根据映像项目中的映像创建实例模板,并根据实例模板创建 MIG

      REST

      1. 使用 images.getIamPolicy 方法获取映像的 IAM 政策:

        POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/images/IMAGE_NAME:getIamPolicy
        

        请替换以下内容:

        • PROJECT_ID:映像项目的 ID
        • IMAGE_NAME:您要共享的映像的名称
      2. 如需向服务账号授予 roles/compute.imageUser 角色,请使用文本编辑器修改该政策:

        {
          "bindings": [
             {
              "role": "roles/compute.imageUser",
              "members": [
                "serviceAccount:SERVICE_ACCOUNT_EMAIL"
              ]
            }
          ]
        }
        

        SERVICE_ACCOUNT_EMAIL 替换为服务账号电子邮件地址。

      3. 使用 images.setIamPolicy 方法写入更新后的政策。在请求正文中,提供上一步中更新的 IAM 政策。

        POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/images/IMAGE_NAME:setIamPolicy
        

        请替换以下内容:

        • PROJECT_ID:映像项目的 ID
        • IMAGE_NAME:您要共享的映像的名称

        现在,您可以根据映像项目中的映像创建实例模板,并根据实例模板创建 MIG

      控制共享映像和快照的使用

      在与其他用户共享您的映像后,您可以控制这些用户在您的组织内部使用这些资源的位置。设置 constraints/compute.storageResourceUseRestrictions 限制可以定义允许用户在其中使用您的存储资源的项目。

      您必须具有修改组织政策的权限才能设置这些限制。例如,resourcemanager.organizationAdmin 角色拥有设置这些限制的权限。

      1. 使用 gcloud organization list 命令查找组织的 ID:

        gcloud organizations list
        
      2. 使用 gcloud resource-manager org-policies describe 命令获取组织的现有政策设置:

        gcloud resource-manager org-policies describe \
            compute.storageResourceUseRestrictions \
            --organization ORGANIZATION_ID > org-policy.yaml
        

        ORGANIZATION_ID 替换为 12 位数字的组织 ID。

      3. 在文本编辑器中打开 org-policy.yaml 文件并修改 compute.storageResourceUseRestrictions 限制条件。添加所需的限制或移除不再需要的限制。修改完此文件后,请保存更改。例如,您可以在政策文件中设置以下限制条目:

        constraint: compute.storageResourceUseRestrictions
        listPolicy:
          allowedValues:
            - under:organization/organization-id
        
      4. 使用 gcloud resource-manager org-policies set-policy 命令将 org-policy.yaml 文件应用于您的组织:

        gcloud resource-manager org-policies set-policy \
           --organization=ORGANIZATION_ID org-policy.yaml
        

        ORGANIZATION_ID 替换为 12 位数字的组织 ID。

      在配置完组织政策中的限制条件后,请进行测试以确保这些条件会创建您所需要的限制。

      使用其他项目中的映像

      如果某人向您授予了对其他项目中一个或多个映像的访问权限,您可以通过在请求中指定映像项目来访问该项目中的这些映像。

      例如,如需使用另一个项目中的共享映像创建虚拟机,请按照以下步骤操作:

      控制台

      1. 在 Google Cloud 控制台中,转到创建实例页面。

        转到“创建实例”

      2. 为您的虚拟机指定名称。如需了解详情,请参阅资源命名惯例
      3. 可选操作:更改此虚拟机的可用区。如果您选择任意,Google 会根据机器类型和可用性为您自动选择可用区。
      4. 为您的虚拟机选择机器配置
      5. 启动磁盘部分,点击更改以配置您的启动磁盘,然后执行以下操作:
        1. 选择自定义映像标签。
        2. 要选择映像项目,请点击选择项目,然后执行以下操作:
          1. 选择包含该映像的项目。
          2. 点击打开
        3. 映像列表中,点击要导入的映像。
        4. 选择启动磁盘的类型和大小。
        5. 如需确认您的启动磁盘选项,请点击选择
      6. 如需允许 HTTP 或 HTTPS 流量流向虚拟机,请在防火墙部分中选择允许 HTTP 流量允许 HTTPS 流量

        Google Cloud 控制台会向虚拟机添加网络标记,并创建相应的入站流量防火墙规则,以允许 tcp:80 (HTTP) 或 tcp:443 (HTTPS) 上的所有传入流量。网络标记可将防火墙规则与虚拟机相关联。 如需了解详情,请参阅 Cloud 新一代防火墙文档中的防火墙规则概览

      7. 如需启动并创建虚拟机,请点击创建

      gcloud

      1. In the Google Cloud console, activate Cloud Shell.

        Activate Cloud Shell

        At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

      2. 使用 gcloud compute instances create command 创建虚拟机,并使用 --image--image-project 标志指定映像名称和映像所在的项目:

        gcloud compute instances create VM_NAME \
                --image=IMAGE \
                --image-project=IMAGE_PROJECT
            

        请替换以下内容:

        • VM_NAME:新虚拟机的名称
        • IMAGE:映像的名称
        • IMAGE_PROJECT:映像所属的项目

        如果命令成功,gcloud 将返回新虚拟机的属性作为响应:

            Created [https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-b/instances/example-instance].
            NAME                 ZONE           MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP    STATUS
            example-instance     us-central1-b  e2-standard-2               10.240.0.4   104.198.53.60  RUNNING

      Terraform

      在 Terraform 中使用共享映像创建虚拟机的过程与使用公开提供的映像创建虚拟机的过程相同。

      1. 在 Google Cloud 控制台中,前往虚拟机实例页面。

        转到“虚拟机实例”

      2. 点击创建实例
      3. 指定所需的参数。
      4. 在页面顶部或底部,点击等效代码,然后点击 Terraform 标签页以查看 Terraform 代码。

      REST

      在 API 中使用共享映像创建虚拟机的过程与使用公开可用映像创建虚拟机的过程相同。 如需通过共享映像创建虚拟机,请使用 instances.insert 方法

      POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
      
      {
         "machineType":"zones/MACHINE_TYPE_ZONE/machineTypes/MACHINE_TYPE",
         "name":"VM_NAME",
         
         "disks":[
            {
               "initializeParams":{
                  "sourceImage":"projects/IMAGE_PROJECT/global/images/IMAGE"
               },
               "boot":true
            }
         ],
         
         
         "networkInterfaces":[
            {
               "network":"global/networks/NETWORK_NAME"
            }
         ],
         
        
         "shieldedInstanceConfig":{
            "enableSecureBoot":"ENABLE_SECURE_BOOT"
         }
      }
      

      请替换以下内容:

      • PROJECT_ID:要在其中创建虚拟机的项目的 ID
      • ZONE:要在其中创建虚拟机的可用区
      • MACHINE_TYPE_ZONE:包含新虚拟机将使用的机器类型的可用区
      • MACHINE_TYPE:新虚拟机的预定义自定义机器类型
      • VM_NAME:新虚拟机的名称
      • IMAGE_PROJECT:包含共享映像的项目的名称
      • IMAGEIMAGE_FAMILY:指定以下其中一项:
        • IMAGE:共享映像的名称。例如 "sourceImage": "projects/finance-project-1234/global/images/finance-debian-image-v2"
        • IMAGE_FAMILY:如果共享映像是作为自定义映像系列的一部分创建的,请指定该自定义映像系列。

          此项表示通过自定义映像系列中最新的未弃用的操作系统映像创建虚拟机。例如,如果您指定 "sourceImage": "projects/finance-project-1234/global/images/family/finance-debian-family",则 Compute Engine 会通过 finance-debian-family 映像系列中最新版本的操作系统映像创建虚拟机。

      • NETWORK_NAME:您要用于虚拟机的 VPC 网络。您可以指定 default 来使用默认网络。
      • ENABLE_SECURE_BOOT(可选):如果您选择了支持安全强化型虚拟机功能的映像,则 Compute Engine 会默认启用虚拟可信平台模块 (vTPM)完整性监控。默认情况下,Compute Engine 不会启用安全启动

        如果为 enableSecureBoot 指定 true,则 Compute Engine 会创建一个启用了所有三项安全强化型虚拟机功能的虚拟机。在 Compute Engine 启动您的虚拟机后,如需修改安全强化型虚拟机选项,您必须停止该虚拟机。

      您还可以使用其他项目中的映像创建永久性启动磁盘。如需了解如何使用映像创建启动磁盘,请参阅创建独立的永久性启动磁盘

      撤消对共享映像的访问权限

      如果某用户不再需要访问您的 Compute Engine 资源,您可以使用 Google Cloud 控制台、Google Cloud CLI 或 REST 撤消其访问权限。

      控制台

      1. 在 Google Cloud 控制台中,转到映像项目对应的映像页面。

        转到“映像”

      2. 选中要更新的映像旁边的复选框。

      3. 如需展开权限列,请点击显示信息面板

      4. 展开您要移除用户的角色。

      5. 如需从该角色中移除用户,请点击 删除

      gcloud

      如需从映像角色中移除用户,请使用带有 --member--role 标志的 gcloud compute images remove-iam-policy-binding 命令

      gcloud compute images remove-iam-policy-binding IMAGE_NAME \
          --member='MEMBER' \
          --role='ROLE'
      

      请替换以下内容:

      • IMAGE_NAME:映像的名称,例如 my_image
      • MEMBER:您要移除的身份

        必须采用 user|group|serviceAccount:emaildomain:domain 格式。例如:

        • user:test-user@gmail.com
        • group:admins@example.com
        • serviceAccount:test123@example.domain.com
        • domain:example.domain.com
      • ROLE:您要从中移除身份的角色

      如果您要撤消对目前处于 Beta 版阶段的资源的访问权限,请改用 gcloud beta compute 命令。

      REST

      1. 使用 images.getIamPolicy 方法读取现有政策:

        POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/images/IMAGE_NAME:getIamPolicy
        

        请替换以下内容:

        • PROJECT_ID:此映像所属项目的 ID
        • IMAGE_NAME:映像的名称

        Compute Engine 会在响应中返回当前政策。

      2. 如需移除成员及其关联的角色,请使用文本编辑器修改该政策。

      3. 使用 images.setIamPolicy 方法写入更新后的政策。在请求正文中,提供上一步中更新的 IAM 政策。

        POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/global/images/IMAGE_NAME:setIamPolicy
        

        请替换以下内容:

        • PROJECT_ID:此映像所属项目的 ID
        • IMAGE_NAME:映像的名称

      后续步骤