本文說明如何設定 Batch 工作,以封鎖所有 VM 或特定容器的外部存取權。
封鎖工作外部存取權,以符合網路需求或提升安全性。如果符合下列任一條件,您必須使用沒有外部 IP 位址的 VM,封鎖作業 VM 的外部存取權:
- 您的專案受到
compute.vmExternalIpAccess
組織政策限制。 您為作業指定的網路會使用私人 Google 存取權,設定與 Google API 和服務的私人連線。私人 Google 存取權不影響具有外部 IP 位址的 VM。
如果為作業指定的網路使用 Private Google Access with VPC Service Controls for Batch,請參閱「Use VPC Service Controls and Batch」(使用 VPC Service Controls 和 Batch)。
或者,如果您不想封鎖作業的所有外部直接存取權,可以封鎖作業執行的任何容器的外部存取權。
如要進一步瞭解網路概念和設定網路的時機,請參閱 Batch 網路總覽。
事前準備
- 如果您從未使用過 Batch,請參閱「開始使用 Batch」,並完成專案和使用者的必要條件,啟用 Batch。
-
如要取得建立工作所需的權限,請管理員授予下列 IAM 角色:
-
批次工作編輯者 (
roles/batch.jobsEditor
) 專案 -
服務帳戶使用者 (
roles/iam.serviceAccountUser
) 在作業的服務帳戶上,預設為預設 Compute Engine 服務帳戶 -
如要找出作業的網路和子網路:
專案的 Compute 網路檢視者 (
roles/compute.networkViewer
)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
-
批次工作編輯者 (
-
如果封鎖工作 VM 的外部存取權,您需要找出要用於工作的網路。為禁止 VM 外部存取的工作指定網路時,必須符合下列規定:
- 網路是與作業位於相同專案的虛擬私有雲 (VPC) 網路,或是由作業專案代管或與該專案共用的共用虛擬私有雲網路。
- 網路包含您要執行工作的地點中的子網路。
- 這個網路可提供工作所需的任何存取權。 如果封鎖作業 VM 的外部存取權,網路就必須使用 Cloud NAT 或私人 Google 存取權,才能存取作業使用的 API 和服務網域。舉例來說,所有工作都會使用 Batch 和 Compute Engine API,而且經常使用 Cloud Logging API。
建立工作,封鎖所有 VM 的外部存取權
建立工作時,封鎖工作 VM 的外部存取權。 如果封鎖工作執行所在的所有 VM 的外部存取權,您也必須指定網路和子網路,允許工作存取必要的 API。
如要在建立這項作業時使用 VM 執行個體範本,您必須在 VM 執行個體範本中指定網路,並停用外部 IP 位址。否則,請按照下列步驟,使用 gcloud CLI 或 Batch API 封鎖工作 VM 的外部存取權。
gcloud
如要使用 gcloud CLI 建立禁止外部存取的工作,請選取下列任一選項:
使用 gcloud 標記封鎖所有 VM 的外部存取權
如要建立工作並使用 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
指令建立工作。 如要封鎖所有 VM 的外部存取權,請加入--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 網路名稱,或是由目前專案代管或與目前專案共用的共用 VPC 網路。
NETWORK
REGION
:子網路和作業 VM 所在的區域:- 如果您加入
allowedLocations
欄位,指定工作 VM 的允許位置,則必須在此處指定相同區域。 - 否則,地區必須與您為工作選取的位置 (
LOCATION
) 相同。
- 如果您加入
SUBNET
:子網路的名稱,該子網路屬於虛擬私有雲網路,且與作業的 VM 位於相同區域。
使用 JSON 欄位封鎖所有 VM 的外部存取權
如要建立工作,並使用 JSON 設定檔中的欄位封鎖所有 VM 的外部存取權,請完成下列步驟:
建立 JSON 檔案,指定作業的設定詳細資料。如要封鎖所有 VM 的外部存取權,請按照下列步驟操作:
將
noExternalIpAddress
欄位設為true
。在
network
和subnetwork
欄位中,指定作業的網路。
舉例來說,如要建立基本指令碼作業,禁止所有 VM 存取外部資源,請建立內容如下的 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
方法,並指定工作設定詳細資料。如要封鎖所有 VM 的外部存取權,請按照下列步驟操作:
將
noExternalIpAddress
欄位設為true
。在
network
和subnetwork
欄位中,指定作業的網路。
舉例來說,如要建立基本指令碼工作,禁止所有 VM 的外部存取權,請發出下列 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:- 如果您使用共用虛擬私有雲網路,請指定主專案。
- 否則,請指定目前專案 (
PROJECT_ID
)。
NETWORK
:提供這項工作所需存取權的網路名稱。網路必須是目前專案中的虛擬私有雲網路,或是由目前專案代管或與目前專案共用的共用虛擬私有雲網路。REGION
:子網路和作業 VM 所在的區域:- 如果您加入
allowedLocations
欄位,指定工作 VM 的允許位置,則必須在此處指定相同區域。 - 否則,地區必須與您為工作選取的位置 (
LOCATION
) 相同。
- 如果您加入
SUBNET
:子網路的名稱,該子網路屬於虛擬私有雲網路,且與作業的 VM 位於相同區域。
建立工作,禁止一或多個容器存取外部資源
建立工作時,封鎖任何工作容器的外部存取權。
您可以使用 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"
}
}
更改下列內容: