Menentukan jaringan untuk tugas

Dokumen ini menjelaskan cara menentukan jaringan untuk VM yang menjalankan tugas.

Anda dapat mengontrol koneksi untuk VM yang menjalankan tugas dengan menentukan jaringan dengan akses yang diinginkan. Misalnya, Anda dapat menentukan jaringan yang memungkinkan tugas mengakses resource yang diperlukan atau membatasi akses untuk meningkatkan keamanan. Atau, jika Anda tidak memiliki persyaratan jaringan dan tidak ingin mengonfigurasi jaringan untuk tugas, lewati penentuan jaringan untuk menggunakan konfigurasi jaringan default.

Untuk informasi selengkapnya tentang konsep jaringan dan kapan harus mengonfigurasi jaringan, lihat Ringkasan jaringan batch.

Sebelum memulai

  1. Jika belum pernah menggunakan Batch, baca Mulai menggunakan Batch dan aktifkan Batch dengan menyelesaikan prasyarat untuk project dan pengguna.
  2. Untuk mendapatkan izin yang Anda perlukan guna membuat tugas yang berjalan di jaringan tertentu, minta administrator untuk memberi Anda peran IAM berikut:

    Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses ke project, folder, dan organisasi.

    Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.

  3. Identifikasi jaringan yang ingin Anda gunakan untuk tugas. Jaringan yang Anda tentukan untuk tugas harus memenuhi persyaratan berikut: Untuk informasi selengkapnya, lihat Membuat dan mengelola jaringan VPC.
  4. Jika Anda ingin tugas berjalan di subnet jaringan VPC Bersama yang dihosting oleh project lain, Agen layanan batch project Anda harus diberi izin untuk menggunakan subnet tersebut.

    Untuk memastikan bahwa agen layanan Batch project Anda memiliki izin yang diperlukan untuk membuat tugas yang berjalan di subnet jaringan VPC Bersama, minta administrator untuk memberikan peran IAM Compute Network User (roles/compute.networkUser) kepada agen layanan Batch project Anda di subnet VPC Bersama.

    Untuk mengetahui informasi selengkapnya, lihat dokumentasi untuk menyiapkan VPC Bersama untuk akun layanan.

Membuat tugas yang berjalan di jaringan tertentu

Tentukan jaringan untuk tugas saat Anda membuatnya. Secara khusus, Anda perlu menentukan jaringan VPC dan subnet yang terletak di tempat Anda ingin menjalankan tugas ini.

Jika ingin menggunakan template instance VM saat membuat tugas ini, Anda harus menentukan jaringan di template instance VM. Jika tidak, gunakan langkah-langkah berikut untuk menentukan jaringan untuk tugas dengan menggunakan gcloud CLI atau Batch API.

gcloud

Untuk membuat tugas yang berjalan di jaringan tertentu menggunakan gcloud CLI, pilih salah satu opsi berikut:

Menggunakan flag gcloud untuk menentukan jaringan untuk tugas

Untuk membuat tugas dan menggunakan flag gcloud guna menentukan jaringan untuk tugas, selesaikan langkah-langkah berikut:

  1. Buat file JSON yang menentukan detail konfigurasi tugas Anda.

    Misalnya, untuk membuat tugas skrip dasar, buat file JSON dengan konten berikut.

    {
      "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"
      }
    }
    
  2. Buat tugas menggunakan perintah gcloud batch jobs submit. Untuk menentukan jaringan tugas, sertakan flag --network dan --subnetwork.

    gcloud batch jobs submit JOB_NAME \
        --location LOCATION \
        --config JSON_CONFIGURATION_FILE \
        --network projects/HOST_PROJECT_ID/global/networks/NETWORK \
        --subnetwork projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET
    

    Ganti kode berikut:

    • JOB_NAME: nama untuk tugas ini.
    • LOCATION: lokasi untuk tugas ini.
    • JSON_CONFIGURATION_FILE: jalur untuk file JSON dengan detail konfigurasi tugas.
    • HOST_PROJECT_ID: project ID project untuk jaringan yang Anda tentukan:
      • Jika Anda menggunakan jaringan VPC Bersama, tentukan project host.
      • Jika tidak, tentukan project saat ini.
    • NETWORK: nama jaringan VPC dalam project saat ini atau jaringan VPC Bersama yang dihosting oleh atau dibagikan dengan project saat ini.
    • REGION: region tempat subnet dan VM untuk tugas berada:
      • Jika menyertakan kolom allowedLocations untuk menentukan lokasi yang diizinkan bagi VM untuk tugas, Anda harus menentukan region yang sama di sini.
      • Jika tidak, region harus sama dengan lokasi yang Anda pilih untuk tugas (LOCATION).
    • SUBNET: nama subnet yang merupakan bagian dari jaringan VPC dan berada di region yang sama dengan VM untuk tugas.

