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

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

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

准备工作

限制

您无法在映像上向特殊成员类型 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

API

  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 等自定义角色

API

  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 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 上,然后选择 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'

API

  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 Console 中,转到映像页面。

    转到“映像”

  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'

API

  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

API

  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

API

  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

API

  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 Console 中,转到创建实例页面。

    转到“创建实例”

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

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

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

gcloud

使用 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

API

在 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 或 Compute Engine API 撤消其访问权限。

控制台

  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 命令。

API

  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:映像的名称

后续步骤