本文档介绍了如何配置批处理作业,以阻止其所有虚拟机或特定容器的外部访问。
屏蔽作业的外部访问,以满足网络要求或提高安全性。如果满足以下任一条件,您必须使用没有外部 IP 地址的虚拟机来阻止作业虚拟机的外部访问:
- 您的项目受到
compute.vmExternalIpAccess
组织政策限制条件的约束。 您为作业指定的网络使用 专用 Google 访问通道 配置与 Google API 和服务的专用连接。 专用 Google 访问通道对具有外部 IP 的虚拟机没有影响 地址。
如果您为作业指定的网络针对批处理使用了专用 Google 访问通道与 VPC Service Controls,请参阅使用 VPC Service Controls 和批处理。
或者,如果您不想阻止对某个作业的所有直接外部访问, 您可以阻止对作业运行的任何容器的外部访问。
更多信息 网络概念以及何时配置网络,请参阅 批量网络概览。
准备工作
- 如果您之前未使用过批处理功能,请参阅开始使用批处理,并完成适用于项目和用户的前提条件,以启用批处理功能。
-
如需获得创建用于屏蔽外部访问的作业所需的权限,请让管理员向您授予以下 IAM 角色:
-
项目的 Batch Job Editor (
roles/batch.jobsEditor
) -
作业的服务账号(默认为默认的 Compute Engine 服务账号)上的 Service Account User (
roles/iam.serviceAccountUser
) -
如需确定作业的网络和子网,请执行以下操作:
Compute Network Viewer (
roles/compute.networkViewer
) 针对项目
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
-
项目的 Batch Job Editor (
-
如果您阻止对作业虚拟机的外部访问,则需要识别该网络,
要使用的资源。您为作业指定的网络(用于阻止其虚拟机的外部访问)必须满足以下要求:
- 该网络是与作业位于同一项目中的 Virtual Private Cloud (VPC) 网络,或者是托管作业项目或与作业项目共享的共享 VPC 网络。
- 该网络包含一个子网 在您想要运行作业的位置。
- 该网络允许您的作业所需的任何访问权限。 如果您阻止对作业虚拟机的外部访问,该网络必须使用 Cloud NAT 或 专用 Google 访问通道 以允许访问作业使用的 API 和服务的网域。 例如,所有作业都使用 Batch API 和 Compute Engine API,并且经常使用 Cloud Logging API。
创建一个作业来阻止所有虚拟机的外部访问
创建作业时,禁止对作业的虚拟机进行外部访问。 禁止外部访问运行作业的所有虚拟机 您需要指定允许作业访问所需 API 的网络和子网。
如果您想在创建此作业时使用虚拟机实例模板,则必须在虚拟机实例模板中指定网络并停用外部 IP 地址。否则,请按照以下步骤使用 gcloud CLI 或 Batch API 阻止对作业虚拟机的外部访问。
gcloud
如需使用 gcloud CLI 创建用于屏蔽外部访问的作业,请选择以下选项之一:
使用 gcloud 标志阻止所有虚拟机的外部访问
如需创建作业并使用 gcloud 标志阻止对作业的外部访问,请执行以下操作: 请完成以下步骤:
创建一个 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" } }
使用
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 配置文件中的字段 禁止所有虚拟机的外部访问,请完成以下步骤:
创建一个 JSON 文件,用于指定作业的配置详细信息。 如需禁止所有虚拟机的外部访问,请执行以下操作:
将
noExternalIpAddress
字段设置为true
。
例如,创建阻止外部访问以下内容的基本脚本作业: 创建一个包含以下内容的 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" } }
替换以下内容:
使用
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
方法
并指定作业的配置详情。
如需禁止所有虚拟机的外部访问,请执行以下操作:
将
noExternalIpAddress
字段设置为true
。在
network
和subnetwork
字段中为作业指定网络。
例如,创建阻止外部访问以下内容的基本脚本作业:
所有虚拟机,请发出以下 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 创建一个作业来阻止对一个或多个容器的外部访问,请完成以下步骤:
创建一个 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" } }
使用
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"
}
}
替换以下内容: