禁止从外部访问作业

本文档介绍了如何将批量作业配置为 所有虚拟机或特定容器的外部访问权限。

禁止从外部访问作业以满足网络要求,或 提高安全性您必须使用 如果满足以下任一条件,则使用没有外部 IP 地址的虚拟机:

或者,如果您不想阻止对某个作业的所有直接外部访问, 您可以阻止对作业运行的任何容器的外部访问。

如需详细了解网络概念以及何时配置网络,请参阅批处理网络概览

准备工作

  1. 如果您以前没有使用过 Batch,请参阅 Batch 使用入门 并通过填写 针对项目和用户的前提条件
  2. 为了获得创建阻止外部访问的作业所需的权限, 请让管理员授予您 以下 IAM 角色:

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

    您也可以通过自定义角色或其他预定义角色来获取所需的权限。

  3. 如果您阻止对作业虚拟机的外部访问,则需要识别该网络, 要使用的资源。您为要处理的作业指定的 必须满足以下要求,才能禁止其虚拟机进行外部访问:
    • 该网络是 虚拟私有云 (VPC) 网络,位于 项目与作业相同,或者属于 共享 VPC 网络 (由作业的项目托管或与其共享)。
    • 该网络包含一个子网 在您想要运行作业的位置。
    • 该网络允许您的作业所需的任何访问权限。 如果您阻止对作业虚拟机的外部访问,该网络必须使用 Cloud NAT专用 Google 访问通道 以允许访问作业使用的 API 和服务的网域。 例如,所有作业都使用 Compute Engine API,通常使用 Cloud Logging API。
    有关详情,请参阅创建 和管理 VPC 网络

创建阻止所有虚拟机的外部访问的作业

创建作业时,禁止对作业的虚拟机进行外部访问。 禁止外部访问运行作业的所有虚拟机 您需要指定允许作业访问所需 API 的网络和子网。

如果您想 在创建此作业时使用虚拟机实例模板, 您必须指定网络并停用 虚拟机实例模板。否则,请按照以下步骤屏蔽外部网域 对作业虚拟机的访问 gcloud CLI 或 Batch API。

gcloud

要使用 gcloud CLI,请选择以下选项之一:

使用 gcloud 标志阻止所有虚拟机的外部访问

如需创建作业并使用 gcloud 标志阻止对作业的外部访问,请完成以下步骤:

  1. 创建一个 JSON 文件,用于指定作业的配置详细信息。

    例如,如需创建基本的脚本作业,您可以使用 下列内容。

    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "script": {
                  "text": "echo Hello world! This is task ${BATCH_TASK_INDEX}. This job has a total of ${BATCH_TASK_COUNT} tasks."
                }
              }
            ]
          },
          "taskCount": 3
        }
      ],
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    
  2. 使用 gcloud batch jobs submit 命令创建作业。 如需阻止所有虚拟机的外部访问,请添加 --no-external-ip-address--network--subnetwork 标志。

    gcloud batch jobs submit JOB_NAME \
        --location LOCATION \
        --config JSON_CONFIGURATION_FILE \
        --no-external-ip-address \
        --network projects/HOST_PROJECT_ID/global/networks/NETWORK \
        --subnetwork projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET
    

    替换以下内容:

    • JOB_NAME:此作业的名称。
    • LOCATION: 此招聘信息的位置
    • JSON_CONFIGURATION_FILE: 包含作业配置详情的 JSON 文件。
    • HOST_PROJECT_ID:您指定的网络对应的项目的项目 ID
      • 如果您使用的是共享 VPC 网络,请指定主机 项目。
      • 否则,请指定当前项目。
    • NETWORK:当前项目中的 VPC 网络的名称,或由当前项目托管或与当前项目共享的共享 VPC 网络的名称。
    • REGION: 子网和虚拟机所在的区域 位于:
      • 如果您将 allowedLocations 字段 为作业指定允许的虚拟机位置, 必须指定同一区域。
      • 否则,区域必须与 您为作业选择的位置 (LOCATION).
    • SUBNET子网,属于 该 VPC 网络与 作业的虚拟机数量。

使用 JSON 字段阻止所有虚拟机的外部访问

如需创建作业并使用 JSON 配置文件中的字段 禁止所有虚拟机的外部访问,请完成以下步骤:

  1. 创建一个 JSON 文件,用于指定作业的配置详细信息。 如需阻止所有虚拟机的外部访问,请执行以下操作:

    例如,创建阻止外部访问以下内容的基本脚本作业: 创建一个包含以下内容的 JSON 文件。

    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "script": {
                  "text": "echo Hello world! This is task ${BATCH_TASK_INDEX}. This job has a total of ${BATCH_TASK_COUNT} tasks."
                }
              }
            ]
          },
          "taskCount": 3
        }
      ],
      "allocationPolicy": {
        "network": {
          "networkInterfaces": [
            {
              "network": "projects/HOST_PROJECT_ID/global/networks/NETWORK",
              "subnetwork": "projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET",
              "noExternalIpAddress": true
            }
          ]
        }
      },
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    

    替换以下内容:

    • HOST_PROJECT_ID:您指定的网络对应的项目的项目 ID
      • 如果您使用的是共享 VPC 网络,请指定主机 项目。
      • 否则,请指定当前项目。
    • NETWORK:提供 此作业所需的访问权限。广告网络必须是 当前项目中的 VPC 网络共享 VPC 网络 由当前项目托管或与当前项目共享的项目。
    • REGION: 子网和虚拟机所在的区域 位于:
      • 如果您添加 allowedLocations 字段来指定作业虚拟机的允许位置,则必须在此处指定相同的区域。
      • 否则,区域必须与 您为作业选择的位置 (LOCATION).
    • SUBNET子网,属于 该 VPC 网络与 作业的虚拟机数量。
  2. 使用 gcloud batch jobs submit 命令创建作业。

    gcloud batch jobs submit JOB_NAME \
        --location LOCATION \
        --config JSON_CONFIGURATION_FILE
    

    替换以下内容:

    • JOB_NAME:您要为此作业指定的名称。
    • LOCATION: 您想要用于此作业的位置
    • JSON_CONFIGURATION_FILE: 包含作业配置详情的 JSON 文件。

