预留静态外部 IP 地址

如果虚拟机实例需要固定不变的外部 IP 地址,则您可以使用以下方式之一为该实例获取静态外部 IP 地址:

如果您的内部 Compute Engine 网络中需要静态 IP 地址,另请参阅预留静态内部地址

在 Compute Engine 中,每个虚拟机实例都可以有多个网络接口。每个接口可以同时拥有内部和外部 IP 地址。转发规则可以拥有用于外部负载平衡的外部 IP 地址,或用于内部负载平衡的内部地址。如需了解 IP 地址,请参阅 IP 地址文档。

准备工作

预留新的静态外部 IP 地址

静态外部 IP 地址是为您的项目预留的外部 IP 地址(直到您决定将其释放)。如果您有一个客户或用户要用来访问您服务的 IP 地址,就可以预留该 IP 地址,以仅供您的项目使用。您也可以将临时外部 IP 地址升级为静态外部 IP 地址。

您可以预留下面两种类型的外部 IP 地址:

可借助 gcloud 命令行工具或通过 API 预留静态外部 IP 地址。预留该地址后,请在创建实例期间将其分配给实例,或将其分配给现有实例

限制

  • 一次只能有一个资源使用某个静态外部 IP 地址。

  • IP 地址分配给资源后,除非将 IP 地址与为相关项目预留的静态外部 IP 地址列表进行比较,否则无法分辨该 IP 地址是静态地址还是临时地址。如需查看项目可用的静态外部 IP 地址列表,请使用 addresses list 子命令。

  • 每个虚拟机实例都可以有多个网络接口,但每个接口只能有一个临时或静态外部 IP 地址。

注意:网络接口可以接收来自多个转发规则的流量,这些转发规则可能适用于其他外部 IP 地址。任意数量的外部 IP 地址都可以通过这些转发规则来引用某个网络接口,但每个网络接口只能拥有一个可将数据包转换成该接口的内部 IP 地址的外部 IP 地址。

如需详细了解负载平衡和转发规则,请参阅负载平衡文档。

控制台

  1. 在 Cloud Console 中,转到预留静态地址页面。

    转到“预留静态地址”页面

  2. 为新地址选择一个名称。

  3. 指定该地址为 IPv4 地址还是 IPv6 地址。IPv6 地址仅限为全球地址,只适用于全球 HTTP(S)、SSL 代理和 TCP 代理负载平衡器。

  4. 选择此 IP 地址是地区地址还是全球地址。如果您要为实例或网络负载平衡器预留静态 IP 地址,请选择地区。如果您要为 HTTP(S)、SSL 代理或 TCP 代理负载平衡器预留静态 IP 地址,请选择全球

  5. 如果该地址为地区 IP 地址,请选择要在其中创建地址的地区。

  6. (可选)选择一个资源来附加该 IP 地址。

  7. 点击预留以预留该 IP 地址。

gcloud

如需使用 gcloud compute 预留静态外部 IP 地址,请使用 compute addresses create 命令

如果要预留全球 IP 地址,请使用 --global--ip-version 字段。对于 --ip-version 字段,请指定 IPV4IPV6IPv6 地址仅限为全球地址,只适用于全球 HTTP(S)、SSL 代理和 TCP 代理负载平衡器。

ADDRESS_NAME 替换为您要此地址指定的名称。

gcloud compute addresses create ADDRESS_NAME \
    --global \
    --ip-version [IPV4 | IPV6]

如果要预留地区 IP 地址,请使用 --region 字段:

gcloud compute addresses create ADDRESS_NAME \
    --region REGION

替换以下内容:

  • ADDRESS_NAME:您要为此地址指定的名称。
  • REGION:请求所需的 IP 地址。该地区应与您要将该 IP 地址关联到的资源相同。所有地区 IP 地址均为 IPV4

使用 compute addresses describe 命令可以查看结果:

gcloud compute addresses describe ADDRESS_NAME

API

如需创建地区 IPv4 地址,请调用地区 addresses.insert 方法

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/addresses

请求正文应包含以下内容:

{
  name: "ADDRESS_NAME"
}

替换以下内容:

  • ADDRESS_NAME:您要为该地址指定的名称。
  • REGION:此请求的地区名称。
  • PROJECT_ID:此请求的项目 ID。

对于全球静态 IPv4 地址,请调用 globalAddresses.insert 方法

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/addresses

请求正文应包含以下内容:

