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