本文說明如何設定 Batch 工作,封鎖所有 VM 或特定容器的外部存取權。
封鎖外部存取作業,以符合網路需求或提升安全性。如果符合下列任一條件,您必須使用沒有外部 IP 位址的 VM,封鎖作業 VM 的外部存取權:
- 您的專案受到
compute.vmExternalIpAccess組織政策限制。 您為作業指定的網路會使用私人 Google 存取,設定連至 Google API 和服務的私人連線。私人 Google 存取權不影響具有外部 IP 位址的 VM。
如果為作業指定的網路使用 Private Google Access with VPC Service Controls for 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 或 Private Google Access,才能允許存取作業使用的 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:- 如果您使用 Shared VPC 網路,請指定主專案。
- 否則,請指定目前專案。
NETWORK:目前專案中的 VPC 網路名稱,或是由目前專案代管或與目前專案共用的共用 VPC 網路。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:- 如果您使用 Shared VPC 網路,請指定主專案。
- 否則,請指定目前專案 (
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"
}
}
更改下列內容: