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