共享映像、快照和磁盘

您可以与项目或组织外部的用户共享映像、快照和磁盘。对这些资源具有读取权限的用户可以使用它们完成其他项目和组织中的操作。举例来说,如果授予用户项目中映像或快照的读取权限,则他们可以使用这些资源在自己的项目中创建永久性磁盘。使用 IAM 角色可以共享映像、快照和磁盘的读取权限

某些情况下,您希望这些授权用户只有在组织或某些项目中用到这些资源时才能访问这些存储资源。如要限制用户可以使用映像、快照和磁盘创建资源的项目,请设置存储资源使用限制作为组织政策。

如需详细了解 IAM 角色,请参阅 IAM 文档

准备工作

限制

共享存储资源具有以下限制:

  • 您只能在项目级层授予映像、快照和磁盘的访问权限。

  • 无法仅共享特定映像、快照或磁盘。

  • 无法将角色授予 allAuthenticatedUsersallUsers 以允许访问映像、快照或磁盘。

  • 您只能在组织级层设置“constraints/compute.storageResourceUseRestrictions”限制。

  • 您必须使用 Compute Engine API 从项目外部的资源创建映像、快照或磁盘。举例来说,在运行的方法要求指定访问映像、快照或磁盘的路径时,您可以引用远程项目中的映像、快照和磁盘。下面是此类方法的一些示例:

跨项目和组织的共享存储资源

您可以使用以下 IAM 角色或权限共享映像、磁盘和快照的访问权限:

  • 映像:roles/compute.imageUser 角色或 compute.images.useReadOnly 权限。
  • 快照:roles/compute.storageAdmin 角色或 compute.snapshots.useReadOnly 权限。
  • 磁盘:roles/compute.storageAdmin 角色或 compute.disks.useReadOnly 权限。

通过这些角色和权限,您可以独立与项目外的其他团队成员共享各种类型的资源。举例来说,您的公司可能有一个特定项目,其中包含公司其他人可以使用的符合条件的映像。您可以为项目分配一个群组,让其明确负责映像的创建和维护工作。然后,您可以将 roles/compute.imageUser 角色授予其他团队成员,以便这些团队成员可以在他们自己的项目中使用这些映像。

如要授予映像共享角色,请使用 Console、gcloud 命令行工具或 API。如要了解如何使用 IAM,请阅读 IAM 文档

Console

  1. 转到 GCP Console 中的 IAM 页面。

    转到 IAM 页面

  2. 如果出现提示,请选择您的项目。
  3. 如果您要添加新用户,请执行以下步骤:
    1. 点击页面顶部的添加
    2. 提供您要授予访问权限的帐号的一个或多个电子邮件地址。
    3. 将一个或多个角色授予该成员。
      • 从角色选择器中选择 Compute Engine > 计算映像用户
      • 快照和磁盘:从角色选择器中选择 Compute Engine > 计算存储管理员
  4. 保存更改。

gcloud

使用 gcloud 命令行工具,为映像项目的 Cloud IAM 政策添加绑定:

gcloud projects add-iam-policy-binding [PROJECT_ID] \
    --member [MEMBER_TYPE]:[ACCOUNT] --role [ROLE]

其中:

  • [PROJECT_ID] 是包含您要共享的映像的项目 ID。
  • [MEMBER_TYPE] 是您要向其授予访问权限的帐号类型。例如,对个人用户使用 user,对服务帐号使用 serviceAccount,对 Google 群组使用 group
  • [ACCOUNT] 是授予此角色的帐号的电子邮件地址。例如,对于服务帐号,此内容可能为 my-sa@my-project-123.iam.gserviceaccount.com
  • [ROLE] 是您要授予用户的角色。如果是映像,请指定 roles/compute.imageUser。如果是快照和磁盘,请指定 roles/compute.storageAdmin

举例来说,以下命令会将 roles/compute.imageUser 角色授予 john@example.com,以便他们可以访问名为 database-images 的项目中的映像:

gcloud projects add-iam-policy-binding database-images \
    --member user:john@example.com --role roles/compute.imageUser

API

在 API 中,向以下网址发出 POST 请求,其中 [PROJECT_ID] 是包含您要共享的映像的项目 ID。

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

请求主体应该包含您要应用于该项目的绑定列表。该角色应该是绑定的一部分。例如:

{
   "policy": {
       "version": "0",
       "bindings": [
       {
           "role": "roles/compute.admin",
           "members": [
               "user:example@gmail.com"
           ]
       },
       {
           "role": "roles/compute.imageUser",
           "members": [
               "user:john@gmail.com"
           ]
       }
       ]
   }

}

