このドキュメントでは、すべての VM または特定のコンテナの外部アクセスをブロックするように Batch ジョブを構成する方法について説明します。
ネットワークの要件を満たすため、またはセキュリティを改善するには、ジョブの外部アクセスをブロックします。次のいずれかに該当する場合は、外部 IP アドレスを持たない VM を使用して、ジョブの VM に対する外部アクセスをブロックする必要があります。
- プロジェクトが
compute.vmExternalIpAccess
組織ポリシーの制約によって制限されている。 ジョブに指定したネットワークが、Google API とサービスへのプライベート接続を構成するために限定公開の Google アクセスを使用する。限定公開の Google アクセスは、外部 IP アドレスを持つ VM には影響しません。
ジョブに指定したネットワークが Batch 用の VPC Service Controls で限定公開の Google アクセスを使用する場合は、VPC Service Controls と Batch の使用をご覧ください。
また、ジョブのすべての外部アクセスをブロックしない場合は、ジョブが実行されるすべてのコンテナに対する外部アクセスをブロックできます。
ネットワーキングのコンセプトと、ネットワーキングを構成するタイミングについては、Batch ネットワーキングの概要をご覧ください。
始める前に
- Batch を以前に使用したことがない場合は、Batch を使ってみるを確認し、プロジェクトとユーザーの前提条件を完了して Batch を有効にします。
-
外部アクセスをブロックするジョブの作成に必要な権限を取得するには、次の IAM ロールを付与するように管理者に依頼してください。
-
プロジェクトのバッチジョブ編集者(
roles/batch.jobsEditor
) -
ジョブのサービス アカウントのサービス アカウント ユーザー(
roles/iam.serviceAccountUser
)。これは、デフォルトでは Compute Engine のデフォルトのサービス アカウントです。 - ジョブのネットワークとサブネットを識別する場合: プロジェクトの Compute ネットワーク閲覧者 (
roles/compute.networkViewer
)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
-
プロジェクトのバッチジョブ編集者(
-
ジョブの VM に対する外部アクセスをブロックする場合は、ジョブに使用するネットワークを特定する必要があります。その VM に対する外部アクセスをブロックするジョブに指定するネットワークは、次の要件を満たす必要があります。
- ネットワークは、ジョブと同じプロジェクトにある Virtual Private Cloud(VPC)ネットワークか、ジョブのプロジェクトがホストしているかプロジェクトと共有されている共有 VPC ネットワークである。
- ネットワークには、ジョブを実行するロケーションのサブネットワーク(サブネット)が含まれる。
- ネットワークにより、ジョブに必要などのアクセスも許可される。ジョブの VM の外部アクセスをブロックする場合は、ネットワークで Cloud NAT または限定公開の Google アクセスを使用して、ジョブで使用する API とサービスのドメインへのアクセスを許可する必要があります。たとえば、すべてのジョブは Batch API と 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
: 現在のプロジェクト内の VPC ネットワークの名前、または現在のプロジェクトでホストまたは共有される共有 VPC ネットワークの名前。REGION
: ジョブのサブネットと VM が配置されているリージョン。allowedLocations
フィールドを追加して、ジョブの VM に対して許可されるロケーションを指定する場合は、ここで同じリージョンを指定する必要があります。- そうしない場合、リージョンはジョブに選択したロケーション(
LOCATION
)と同じでなければなりません。
SUBNET
: VPC ネットワークの一部であり、ジョブの 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" } }
以下を置き換えます。
HOST_PROJECT_ID
: 指定したネットワークのプロジェクトのプロジェクト ID:- 共有 VPC ネットワークを使用している場合は、ホスト プロジェクトを指定します。
- 共有 VPC ネットワークを使用していない場合は、現在のプロジェクトを指定します。
NETWORK
: このジョブに必要なアクセス権を提供するネットワークの名前。ネットワークは、現在のプロジェクトの VPC ネットワーク、または現在のプロジェクトによってホストされているか、共有されている共有 VPC ネットワークのいずれかである必要があります。REGION
: ジョブのサブネットと VM が配置されているリージョン。allowedLocations
フィールドを追加して、ジョブの VM に対して許可されるロケーションを指定する場合は、ここで同じリージョンを指定する必要があります。- そうしない場合、リージョンはジョブに選択したロケーション(
LOCATION
)と同じでなければなりません。
SUBNET
: VPC ネットワークの一部であり、ジョブの VM と同じリージョンにあるサブネットの名前。
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
: プロジェクトのプロジェクト IDLOCATION
: このジョブに指定するロケーション。JOB_NAME
: このジョブに付ける名前。HOST_PROJECT_ID
: 指定したネットワークのプロジェクトのプロジェクト ID:- 共有 VPC ネットワークを使用している場合は、ホスト プロジェクトを指定します。
- 共有 VPC ネットワークを使用していない場合は、現在のプロジェクト(
PROJECT_ID
)を指定します。
NETWORK
: このジョブに必要なアクセス権を提供するネットワークの名前。ネットワークは、現在のプロジェクトの VPC ネットワーク、または現在のプロジェクトによってホストされているか、共有されている共有 VPC ネットワークのいずれかである必要があります。REGION
: ジョブのサブネットと VM が配置されているリージョン。allowedLocations
フィールドを追加して、ジョブの VM に対して許可されるロケーションを指定する場合は、ここで同じリージョンを指定する必要があります。- そうしない場合、リージョンはジョブに選択したロケーション(
LOCATION
)と同じでなければなりません。
SUBNET
: VPC ネットワークの一部であり、ジョブの VM と同じリージョンにあるサブネットの名前。
1 つ以上のコンテナに対する外部アクセスをブロックするジョブを作成する
ジョブを作成するときに、ジョブのコンテナに対する外部アクセスをブロックします。
ジョブのコンテナに対する外部アクセスは、gcloud CLI または Batch API を使用してブロックできます。
gcloud
gcloud CLI を使用して 1 つ以上のコンテナに対する外部アクセスをブロックするジョブを作成するには、次の操作を行います。
ジョブの構成の詳細を指定する 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"
}
}
以下を置き換えます。
次のステップ
- ジョブの作成または実行に問題がある場合は、トラブルシューティングをご覧ください。
- ネットワーキングの詳細を確認する。
- ジョブの作成の詳細を確認する。
- ジョブとタスクを表示する方法を確認する。