{
  name: "ADDRESS_NAME"
}

对于全球静态 IPv6 地址,请调用 globalAddresses.insert 方法

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/addresses

请求正文应包含以下内容:

{
  "name": "ADDRESS_NAME",
  "ipVersion": "IPV6"
}

使用 addresses.get 方法可以查看结果。

为新的虚拟机实例分配静态外部 IP 地址

在您创建虚拟机实例时,系统会自动为其分配一个临时外部 IP 地址。如果您不想使用临时外部 IP 地址,可以为该实例明确分配一个静态外部 IP 地址。

控制台

  1. 在 Cloud Console 中,转到虚拟机实例页面。

    转到“虚拟机实例”

  2. 点击创建实例
  3. 创建新实例页面上,填写实例的属性。
  4. 展开管理、安全、磁盘、网络、单独租用部分。
  5. 点击网络
  6. 网络接口下方,点击默认网络接口以进行修改。
  7. 外部 IP 部分下方,从下拉菜单中选择您预留的静态外部 IP 地址。
  8. 点击完成,即可完成对默认网络接口的修改。
  9. 点击创建以创建实例。

gcloud

如需分配静态外部 IP 地址,请在创建实例期间使用 --address 标志并提供该静态外部 IP 地址:

gcloud compute instances create INSTANCE_NAME --address IP_ADDRESS

替换以下内容:

  • INSTANCE_NAME:实例的名称。
  • IP_ADDRESS:分配给实例的 IP 地址。请使用 IP 地址,而非地址名称。

API

在您创建新实例的请求中,明确提供 networkInterfaces[].accessConfigs[].natIP 属性和您要使用的外部 IP 地址。例如:

{
  "name": "INSTANCE_NAME",
  "machineType": "zones/ZONE/machineTypes/MACHINE_TYPE",
  "networkInterfaces": [{
    "accessConfigs": [{
      "type": "ONE_TO_ONE_NAT",
      "name": "External NAT",
      "natIP": "IP_ADDRESS"
     }],
    "network": "global/networks/default"
  }],
  "disks": [{
     "autoDelete": "true",
     "boot": "true",
     "type": "PERSISTENT",
     "initializeParams": {
        "sourceImage": "projects/debian-cloud/global/images/v20150818"
     }
   }]
 }

为现有实例更改或分配外部 IP 地址

您可以通过修改现有实例的访问配置,来为该实例更改或分配外部 IP 地址(临时或静态)。

一个实例可以有多个接口,每个接口可以有一个外部 IP 地址。如果实例已有一个外部 IP 地址,您必须通过删除旧的访问配置先移除该地址。然后,您就可以添加使用新外部 IP 地址的新访问配置了。

控制台

  1. 在 Cloud Console 中,转到虚拟机实例页面。

    转到“虚拟机实例”页面

  2. 点击要为其分配外部 IP 地址的实例的名称。 此时将显示实例详细信息页面。
  3. 在实例详细信息页面中,完成以下步骤:

    1. 点击修改
    2. 网络接口下,点击修改按钮。

      网络接口部分。

    3. 外部 IP 下方,选择要为该实例分配的临时或静态外部 IP 地址。

      内部和外部 IP 选项。

    4. 点击完成

    5. 点击保存

gcloud

  1. [可选] 预留静态外部 IP 地址。

    如果要分配一个静态外部 IP 地址,必须预留一个地址并确保该地址当前未被其他资源使用。视需要按照说明操作,选择预留新的静态外部 IP 地址取消分配静态外部 IP 地址

    如果打算使用临时外部 IP 地址,可以跳过此步骤,Compute Engine 会随机分配一个临时外部 IP 地址。

  2. 删除现有的访问配置。

    您可以为每个实例设置一个访问配置。在尝试为实例分配新的访问配置之前,请通过发出 gcloud compute instances describe 请求来检查您的实例是否已有访问配置:

    gcloud compute instances describe INSTANCE_NAME

    如果已有访问配置,则访问配置将以如下格式显示:

    networkInterfaces:
    - accessConfigs:
      - kind: compute#accessConfig
        name: external-nat
        natIP: 130.211.181.55
        type: ONE_TO_ONE_NAT
    

    在添加新的访问配置之前,您必须使用 instances delete-access-config 子命令删除现有访问配置:

    gcloud compute instances delete-access-config INSTANCE_NAME \
        --access-config-name "ACCESS_CONFIG_NAME"

    替换以下内容:

    • INSTANCE_NAME:实例的名称。
    • ACCESS_CONFIG_NAME:要删除的访问配置。请确保用引号括住全名。
  3. 添加新的外部 IP 地址。

    使用 instances add-access-config 子命令可以添加新的外部 IP 地址:

    注意:请勿将 IP_ADDRESS 替换为静态 IP 的名称。您必须使用实际 IP 地址。
    gcloud compute instances add-access-config INSTANCE_NAME \
       --access-config-name "ACCESS_CONFIG_NAME" --address IP_ADDRESS

    替换以下内容:

    • INSTANCE_NAME:实例的名称。
    • ACCESS_CONFIG_NAME:此访问配置的名称。请确保用引号括住全名。
    • IP_ADDRESS:要添加的 IP 地址。

    如果您希望 Compute Engine 分配临时外部 IP 地址,而非使用静态外部 IP 地址,请忽略 --address IP_ADDRESS 属性:

    gcloud compute instances add-access-config INSTANCE_NAME \
        --access-config-name "ACCESS_CONFIG_NAME"

