このドキュメントでは、予約済みリソースで実行されるジョブを作成する方法と、ジョブが予約を使用しないようにする方法について説明します。
予約は Compute Engine の機能です。予約を使用すると、指定したハードウェア構成で 1 つ以上の VM の容量を確実に確保できます。VM の予約を行うと、予約を作成した時点から削除するまでの VM の料金が発生します。ただし、その VM を使用している間は、予約なしの VM と同等の総費用が発生します。
一般に、予約は、容量の可用性が極めて重要である場合や、リソース取得時のエラーを防止する場合に役立ちます。特に Batch の場合は、専用の予約を使用してジョブのスケジューリング時間を最小限に抑えるか、使用されていない既存の予約を使用することを検討してください。予約が十分に活用されていない場合(確約利用割引に必要な予約など)、ジョブが使用されていないときに使用するようにジョブを構成でき、発生した費用を最適化するのに役立ちます。また、プロジェクト内の他のワークロードのリソース可用性を優先する場合は、ジョブが予約を使用しないように明示的にブロックできます。
予約の詳細については、予約に関する Compute Engine ドキュメントをご覧ください。
準備
- Batch を以前に使用したことがなかった場合は、Batch を使ってみるを確認し、プロジェクトとユーザーの前提条件を完了して Batch を有効にします。
- 必要に応じてジョブの VM で使用する予約を作成する権限または既存の予約を表示する権限があることを確認してください。
- 
  
  
  
  
  
  
  
    
    
    
    
    
    
      
      
        
        
        
        
        
      
    
      
      
        
        
        
        
        
      
    
    
    
    
    
  
  ジョブの作成に必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。 - 
  
  
    
      プロジェクトに対する Batch ジョブ編集者 (roles/batch.jobsEditor)
- 
  
  
    
      ジョブのサービス アカウントのサービス アカウント ユーザー (roles/iam.serviceAccountUser)。これは、デフォルトでは Compute Engine のデフォルトのサービス アカウントです。
 ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。 