Menggunakan kolom JSON untuk menentukan jaringan untuk tugas

Untuk membuat tugas dan menggunakan kolom dalam file konfigurasi JSON guna menentukan jaringan untuk tugas, selesaikan langkah-langkah berikut:

  1. Buat file JSON yang menentukan detail konfigurasi tugas Anda. Untuk menentukan jaringan bagi tugas, sertakan kolom network dan subnetwork.

    Misalnya, untuk membuat tugas skrip dasar yang berjalan di jaringan tertentu, buat file JSON dengan konten berikut.

    {
      "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"
            }
          ]
        }
      },
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    

    Ganti kode berikut:

    • HOST_PROJECT_ID: project ID project untuk jaringan yang Anda tentukan:
      • Jika Anda menggunakan jaringan VPC Bersama, tentukan project host.
      • Jika tidak, tentukan project saat ini.
    • NETWORK: nama jaringan VPC dalam project saat ini atau jaringan VPC Bersama yang dihosting oleh atau dibagikan dengan project saat ini.
    • REGION: region tempat subnet dan VM untuk tugas berada:
      • Jika menyertakan kolom allowedLocations untuk menentukan lokasi yang diizinkan bagi VM untuk tugas, Anda harus menentukan region yang sama di sini.
      • Jika tidak, region harus sama dengan lokasi yang Anda pilih untuk tugas (LOCATION).
    • SUBNET: nama subnet yang merupakan bagian dari jaringan VPC dan berada di region yang sama dengan VM untuk tugas.
  2. Buat tugas menggunakan perintah gcloud batch jobs submit.

    gcloud batch jobs submit JOB_NAME \
        --location LOCATION \
        --config JSON_CONFIGURATION_FILE
    

    Ganti kode berikut:

    • JOB_NAME: nama untuk tugas ini.
    • LOCATION: lokasi untuk tugas ini.
    • JSON_CONFIGURATION_FILE: jalur untuk file JSON dengan detail konfigurasi tugas.

Java


import com.google.cloud.batch.v1.AllocationPolicy;
import com.google.cloud.batch.v1.BatchServiceClient;
import com.google.cloud.batch.v1.CreateJobRequest;
import com.google.cloud.batch.v1.Job;
import com.google.cloud.batch.v1.LogsPolicy;
import com.google.cloud.batch.v1.LogsPolicy.Destination;
import com.google.cloud.batch.v1.Runnable;
import com.google.cloud.batch.v1.Runnable.Script;
import com.google.cloud.batch.v1.TaskGroup;
import com.google.cloud.batch.v1.TaskSpec;
import com.google.protobuf.Duration;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CreateBatchCustomNetwork {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Google Cloud project you want to use.
    String projectId = "YOUR_PROJECT_ID";
    // Name of the region you want to use to run the job. Regions that are
    // available for Batch are listed on: https://cloud.google.com/batch/docs/get-started#locations
    String region = "europe-central2";
    // The name of the job that will be created.
    // It needs to be unique for each project and region pair.
    String jobName = "JOB_NAME";
    // The name of a VPC network in the current project or a Shared VPC network that is hosted by
    // or shared with the current project.

    String network = String.format("global/networks/%s", "test-network");
    // The name of a subnet that is part of the VPC network and is located
    // in the same region as the VMs for the job.
    String subnet = String.format("regions/%s/subnetworks/%s", region, "subnet");

    createBatchCustomNetwork(projectId, region, jobName, network, subnet);
  }

  // Create a job that runs on a specific network.
  public static Job createBatchCustomNetwork(String projectId, String region, String jobName,
                                             String network,  String subnet)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (BatchServiceClient batchServiceClient = BatchServiceClient.create()) {
      // Define what will be done as part of the job.
      Runnable runnable =
          Runnable.newBuilder()
              .setScript(
                  Script.newBuilder()
                      .setText(
                          "echo Hello world! This is task ${BATCH_TASK_INDEX}. "
                              + "This job has a total of ${BATCH_TASK_COUNT} tasks.")
                      // You can also run a script from a file. Just remember, that needs to be a
                      // script that's already on the VM that will be running the job.
                      // Using setText() and setPath() is mutually exclusive.
                      // .setPath("/tmp/test.sh")
                      .build())
              .build();

      TaskSpec task = TaskSpec.newBuilder()
          // Jobs can be divided into tasks. In this case, we have only one task.
          .addRunnables(runnable)
          .setMaxRetryCount(2)
          .setMaxRunDuration(Duration.newBuilder().setSeconds(3600).build())
          .build();

      // Tasks are grouped inside a job using TaskGroups.
      // Currently, it's possible to have only one task group.
      TaskGroup taskGroup = TaskGroup.newBuilder()
          .setTaskCount(3)
          .setParallelism(1)
          .setTaskSpec(task)
          .build();

      // Specifies a VPC network and a subnet for Allocation Policy
      AllocationPolicy.NetworkPolicy networkPolicy =
          AllocationPolicy.NetworkPolicy.newBuilder()
              .addNetworkInterfaces(AllocationPolicy.NetworkInterface.newBuilder()
                  .setNetwork(network) // Set the network name
                  .setSubnetwork(subnet) // Set the subnet name
                  .setNoExternalIpAddress(true) // Blocks external access for all VMs
                  .build())
              .build();

      // Policies are used to define on what kind of virtual machines the tasks will run on.
      // In this case, we tell the system to use "e2-standard-4" machine type.
      // Read more about machine types here: https://cloud.google.com/compute/docs/machine-types
      AllocationPolicy.InstancePolicy instancePolicy =
          AllocationPolicy.InstancePolicy.newBuilder().setMachineType("e2-standard-4")
              .build();

      AllocationPolicy allocationPolicy =
          AllocationPolicy.newBuilder()
              .addInstances(AllocationPolicy.InstancePolicyOrTemplate.newBuilder()
              .setPolicy(instancePolicy).build())
              .setNetwork(networkPolicy)
              .build();

      Job job =
          Job.newBuilder()
              .addTaskGroups(taskGroup)
              .setAllocationPolicy(allocationPolicy)
              // We use Cloud Logging as it's an out of the box available option.
              .setLogsPolicy(
                  LogsPolicy.newBuilder().setDestination(Destination.CLOUD_LOGGING))
              .build();

      CreateJobRequest createJobRequest =
          CreateJobRequest.newBuilder()
              // The job's parent is the region in which the job will run for the specific project.
              .setParent(String.format("projects/%s/locations/%s", projectId, region))
              .setJob(job)
              .setJobId(jobName)
              .build();

      Job result =
          batchServiceClient
              .createJobCallable()
              .futureCall(createJobRequest)
              .get(5, TimeUnit.MINUTES);

      System.out.printf("Successfully created the job: %s", result.getName());

      return result;
    }
  }
}

Node.js

// Imports the Batch library
const batchLib = require('@google-cloud/batch');
const batch = batchLib.protos.google.cloud.batch.v1;

// Instantiates a client
const batchClient = new batchLib.v1.BatchServiceClient();

/**
 * TODO(developer): Update these variables before running the sample.
 */
// Project ID or project number of the Google Cloud project you want to use.
const projectId = await batchClient.getProjectId();
// Name of the region you want to use to run the job. Regions that are
// available for Batch are listed on: https://cloud.google.com/batch/docs/get-started#locations
const region = 'europe-central2';
// The name of the job that will be created.
// It needs to be unique for each project and region pair.
const jobName = 'example-job';
// The name of a VPC network in the current project or a Shared VPC network that is hosted by
// or shared with the current project.
const network = 'global/networks/test-network';
// The name of a subnetwork that is part of the VPC network and is located
// in the same region as the VMs for the job.
const subnetwork = `regions/${region}/subnetworks/subnet`;

// Define what will be done as part of the job.
const runnable = new batch.Runnable({
  script: new batch.Runnable.Script({
    commands: ['-c', 'echo Hello world! This is task ${BATCH_TASK_INDEX}.'],
  }),
});

// Specify what resources are requested by each task.
const computeResource = new batch.ComputeResource({
  // In milliseconds per cpu-second. This means the task requires 50% of a single CPUs.
  cpuMilli: 500,
  // In MiB.
  memoryMib: 16,
});

const task = new batch.TaskSpec({
  runnables: [runnable],
  computeResource,
  maxRetryCount: 2,
  maxRunDuration: {seconds: 3600},
});

// Tasks are grouped inside a job using TaskGroups.
const group = new batch.TaskGroup({
  taskCount: 3,
  taskSpec: task,
});

// Specify VPC network and a subnet for Allocation Policy
const networkPolicy = new batch.AllocationPolicy.NetworkPolicy({
  networkInterfaces: [
    new batch.AllocationPolicy.NetworkInterface({
      // Set the network name
      network,
      // Set the subnetwork name
      subnetwork,
      // Blocks external access for all VMs
      noExternalIpAddress: true,
    }),
  ],
});

// Policies are used to define on what kind of virtual machines the tasks will run on.
// In this case, we tell the system to use "e2-standard-4" machine type.
// Read more about machine types here: https://cloud.google.com/compute/docs/machine-types
const instancePolicy = new batch.AllocationPolicy.InstancePolicy({
  machineType: 'e2-standard-4',
});

const allocationPolicy = new batch.AllocationPolicy.InstancePolicyOrTemplate({
  policy: instancePolicy,
  network: networkPolicy,
});

const job = new batch.Job({
  name: jobName,
  taskGroups: [group],
  labels: {env: 'testing', type: 'script'},
  allocationPolicy,
  // We use Cloud Logging as it's an option available out of the box
  logsPolicy: new batch.LogsPolicy({
    destination: batch.LogsPolicy.Destination.CLOUD_LOGGING,
  }),
});

// The job's parent is the project and region in which the job will run
const parent = `projects/${projectId}/locations/${region}`;

async function callCreateBatchCustomNetwork() {
  // Construct request
  const request = {
    parent,
    jobId: jobName,
    job,
  };

  // Run request
  const [response] = await batchClient.createJob(request);
  console.log(JSON.stringify(response));
}

await callCreateBatchCustomNetwork();

Python

from google.cloud import batch_v1