升级临时外部 IP 地址

如果您的实例具有临时外部 IP 地址,并且您想将该 IP 永久分配给您的项目,请将该临时外部 IP 地址升级为静态外部 IP 地址。将临时外部 IP 地址升级为预留的外部 IP 地址不会导致 Google Cloud 丢弃发送到实例的数据包。这包括直接发送或通过负载平衡器发送到实例的数据包。

控制台

  1. 在 Cloud Console 中,转到外部 IP 地址页面。

    转到“外部 IP 地址”页面

  2. 类型列中,将要升级的 IP 地址的地址类型更改为静态
  3. 为新的静态 IP 地址提供一个名称,然后点击预留

gcloud

如需将临时外部 IP 地址升级为静态外部 IP 地址,请在 compute addresses create 命令中使用 --addresses 标志来提供临时外部 IP 地址。可以使用 region 标志升级临时地区 IP 地址,或者可以使用 global 标志升级临时全球 IP 地址。

gcloud compute addresses create ADDRESS_NAME \
  --addresses IP_ADDRESS \
  [--region REGION | --global]

替换以下内容:

  • ADDRESS_NAME:您要为此地址指定的名称。
  • IP_ADDRESS:您要升级的 IP 地址。
  • REGION:地区 IP 地址所属的地区。

API

如需升级临时地区 IP 地址,请调用 addresses.insert 方法

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/addresses

请求正文应包含以下内容:

{
  name: "ADDRESS_NAME",
  address: "IP_ADDRESS"
}

替换以下内容:

  • ADDRESS_NAME:您要为此地址指定的名称。
  • IP_ADDRESS:您要升级的 IP 地址。
  • REGION:IP 地址所属的地区。
  • PROJECT_ID:此请求的项目 ID。

如需升级临时全球 IP 地址,请向以下 URI 发出 POST 请求:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/addresses

请求正文应包含以下内容:

{
  name: "ADDRESS_NAME",
  address: "IP_ADDRESS"
}

替换以下内容:

  • ADDRESS_NAME:您要为此地址指定的名称。
  • IP_ADDRESS:您要升级的 IP 地址。
  • PROJECT_ID:此请求的项目 ID。

即使在外部 IP 地址升级为静态外部 IP 地址后,该地址仍然会附加到相关实例。如果您需要将这个新升级的静态外部 IP 地址分配给另一个资源,请为现有实例取消分配该静态外部 IP 地址

列出静态外部 IP 地址

如需列出为项目预留的静态外部 IP 地址,请运行 addresses list 或向 API 发出 GET 请求。

控制台

在 Cloud Console 中,转到外部 IP 地址页面,以查看项目的 IP 地址列表。

转到“外部 IP 地址”页面

gcloud

使用 compute addresses list 命令

gcloud compute addresses list

API

调用 addresses.list 方法

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/addresses

替换以下内容:

  • REGION:此请求的地区名称。
  • PROJECT_ID:此请求的项目 ID。

如需列出所有地区的所有地址,请调用 aggregatedList 方法

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/aggregated/addresses

描述静态外部 IP 地址

如需获取有关静态外部 IP 地址的信息,请使用控制台、gcloud 工具或 API。