向托管实例组授予对映像的访问权限

通过 Compute Engine,您可以创建托管非托管实例组。如果您创建托管实例组,Compute Engine 将使用 Google API 服务帐号调用 Compute Engine API 并执行与该组相关的操作,例如针对运行状况不佳的实例进行重新创建和更新实例。如果要使用其他项目中的映像创建托管实例组,可以将 compute.imageUser 角色授予 API 服务帐号(该帐号属于创建托管实例组的项目)。

举例来说,假设项目 A 想要使用项目 B 拥有的映像创建托管实例组。项目 B 的所有者必须向项目 A 的 Google API 服务帐号授予项目 B 中的 compute.imageUser 角色。这样会向该帐号授权,使其能够使用项目 B 中的映像在项目 A 中创建托管实例组。

授予 compute.imageUser 角色后,您可以在为该实例组创建实例模板时提供特定映像的网址。

按照以下步骤获取服务帐号电子邮件地址并向该帐号授予访问权限:

  1. 转到要创建托管实例组的项目的 GCP Console 中的 IAM 页面。

    转到 IAM 页面

  2. 如果出现提示,请从列表中选择您的项目。
  3. 查找电子邮件地址采用以下格式的 Google API 服务帐号

    [PROJECT_NUMBER]@cloudservices.gserviceaccount.com
    
  4. 记下上述电子邮件地址。接下来,向该帐号授予对拥有映像的项目的访问权限。

    Console

    1. 在 Google Cloud Platform Console 中,转到包含您要访问的映像的项目的 IAM 页面。

      转到 IAM 页面

    2. 从项目列表中选择项目。
    3. 点击添加按钮添加新成员。
    4. 成员框中,输入服务帐号的电子邮件地址。
    5. 展开角色下拉列表并选择 Compute Engine > 计算映像用户(测试版)
    6. 点击添加以添加帐号。

    gcloud

    使用 gcloud 命令行工具,为项目的 Cloud IAM 政策添加一个绑定:

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

    其中:

    • [PROJECT_ID] 是包含您要共享的映像的项目 ID。
    • [SERVICE_ACCOUNT_EMAIL] 是服务帐号的电子邮件地址。

    例如:

    gcloud projects add-iam-policy-binding database-images \
        --member serviceAccount:123456789012@cloudservices.gserviceaccount.com  \
        --role roles/compute.imageUser

    API

    在 API 中,向以下网址发出 POST 请求,其中 [PROJECT_ID] 是包含您要共享的映像的项目 ID。

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

    请求主体应该包含您要应用于该项目的绑定列表。roles/compute.imageUser 角色应该是绑定的一部分。例如:

    {
       "policy": {
           "version": "0",
           "bindings": [
           {
               "role": "roles/owner",
               "members": [
                   "user:example@gmail.com"
               ]
           },
           {
               "role": "roles/compute.imageUser",
               "members": [
                   "serviceAccount:123456789012@cloudservices.gservbiceaccount.com"
               ]
           }
           ]
       }
    }
    

限制共享映像、磁盘和快照的使用

与其他用户共享映像、磁盘和快照后,您可以控制这些用户使用这些资源的位置。设置 constraints/compute.storageResourceUseRestrictions 限制可以定义允许用户使用存储资源的项目。

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

  1. 查找组织的组织 ID。

    gcloud organizations list
    
  2. 获取组织的现有政策设置。

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

    其中 [ORGANIZATION_ID] 是组织 ID。

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

    constraint: compute.storageResourceUseRestrictions
    listPolicy:
      allowedValues:
        - under:organization/[ORGANIZATION_ID]
    
  4. policy.yaml 文件应用于组织。

    gcloud beta resource-manager org-policies set-policy
    --organization [ORGANIZATION_ID] org-policy.yaml
    

    其中 [ORGANIZATION_ID] 是组织 ID。

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

使用来自其他项目的映像

如果某人向您授予 compute.imageUser 角色,那么您可以在请求中指定映像项目以访问项目中的映像。例如,要获取一系列可供您使用的映像,可以执行以下命令:

gcloud compute images list --project [IMAGE_PROJECT]

如需了解如何使用映像创建新资源(例如创建实例),请参阅创建和启动实例

例如,以下命令会使用项目 database-images 中名为 database-image-a 的映像创建一个实例:

gcloud compute instances create test-instance --image database-image-a --image-project database-images

同样,您可以使用该映像来创建永久性磁盘。如需了解如何使用映像创建磁盘,请参阅创建独立的根永久性磁盘

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Compute Engine 文档