def create_with_custom_network(
    project_id: str,
    region: str,
    network_name: str,
    subnet_name: str,
    job_name: str,
) -> batch_v1.Job:
    """Create a Batch job that runs on a specific network and subnet.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        region: name of the region you want to use to run the job. Regions that are
            available for Batch are listed on: https://cloud.google.com/batch/docs/locations
        network_name: The name of a VPC network in the current project or a Shared VPC network.
        subnet_name: Name of the subnetwork to be used within the specified region.
        job_name: the name of the job that will be created.
            It needs to be unique for each project and region pair.
    Returns:
        A job object representing the job created.
    """

    client = batch_v1.BatchServiceClient()

    # Define what will be done as part of the job.
    runnable = batch_v1.Runnable()
    runnable.script = batch_v1.Runnable.Script()
    runnable.script.text = "echo Hello world! This is task ${BATCH_TASK_INDEX}. This job has a total of ${BATCH_TASK_COUNT} tasks."

    # Jobs can be divided into tasks. In this case, we have only one task.
    task = batch_v1.TaskSpec()
    task.runnables = [runnable]

    # We can specify what resources are requested by each task.
    resources = batch_v1.ComputeResource()
    resources.cpu_milli = 2000  # in milliseconds per cpu-second. This means the task requires 2 whole CPUs.
    resources.memory_mib = 16  # in MiB
    task.compute_resource = resources

    task.max_retry_count = 2
    task.max_run_duration = "3600s"

    # Tasks are grouped inside a job using TaskGroups.
    # Currently, it's possible to have only one task group.
    group = batch_v1.TaskGroup()
    group.task_count = 3
    group.task_spec = task

    # Policies are used to define on what kind of virtual machines the tasks will run on.
    # In this case, we tell the system to use "e2-standard-4" machine type.
    # Read more about machine types here: https://cloud.google.com/compute/docs/machine-types
    policy = batch_v1.AllocationPolicy.InstancePolicy()
    policy.machine_type = "e2-standard-4"
    instances = batch_v1.AllocationPolicy.InstancePolicyOrTemplate()
    instances.policy = policy
    allocation_policy = batch_v1.AllocationPolicy()
    allocation_policy.instances = [instances]

    # Create a NetworkInterface object to specify network settings for the job
    network_interface = batch_v1.AllocationPolicy.NetworkInterface()
    # Set the network to the specified network name within the project
    network_interface.network = f"projects/{project_id}/global/networks/{network_name}"
    # Set the subnetwork to the specified subnetwork within the region
    network_interface.subnetwork = (
        f"projects/{project_id}/regions/{region}/subnetworks/{subnet_name}"
    )
    allocation_policy.network.network_interfaces = [network_interface]

    job = batch_v1.Job()
    job.task_groups = [group]
    job.allocation_policy = allocation_policy
    # We use Cloud Logging as it's an out of the box available option
    job.logs_policy = batch_v1.LogsPolicy()
    job.logs_policy.destination = batch_v1.LogsPolicy.Destination.CLOUD_LOGGING

    create_request = batch_v1.CreateJobRequest()
    create_request.job = job
    create_request.job_id = job_name
    # The job's parent is the region in which the job will run
    create_request.parent = f"projects/{project_id}/locations/{region}"
    return client.create_job(create_request)

API

Untuk membuat tugas menggunakan Batch API, gunakan metode jobs.create dan tentukan detail konfigurasi tugas Anda. Untuk menentukan jaringan bagi tugas, sertakan kolom network dan subnetwork.

Misalnya, untuk membuat tugas skrip dasar yang berjalan di jaringan tertentu, buat permintaan POST berikut:

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"
        }
      ]
    }
  },
  "logsPolicy": {
    "destination": "CLOUD_LOGGING"
  }
}

Ganti kode berikut:

  • PROJECT_ID: Project ID project Anda.
  • LOCATION: lokasi untuk tugas ini.
  • JOB_NAME: nama untuk tugas ini.
  • HOST_PROJECT_ID: project ID project untuk jaringan yang Anda tentukan:
    • Jika Anda menggunakan jaringan VPC Bersama, tentukan project host.
    • Jika tidak, tentukan project saat ini (PROJECT_ID).
  • NETWORK: nama jaringan VPC dalam project saat ini atau jaringan VPC Bersama yang dihosting oleh atau dibagikan dengan project saat ini.
  • REGION: region tempat subnet dan VM untuk tugas berada:
    • Jika menyertakan kolom allowedLocations untuk menentukan lokasi yang diizinkan bagi VM untuk tugas, Anda harus menentukan region yang sama di sini.
    • Jika tidak, region harus sama dengan lokasi yang Anda pilih untuk tugas (LOCATION).
  • SUBNET: nama subnet yang merupakan bagian dari jaringan VPC dan berada di region yang sama dengan VM untuk tugas.

Langkah selanjutnya