控制台

  1. 在 Cloud Console 中,转到外部 IP 地址页面。

    转到“外部 IP 地址”页面

  2. 点击要详细了解的 IP 地址。

gcloud

使用 addresses describe 命令并将 ADDRESS_NAME 替换为您要描述的外部 IP 地址的名称。

gcloud compute addresses describe ADDRESS_NAME

API

调用 addresses.get 方法

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/addresses/ADDRESS_NAME

替换以下内容:

  • ADDRESS_NAME:IP 地址的名称。
  • REGION:此请求的地区名称。
  • PROJECT_ID:此请求的项目 ID。

取消分配静态外部 IP 地址

您可以取消分配静态外部 IP 地址,只需删除实例,或者删除使用该地址的实例上附加的访问配置即可。通过取消分配静态外部 IP 地址,您可以将静态外部 IP 地址重新分配给另一个资源。

取消分配某个 IP 地址后,系统会将其从资源中移除,但会保留为您的项目预留的 IP 地址。您可以通过执行 gcloud compute addresses list 请求来判断静态 IP 地址是否正在使用中:

gcloud compute addresses list

响应可能如下所示:

NAME                 REGION      ADDRESS            STATUS
example-address      REGION    130.211.160.207    RESERVED
example-address-new  REGION    130.211.114.137    IN_USE

对于此示例,example-address-new 目前正在使用中。

如需删除实例的访问配置并取消分配静态外部 IP 地址,请按照以下步骤进行操作:

  1. 获取要删除的访问配置的名称。如需获取名称,请使用 gcloud compute instances describe 命令。将 INSTANCE_NAME 替换为实例名称。

    gcloud compute instances describe INSTANCE_NAME

    访问配置将以如下格式显示:

    networkInterfaces:
    - accessConfigs:
     - kind: compute#accessConfig
       name: external-nat
       natIP: 130.211.181.55
       type: ONE_TO_ONE_NAT
    
  2. 删除访问配置。

    使用 instances delete-access-config 命令

    gcloud compute instances delete-access-config INSTANCE_NAME \
            --access-config-name "ACCESS_CONFIG_NAME"

    替换以下内容:

    • INSTANCE_NAME:实例的名称。
    • ACCESS_CONFIG_NAME:要删除的访问配置的名称。请确保用引号括住全名。
  3. 检查静态外部 IP 地址目前是否可以使用,以及是否标记为 RESERVED 而非 IN_USE

    gcloud compute addresses list

    例如:

    NAME                 REGION      ADDRESS            STATUS
    example-address      REGION      130.211.160.207    RESERVED
    example-address-new  REGION      130.211.114.137    RESERVED

现在已确认静态外部 IP 地址可以使用,您便可选择将其分配给另一个实例

释放静态外部 IP 地址

如果您不再需要某个静态外部 IP 地址,可以释放该地址,以便将其返回常规 IP 池中,供其他 Compute Engine 用户使用。

控制台

  1. 在 Cloud Console 中,转到外部 IP 地址页面。

    转到“外部 IP 地址”页面

  2. 选中要释放的 IP 地址旁边的复选框。
  3. 点击释放 IP 地址

gcloud

使用 compute addresses delete 命令。将 ADDRESS_NAME 替换为要释放的 IP 地址的名称。

gcloud compute addresses delete ADDRESS_NAME

API

调用 addresses.delete 方法

DELETE https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/addresses/ADDRESS_NAME

替换以下内容:

  • ADDRESS_NAME:IP 地址的名称。
  • REGION:此请求的地区名称。
  • PROJECT_ID:此请求的项目 ID。

将外部 IP 地址仅用于特定虚拟机实例

对于某些工作负载,您可能有安全和网络限制等方面的基本要求。例如,您可能希望限制外部 IP 地址的用途,以便只有特定的虚拟机实例才能使用这些地址。此方式有助于防止数据渗漏或者有助于维持网络隔离状态。借助组织政策,您可以在某些限制条件下将外部 IP 地址仅用于特定的虚拟机实例,以控制组织或项目中的虚拟机实例对外部 IP 地址的使用。

用于控制虚拟机实例的外部 IP 地址的限制如下:

constraints/compute.vmExternalIpAccess

如需使用该限制,请指定一个包含 allowedList 列表的政策,该列表中列出了可以具有外部 IP 地址的虚拟机实例。如果未指定政策,则允许所有虚拟机实例使用所有外部 IP 地址。政策实施后,只有 allowedValues 列表中列出的虚拟机实例才能获得外部 IP 地址(临时或静态),组织或项目中其他未在政策中明确定义的 Compute Engine 虚拟机实例会被禁止使用外部 IP 地址。