- 
  
  
    
      プロジェクトに対する Batch ジョブ編集者 (
制限事項
予約に関する一般的な制限に加えて、Batch には次の制限もあります。
- ジョブの VM では共有予約を使用できません。
- コンパクト プレースメント ポリシーを指定した場合、ジョブの VM で予約を使用できません。
-  Google Cloud コンソールを使用してジョブを作成すると、その VM は一致する予約を自動的に使用します。特定の予約を使用するか、VM が予約を使用できないようにするには、gcloud CLI または Batch API を使用してジョブを作成するときに、reservationフィールドを定義する必要があります。
要件
このセクションでは、ジョブの VM で予約を使用するための要件の概要について説明します。すべての要件の詳細については、Compute Engine のドキュメントの予約に関する一般的な要件とこのドキュメントの後半の構成の計画手順をご覧ください。
- ジョブの VM で一般的に予約を使用できるようにするには、次のすべての条件を満たす必要があります。 - ジョブと予約で、完全に一致する VM プロパティを指定する必要があります。 
- このドキュメントのすべての制限事項と、予約に関する他のすべての一般的な要件を遵守する必要があります。 
 
- ジョブの各 VM で予約を正常に使用するには、VM の実行中に予約に使用できる未使用の容量が必要です。 - 未使用の予約容量は、VM 数と現在予約を使用している VM の数の差です。VM は、未使用の予約容量があると、予約を使用しようとします。そのため、VM の作成時かその後の実行時に、予約の使用を開始できます。VM は、VM の実行が停止するか、予約が削除されるまで、予約の使用を停止しません。 - 未使用の予約容量の合計に応じて、ジョブの VM は予約容量をまったく使用しないか、予約容量の一部またはすべてを使用します。予約済み VM の容量はジョブの実行時全体で異なる場合があります。 
予約済み VM を使用できるジョブを作成して実行する
- 構成を計画します。 ジョブと予約の互換性を確認するには、次の手順を実施します。 - 既存の予約を使用する場合は、対応する構成でジョブを作成する必要があります。それ以外の場合、新しい予約を作成するように計画するには、必要な構成オプションを選択します。 - 予約のプロパティを決定します。この制限により、共有タイプは 単一プロジェクトにする必要があります。これは、予約のデフォルト オプションです。次の予約プロパティに使用する値を決定します。 - 使用タイプ*
- VM 数†
 
- ジョブと予約の VM プロパティを決定します。制限により、ジョブと予約のどちらもコンパクト プレースメント ポリシーを指定できません。これは、予約とジョブの両方のデフォルト オプションです。次の VM プロパティに使用する値を決定します。これは予約とジョブに対して正確に一致している必要があります。 - プロジェクト
- ゾーン*
- マシンタイプ†
- 最小 CPU プラットフォーム†(存在する場合‡)
- GPU のタイプと数†(存在する場合‡)
- ローカル SSD のタイプと数†(存在する場合‡)
- 予約アフィニティ†#
 - *ジョブ VM は予約済み VM と同じゾーンに配置する必要があります。このゾーンをジョブの - allowedLocations[]フィールドに含めるか、- allowedLocations[]フィールドを省略する場合は、ジョブのロケーションをこのゾーンを含むリージョンに設定する必要があります。- †ジョブでは、 - policyサブフィールドまたは VM インスタンス テンプレートを使用して、これらのプロパティをすべて定義する必要があります。ジョブで- policyサブフィールドとテンプレートの組み合わせを指定することはできません。- ‡ オプション フィールドを 1 つのリソースで定義して、他のリソースで省略することはできません。予約とジョブの両方に対してオプション フィールドを定義または省略します。ジョブで VM インスタンス テンプレートを指定している場合、これは指定されたテンプレートのフィールドにも適用されます。 - #予約の使用タイプによって、ジョブの VM に必要な予約アフィニティが決定されます。これは、次に示すように、ジョブで指定する必要があります。 - ジョブで VM インスタンス テンプレートを使用している場合、テンプレートは予約のドキュメントで説明されているように予約アフィニティを構成する必要があります。
- ジョブがテンプレートを使用せず、予約が明示的な対象になっている場合は、ジョブの reservationフィールドで予約の名前を指定します。
- それ以外の場合は、ジョブがテンプレートを使用せず、予約が自動的に使用され、ジョブの reservationフィールドを省略します。
 
 
- 予約を準備します。まだ行っていない場合は、ジョブの VM で使用する予約を作成します。計画したプロパティが予約に含まれていることを確認します。 
- ジョブを作成して実行します。gcloud CLI または Batch API を使用して、準備された予約から VM を使用するジョブを作成して実行できます。 - gcloud- ジョブの構成の詳細を指定する JSON ファイルを作成し、予約の VM プロパティと完全に一致するように、VM インスタンス リソース( - instances[])サブフィールドを設定します。- たとえば、予約から VM を使用する基本的なスクリプト ジョブを作成するには、次の内容の JSON ファイルを作成します。 - { "taskGroups": [ { "taskSpec": { "runnables": [ { "script": { "text": "echo Hello world from task ${BATCH_TASK_INDEX}" } } ] }, "taskCount": 3 } ], "allocationPolicy": { "instances": [ { VM_RESOURCES } ], }, "logsPolicy": { "destination": "CLOUD_LOGGING" } }- VM_RESOURCESは、前の手順で計画した- instances[]サブフィールドを指定して、ジョブで使用する予約と一致する VM リソースに置き換えます。- たとえば、 - VM_RESOURCESの次の値から始めます。- "installGpuDrivers": INSTALL_GPU_DRIVERS, "policy": { "machineType": "MACHINE_TYPE", "minCpuPlatform": "MIN_CPU_PLATFORM", "accelerators": [ { "type": "GPU_TYPE", "count": GPU_COUNT } ], "disks": [ { "newDisk": { "sizeGb": LOCAL_SSD_SIZE, "type": "local-ssd" }, "deviceName": "LOCAL_SSD_NAME" } ], "reservation": "SPECIFIC_RESERVATION_NAME" }- この値を使用するには、次の変更をすべて行います。 - インスタンス テンプレートを使用しますか? - はい: - policyフィールドを- instanceTemplateフィールドに置き換え、予約と一致する既存の VM インスタンス テンプレートを指定します。例については、VM インスタンス テンプレートの使用のコードサンプルをご覧ください。予約で GPU またはローカル SSD を使用する場合は、ジョブの- installGpuDriversフィールドと- volumes[]フィールドをそれぞれ構成する必要もあります。それ以外の場合は、残りの変更をスキップします。
- いいえ: - MACHINE_TYPEは、予約と同じマシンタイプに置き換えます。
 
- 予約に最小 CPU プラットフォームが含まれていますか? - はい: - MIN_CPU_PLATFORMは、同じ最小 CPU プラットフォームに置き換えます。
- いいえ: - minCpuPlatformフィールドを削除します。
 
- 予約に GPU は含まれていますか? - はい: - INSTALL_GPU_DRIVERS、- GPU_TYPE、- GPU_COUNTは、予約と一致するように置き換えます。例については、GPU の使用のコードサンプルをご覧ください。
- いいえ: - installGpuDriversフィールドと- accelerators[]フィールドを削除します。
 
- 予約にローカル SSD は含まれていますか? - はい: - LOCAL_SSD_SIZEと- LOCAL_SSD_NAMEは、予約と一致するように置き換え、- volumes[]フィールドをジョブに追加してローカル SSD をマウントします。例については、ローカル SSD の使用のコードサンプルをご覧ください。
- いいえ: - disks[]フィールドを削除します。
 
- 予約で特定の使用タイプを使用していますか? - はい: - SPECIFIC_RESERVATION_NAMEは、予約の名前に置き換えます。
- いいえ: - reservationフィールドを削除します。
 
 - たとえば、最小 CPU プラットフォーム、GPU、ローカル SSD を指定していない - n2-standard-32VM に自動的に使用される予約を使用しているとします。また、VM インスタンス テンプレートは指定しません。その場合は、- VM_RESOURCESを次の値に置き換える必要があります。- "policy": { "machineType": "n2-standard-32" }
- ジョブを作成して実行するには、 - gcloud batch jobs submitコマンドを使用します:- gcloud batch jobs submit JOB_NAME \ --location LOCATION \ --config JSON_CONFIGURATION_FILE- 以下を置き換えます。 - JOB_NAME: ジョブの名前。
- LOCATION: ジョブのロケーション。 ジョブで- allowedLocations[]フィールドが指定されていない限り、これは予約のゾーンを含むリージョンにする必要があります。
- JSON_CONFIGURATION_FILE: ジョブの構成の詳細を含む JSON ファイルへのパス。
 
 - API- 予約の VM プロパティと完全に一致するように、VM インスタンス リソース( - instances[])サブフィールドを設定する- jobs.createメソッドに- POSTリクエストを送信します。- たとえば、予約から VM を使用する基本的なスクリプト ジョブを作成するには、次のリクエストを行います。 - POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME { "taskGroups": [ { "taskSpec": { "runnables": [ { "script": { "text": "echo Hello world from task ${BATCH_TASK_INDEX}" } } ] }, "taskCount": 3 } ], "allocationPolicy": { "instances": [ { VM_RESOURCES } ], }, "logsPolicy": { "destination": "CLOUD_LOGGING" } }- 以下を置き換えます。 - PROJECT_ID: プロジェクトのプロジェクト ID。
- LOCATION: ジョブのロケーション。 ジョブで- allowedLocations[]フィールドが指定されていない限り、これは予約のゾーンを含むリージョンにする必要があります。
- JOB_NAME: ジョブの名前。
- VM_RESOURCES: 前の手順で計画した- instances[]サブフィールドを指定して、ジョブで使用する予約と一致する VM リソース。- たとえば、 - VM_RESOURCESの次の値から始めます。- "installGpuDrivers": INSTALL_GPU_DRIVERS, "policy": { "machineType": "MACHINE_TYPE", "minCpuPlatform": "MIN_CPU_PLATFORM", "accelerators": [ { "type": "GPU_TYPE", "count": GPU_COUNT } ], "disks": [ { "newDisk": { "sizeGb": LOCAL_SSD_SIZE, "type": "local-ssd" }, "deviceName": "LOCAL_SSD_NAME" } ], "reservation": "SPECIFIC_RESERVATION_NAME" } - この値を使用するには、次の変更をすべて行います。 - インスタンス テンプレートを使用しますか? - はい: - policyフィールドを- instanceTemplateフィールドに置き換え、予約と一致する既存の VM インスタンス テンプレートを指定します。例については、VM インスタンス テンプレートの使用のコードサンプルをご覧ください。予約で GPU またはローカル SSD を使用する場合は、ジョブの- installGpuDriversフィールドと- volumes[]フィールドをそれぞれ構成する必要もあります。それ以外の場合は、残りの変更をスキップします。
- いいえ: - MACHINE_TYPEは、予約と同じマシンタイプに置き換えます。
 
- 予約に最小 CPU プラットフォームが含まれていますか? - はい: - MIN_CPU_PLATFORMは、同じ最小 CPU プラットフォームに置き換えます。
- いいえ: - minCpuPlatformフィールドを削除します。
 
- 予約に GPU は含まれていますか? - はい: - INSTALL_GPU_DRIVERS、- GPU_TYPE、- GPU_COUNTは、予約と一致するように置き換えます。例については、GPU の使用のコードサンプルをご覧ください。
- いいえ: - installGpuDriversフィールドと- accelerators[]フィールドを削除します。
 
- 予約にローカル SSD は含まれていますか? - はい: - LOCAL_SSD_SIZEと- LOCAL_SSD_NAMEは、予約と一致するように置き換え、- volumes[]フィールドをジョブに追加してローカル SSD をマウントします。例については、ローカル SSD の使用のコードサンプルをご覧ください。
- いいえ: - disks[]フィールドを削除します。
 
- 予約で特定の使用タイプを使用していますか? - はい: - SPECIFIC_RESERVATION_NAMEは、予約の名前に置き換えます。
- いいえ: - reservationフィールドを削除します。
 
 - たとえば、最小 CPU プラットフォーム、GPU、ローカル SSD を指定していない - n2-standard-32VM に自動的に使用される予約を使用しているとします。また、VM インスタンス テンプレートは指定しません。その場合は、- VM_RESOURCESを次の値に置き換える必要があります。- "policy": { "machineType": "n2-standard-32" } 
 
予約済み VM を使用できないジョブを作成して実行する
ジョブが予約を使用しないようにブロックするには、reservation フィールドを NO_RESERVATION に設定します。予約の消費を防ぐ方法の詳細については、Compute Engine ドキュメントのコンピューティング インスタンスが予約を使用しないようにするをご覧ください。
gcloud CLI または Batch API を使用して、予約済み VM を使用できないジョブを作成して実行できます。
gcloud
- ジョブの構成の詳細を指定し、次の設定を行う JSON ファイルを作成し、 - reservationフィールドを- NO_RESERVATIONに設定します。- たとえば、予約を使用できない基本的なスクリプト ジョブを作成するには、次の内容の JSON ファイルを作成します。 - { "taskGroups": [ { "taskSpec": { "runnables": [ { "script": { "text": "echo Hello world from task ${BATCH_TASK_INDEX}" } } ] }, "taskCount": 3 } ], "allocationPolicy": { "instances": [ { "policy": { "reservation": "NO_RESERVATION" } } ], }, "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
reservation フィールドを NO_RESERVATION に設定するjobs.create メソッドに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 from task ${BATCH_TASK_INDEX}"
            }
          }
        ]
      },
      "taskCount": 3
    }
  ],
  "allocationPolicy": {
    "instances": [
      {
        "policy": {
          "reservation": "NO_RESERVATION"
        }
      }
    ],
  },
  "logsPolicy": {
    "destination": "CLOUD_LOGGING"
  }
}
以下を置き換えます。
次のステップ
- ジョブの作成または実行で問題が発生した場合は、トラブルシューティングをご覧ください。
- ジョブとタスクを表示する。
- 別のジョブ作成オプションを学習する。