API

要使用 Batch API 创建作业,请使用 jobs.create 方法 并指定作业的配置详情。 如需阻止所有虚拟机的外部访问,请执行以下操作:

例如,创建阻止外部访问以下内容的基本脚本作业: 所有虚拟机,请发出以下 POST 请求:

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME

{
  "taskGroups": [
    {
      "taskSpec": {
        "runnables": [
          {
            "script": {
              "text": "echo Hello world! This is task ${BATCH_TASK_INDEX}. This job has a total of ${BATCH_TASK_COUNT} tasks."
            }
          }
        ]
      },
      "taskCount": 3
    }
  ],
  "allocationPolicy": {
    "network": {
      "networkInterfaces": [
        {
          "network": "projects/HOST_PROJECT_ID/global/networks/NETWORK",
          "subnetwork": "projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET",
          "noExternalIpAddress": true
        }
      ]
    }
  },
  "logsPolicy": {
    "destination": "CLOUD_LOGGING"
  }
}

替换以下内容:

  • PROJECT_ID项目 ID 项目名称
  • LOCATION位置 所需的资源
  • JOB_NAME:您要为此作业指定的名称。
  • HOST_PROJECT_ID:您指定的网络对应的项目的项目 ID
    • 如果您使用的是共享 VPC 网络,请指定宿主项目。
    • 否则,请指定当前项目 (PROJECT_ID)。
  • NETWORK:提供 此作业所需的访问权限。广告网络必须是 当前项目中的 VPC 网络共享 VPC 网络 由当前项目托管或与当前项目共享的项目。
  • REGION: 子网和虚拟机所在的区域 位于:
    • 如果您将 allowedLocations 字段 为作业指定允许的虚拟机位置, 必须指定同一区域。
    • 否则,区域必须与 您为作业选择的位置 (LOCATION).
  • SUBNET子网,属于 该 VPC 网络与 作业的虚拟机数量。

创建阻止从外部访问一个或多个容器的作业

创建作业时,禁止对作业的任何容器进行外部访问 作业。

您可以使用 gcloud CLI 或 Batch API。

gcloud

创建阻止对一个或多个容器进行外部访问的作业 使用 gcloud CLI,请完成以下步骤:

  1. 创建一个 JSON 文件,用于指定作业的配置详细信息。 对于作业中您要限制的每个容器,设置 blockExternalNetwork 字段 发送至 true

    例如,创建一个阻止外部 创建一个包含以下内容的 JSON 文件。

    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "container": {
                  "imageUri": "gcr.io/google-containers/busybox",
                  "entrypoint": "/bin/sh",
                  "commands": [
                    "-c",
                    "echo Hello world! This is task ${BATCH_TASK_INDEX}. This job has a total of ${BATCH_TASK_COUNT} tasks."
                  ],
                  "blockExternalNetwork": true
                }
              }
            ]
          },
          "taskCount": 4,
          "parallelism": 2
        }
      ],
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    
  2. 使用 gcloud batch jobs submit 命令创建作业。

    gcloud batch jobs submit JOB_NAME \
        --location LOCATION \
        --config JSON_CONFIGURATION_FILE
    

    替换以下内容:

    • JOB_NAME:您要为此作业指定的名称。
    • LOCATION: 您想要用于此作业的位置
    • JSON_CONFIGURATION_FILE: 包含作业配置详情的 JSON 文件。

API

要使用 Batch API 创建作业,请使用 jobs.create 方法 并指定作业的配置详情。 对于作业中您要限制的每个容器,设置 blockExternalNetwork 字段 发送至 true

例如,如需创建一个会阻止容器外部访问的基本容器作业,请发出以下 POST 请求:

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME

{
  "taskGroups": [
    {
      "taskSpec": {
        "runnables": [
          {
            "container": {
              "imageUri": "gcr.io/google-containers/busybox",
              "entrypoint": "/bin/sh",
              "commands": [
                "-c",
                "echo Hello world! This is task ${BATCH_TASK_INDEX}. This job has a total of ${BATCH_TASK_COUNT} tasks."
              ],
              "blockExternalNetwork": true
            }
          }
        ]
      },
      "taskCount": 4,
      "parallelism": 2
    }
  ],
  "logsPolicy": {
    "destination": "CLOUD_LOGGING"
  }
}

替换以下内容:

  • PROJECT_ID项目 ID 项目名称
  • LOCATION位置 所需的资源
  • JOB_NAME:您要为此作业指定的名称。

后续步骤