系统根据实例的 URI 在许可和拒绝名单中识别虚拟机:

projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME

规范

  • 您只能将此列表限制应用于虚拟机实例。
  • 您不能追溯应用限制。政策启用前,具有外部 IP 地址的所有虚拟机实例都将保留其外部 IP 地址。
  • 此限制在同一个政策中只接受 allowedListdeniedList 其中之一,不能同时接受。
  • 由您或拥有适当权限的管理员负责管理和维护实例生命周期和完整性。限制条件仅用于验证实例的 URI,而不会阻止系统更改、删除或重新创建许可名单虚拟机。

权限

如需在项目级层或组织级层设置限制,您必须已被授予组织的 orgpolicy.policyAdmin 角色。

在组织级层设置政策限制

如需为外部 IP 访问权限设置限制,您首先需要查找组织 ID。

查找您的组织 ID

控制台

您也可以在 Google Cloud Console 上查找 ID:

  1. 登录 Google Cloud Console
  2. 点击项目选择器。

    组织和项目选择器。

  3. 选择组织,然后查找组织 ID。

    组织 ID。

gcloud

您可以通过运行 organizations list 命令并在响应中查找 ID 来找到数字 n:

gcloud organizations list

gcloud 工具会返回如下内容:

DISPLAY_NAME           ID
example-organization   29252605212

设置您的政策限制

控制台

  1. 转到组织政策页面。

    转到“组织政策”页面

  2. 如有必要,请从项目下拉菜单中选择所需的组织。
  3. 点击为虚拟机实例定义许可的外部 IP
  4. 点击修改以修改外部 IP 政策。如果您无法访问修改工具,则表示您没有正确的权限
  5. 选择 CPU 平台和 GPU,为特定的虚拟机实例设置具体的组织政策。

    自定义组织政策。

  6. 选择所需的强制执行政策政策类型

  7. 政策值下方,选择自定义

  8. 输入虚拟机实例的 URI,然后按 Enter 键。URI 必须具有以下格式:

    projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME
    
  9. 根据需要继续输入虚拟机实例。

  10. 点击保存以保存更改。

gcloud

使用 gcloud beta resource-manager org-policies set-policy 命令可以设置政策。您将需要以 JSON 文件的形式提供政策。创建一个与以下内容类似的 JSON 文件:

{
"constraint": "constraints/compute.vmExternalIpAccess",
"listPolicy": {
  "allowedValues": [
     "projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME",
     "projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME",
     "projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME"
  ]
 }
}

替换以下内容:

  • PROJECT_ID:此请求的项目 ID,例如 example-project。请注意,设置项目 ID 与设置组织政策不同,设置组织政策时需要使用组织的数字 ID。
  • ZONE:实例的区域。
  • INSTANCE_NAME:实例名称。

或者,您可以指定 deniedValues 列表来指示您希望明确禁止其拥有外部 IP 地址的虚拟机实例。列表中没有列出的实例可隐式拥有外部 IP 地址。您只能指定 allowedValuesdeniedValues,但不能同时指定这两者。

然后,使用请求传入该文件:

gcloud beta resource-manager org-policies set-policy MY_POLICY.JSON --organization ORGANIZATION_ID

ORGANIZATION_ID 替换为组织的数字 ID。

如果您不希望任何实例具有外部 IP 访问权限,您可以设置一个政策,并将 allValues 设置为 DENY

{
  "constraint": "constraints/compute.vmExternalIpAccess",
  "listPolicy": {
    "allValues": "DENY"
  }
}

API

使用 setOrgPolicy() API 定义您的限制。您指定的 allowedValue 列表中的虚拟机可以拥有外部 IP 地址。或者,您可以指定 deniedValues 列表来指示您希望明确禁止其拥有外部 IP 地址的虚拟机实例。列表中没有列出的实例可隐式拥有外部 IP 地址。您只能指定 allowedValuesdeniedValues,但不能同时指定这两者。

例如,以下请求针对组织设置了 compute.vmExternalIpAccess 限制,允许组织内某些项目中的虚拟机实例拥有外部 IP 地址:

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

其中 ORGANIZATION_ID 是组织的数字 ID。

现在,在请求正文中,提供此限制所需的政策:

{
  "policy": {
    "constraint": "constraints/compute.vmExternalIpAccess",
    "listPolicy": {
      "allowedValues": [
        "projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME",
        "projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME",
        "projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME"
        ]
      }
    }
 }

如果您不希望任何实例具有外部 IP 访问权限,您可以设置一个政策,并将 allValues 设置为 DENY

{
  "policy": {
    "constraint": "constraints/compute.vmExternalIpAccess",
    "listPolicy": {
      "allValues": "DENY"
      }
    }
 }

在项目级层设置政策

在项目级层设置的政策会替换组织级层的政策。例如,如果在组织级层政策的 allowedValues 列表中含有 example-vm-1,但在项目级层政策的 deniedValues 列表中含有同一虚拟机,则该虚拟机实例不允许拥有外部 IP 地址。

控制台

按照设置组织级层的政策限制下记录的相同流程进行操作,只是要从项目(而非组织)选择器中选择您所需的项目。

项目选择器。

gcloud

使用 gcloud beta resource-manager org-policies set-policy 命令可以设置政策。您将需要以 JSON 文件的形式提供政策。创建一个与以下内容类似的 JSON 文件:

{
 "constraint": "constraints/compute.vmExternalIpAccess",
 "listPolicy": {
  "allowedValues": [
   "projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME"
  ]
 }
}

替换以下内容:

  • PROJECT_ID:此请求的项目 ID,例如 example-project。请注意,设置项目 ID 与设置组织政策不同,设置组织政策时需要使用组织的数字 ID。
  • ZONE:实例的区域。
  • INSTANCE_NAME:实例名称。

或者,您可以指定您希望明确禁止其拥有外部 IP 地址的虚拟机实例的 deniedValues 列表。列表中没有列出的实例可隐式拥有外部 IP 地址。您只能指定 allowedValuesdeniedValues,但不能同时指定这两者。

然后,使用请求传入该文件:

gcloud beta resource-manager org-policies set-policy MY_POLICY.JSON --project example-project

API

使用 setOrgPolicy() API 定义您的限制。您指定的 allowedValue 列表中的虚拟机可以拥有外部 IP 地址。或者,您可以指定 deniedValues 列表来指示您希望明确禁止其拥有外部 IP 地址的虚拟机实例。列表中没有列出的实例可隐式拥有外部 IP 地址。您只能指定 allowedValuesdeniedValues,但不能同时指定这两者。

例如,以下请求针对项目设置了 compute.vmExternalIpAccess 限制,允许特定虚拟机实例拥有外部 IP 地址:

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

PROJECT_ID 替换为此请求的项目 ID。

请求正文包含此限制的所需政策:

{
 "policy": {
  "constraint": "constraints/compute.vmExternalIpAccess",
  "listPolicy": {
   "allowedValues": [
    "projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME"
   ]
  }
 }
}

最佳做法

  • Google 建议您不要将 deniedValues 列表与此限制一起使用。如果您在 deniedValues 列表中定义了值,这意味着只有 deniedValues 列表中的虚拟机实例被禁止使用外部 IP 地址。如果您想准确控制可以拥有外部 IP 地址的实例,那么这可能会产生安全问题。如果您要从 allowedValues 列表中移除某些实例,请更新现有政策以从 allowedList 中移除实例,而不是将实例放到较低层次结构的 deniedValues 列表中。

  • 如果您希望针对大部分资源层次结构设置政策,但要排除某些项目,则应使用 setOrgPolicy 方法恢复默认政策,只需指定 restoreDefault 对象以允许项目中的所有虚拟机与外部 IP 地址关联即可。目前已用于项目的政策不会受此默认设置的影响。

  • 将此组织政策与 IAM 角色一起使用可以更好地控制您的环境。 此政策仅适用于虚拟机实例,但如果您想更好地控制和限制网络设备的外部 IP 地址,可以将 compute.networkAdmin 角色授予有关方。

  • 如果启用了政策的组织或项目中有任何服务和产品正在 Compute Engine 上运行,则这些服务和产品受此组织政策的约束。具体而言,Google Kubernetes Engine、Dataflow、Dataproc 和 Cloud SQL 等服务受此政策的影响。如果因此导致问题,Google 建议在未应用组织政策的其他项目中设置其他服务和产品,并根据需要使用跨项目网络

后续步骤