9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【OCI Batch】新サービスOCI Batch Serviceを使ってみた

Last updated at Posted at 2025-12-23

先日、OCIの新サービスとしてOCI Batch Serviceがリリースされました!

色々機能がありそうな本サービスですが、とりあえず簡単に使ってみて、ノリを確認してみたいと思います。

OCI Batchとは

簡単に使ってみてノリを確認するとはいえ、サービスがどういうものかは簡単にお話ししておきます。
公式サイトには、

Easily scale compute with OCI Batch Service, a fully managed, cloud native service that automates job orchestration and resource provisioning for intensive workloads. OCI Batch Service integrates OCI monitoring and storage tools for secure, compliant performance that adapts to dynamic demands.

と書かれています。
「計算リソースを容易にスケールできるフルマネージドのクラウドネイティブサービスであり、負荷の高いワークロード向けにジョブのオーケストレーションやリソースのプロビジョニングを自動化します。」
とのことなので、名前の通りバッチ処理をいい感じにオーケストレーションして処理してくれるフルマネージドサービスだと思われます。

用語の説明

OCI Batch Serviceは、いくつか専用の言葉が出てきて少し難しいのでここで意味を整理しておきます。

  • タスク
    実行される処理の最小単位です
  • ジョブ
    複数のタスクの集合です。実行されるタスクに依存関係なども定義できます
  • ジョブプール
    複数のジョブの集合です。ここにジョブを追加すると、処理が開始されます
  • バッチコンテキスト
    バッチ処理が実行されるコンテキスト情報の論理的なグループです
    • ネットワーク
    • フリート(処理を実行するコンピュートのシェイプ)
    • ジョブの優先度
      などが設定できます
  • タスク環境
    使用するコンテナイメージやアタッチするNFSボリュームなどの設定ができます
  • タスクプロファイル
    タスクを実行する上での最小OCPU、最小メモリを定義できます

利用する際の簡単な流れ

シンプルに利用する場合は、以下の流れでリソースを作成していくことになります。

  1. 実行したいコンテナイメージをOCIRにプッシュ(OCI Batchと同じリージョンである必要があります)
  2. タスク環境を作成し、プッシュしたイメージを指定
  3. タスクプロファイルを作成し、タスクを実行する上での最小スペックを定義
  4. バッチコンテキストを作成し、タスクを実行するネットワークやフリートなどを設定
  5. ジョブプール(ジョブを作成する器)を作成
  6. ジョブを作成(このタイミングで一緒にタスクも作成します。タスクを作成する際に、先程作成したタスク環境、タスクプロファイルを指定します)

ジョブに優先度をつける場合は、バッチコンテキスト作成のタイミングでオーケストレーションのルールを作成します。ネームスペースやタグでリソース割り当ての重みを決定する方式です。

また、タスクに依存関係を設ける場合にはジョブを作成するタイミングで、そのジョブで実行するタスクに依存関係を定義できます。

今回は簡単に実施するために、優先度や依存関係などの複雑な設定は行いません。

使ってみた

ではここからは実際に使ってみたいと思います。
流し見で設定を忘れないように、利用する上での注意点を先に書いておきます。

注意点

  • コンテナはルートユーザーで実行しないこと(エラーになります)
  • Apple Siliconを使っている場合は、docker build時に--platform=linux/amd64を指定すること

今回はサンプルとして、オブジェクトストレージに配置したinput.txtというファイルを読み込んで、そのファイルの行数や処理日時などをJSON形式のデータとして同じオブジェクトストレージに吐き出す処理を行います。

以下の手順で実施します。なお、オブジェクトストレージの用意、input.txtのアップロード、OCI Batchを動かすVCNの用意、必要なポリシーの設定などは終わっているものとします。

  1. コンテナイメージをOCIRにプッシュ
  2. タスク環境を作成し、プッシュしたイメージを指定
  3. タスクプロファイルを作成し、タスクを実行する上での最小スペックを定義
  4. バッチコンテキストを作成し、タスクを実行するネットワークやフリートなどを設定
  5. ジョブプール(ジョブを作成する器)を作成
  6. ジョブを作成

コンテナイメージをOCIRにプッシュ

まずは今回使用するコンテナイメージを作成し、OCIRにプッシュします。

今回実行するスクリプトは以下です。

main.py
import os
import oci
import json
from datetime import datetime

# 環境変数から設定を取得
BUCKET_NAME = os.environ.get("BUCKET_NAME")
NAMESPACE = os.environ.get("NAMESPACE")
REGION = os.environ.get("OCI_REGION")
INPUT_FILE = "input.txt"

def process_data():
    print("Initialize OCI Auth (Resource Principal)...")
    signer = oci.auth.signers.get_resource_principals_signer()
    config = {
        "region": REGION
    }
    object_storage = oci.object_storage.ObjectStorageClient(config=config, signer=signer)

    print(f"Reading {INPUT_FILE} from bucket {BUCKET_NAME}...")
    try:
        resp = object_storage.get_object(NAMESPACE, BUCKET_NAME, INPUT_FILE)
        content = resp.data.text
        
        line_count = len(content.splitlines())
        print(f"Process complete. Line count: {line_count}")
        result_data = {
            "original_file": INPUT_FILE,
            "line_count": line_count,
            "processed_at": datetime.now().isoformat(),
            "status": "SUCCESS"
        }
        
        output_filename = f"result_{datetime.now().strftime('%Y%m%d%H%M%S')}.json"
        object_storage.put_object(
            NAMESPACE,
            BUCKET_NAME,
            output_filename,
            json.dumps(result_data, indent=2).encode('utf-8')
        )
        print(f"Result written to {output_filename}")

    except Exception as e:
        print(f"Error: {e}")
        exit(1)

if __name__ == "__main__":
    if not BUCKET_NAME or not NAMESPACE:
        print("Error: BUCKET_NAME and NAMESPACE env vars are required.")
        exit(1)
    process_data()

Dockerfileは以下です。

Dockerfile
FROM python:3.9

RUN pip install oci
RUN useradd -m -u 1000 appuser
WORKDIR /app
COPY main.py .
RUN chown -R appuser:appuser /app
ENV PYTHONUNBUFFERED=1
USER 1000
CMD ["python", "main.py"]

このmain.pyDockerfileを同じディレクトリに配置して、下記のコマンドでビルドとプッシュを行います。なお、OCIR側に事前に対応するレポジトリ(batch-test)を作成しておきます。

docker build --platform=linux/amd64 -t iad.ocir.io/<your-namespace>/batch-test .
docker push iad.ocir.io/<your-namespace>/batch-test

以上でOCIRへのコンテナイメージのプッシュは完了です。

タスク環境を作成し、プッシュしたイメージを指定

次にタスク環境を作成して、プッシュしたイメージを指定します。
OCIコンソールの左上のハンバーガーメニューから、「コンピュート」→「バッチ」→「環境」をクリックします。
image.png

「タスク環境の作成」を押すと、タスク環境を作成するダイアログが出てきます。
必要な設定は、

  • 名前
    これは好きなもので構いません。
  • イメージ
    先程プッシュしたイメージ(batch-test:latest)を選択します。

以上でタスク環境の作成は完了です。

タスクプロファイルを作成し、タスクを実行する上での最小スペックを定義

次に、タスクプロファイルを作成して、タスクを実行する上での最小スペックを定義しておきます。

「コンピュート」→「バッチ」→「タスク・プロファイル」を選択します。
「タスクプロファイルの作成」をクリックすると、タスクプロファイル作成のダイアログが表示されます。
必要な設定は、

  • 名前
    これは好きなもので構いません。
  • 最小OCPU数
    1にします。
  • 最小メモリー
    適当に5にしておきます。

今回は大したリソースが必要ないので、ご自身の環境で無理なく利用できる範囲のスペックを指定すれば値はなんでも問題ないはずです。

以上でタスクプロファイルの作成は完了です。

バッチコンテキストを作成し、タスクを実行するネットワークやフリートなどを設定

次にバッチコンテキストを作成します。

「コンピュート」→「バッチ」→「バッチコンテキスト」を選択します。
「バッチコンテキストの作成」をクリックすると、作成のダイアログが表示されます。

最初に名前を設定する項目が出てきますが、名前はなんでも構わないので、適当に入力します。

次にネットワークを設定する項目が出てきます。こちらも事前作成済みのネットワークを使用します。今回はプライベートサブネットを選択します(オブジェクトストレージとやり取りを行うため、サービスゲートウェイが正しく設定されていることを確認してください)。

次にフリートを設定する項目が出てきます。
image.png

「フリートの追加」を押して、フリート追加のダイアログを表示させます。
image.png

  • 名前
    何でも大丈夫です。
  • 最大同時タスク数
    このフリートで同時に実行できるタスク数を指定します。今回は3にしておきます。
  • ノードシェイプ
    このフリートに割り当てたタスクが動くノードのシェイプを設定します。今回はAMDを選択し、VM.Standard.E5.Flexを選択します。

次に、資格を設定する項目が出てきますが、今回は設定不要です。

次に、ジョブ優先度構成を設定する項目が出てきますが、今回はこれも不要です。

次に、ジョブ実行のログを構成する項目が出てきますが、今回は不要です。

最後に作成を押したら、バッチコンテキストの作成は完了です。バッチコンテキストの作成には30分程度かかるのでしばらく待ちます。

ジョブプールを作成

次にジョブプールの作成を行います。ジョブプールの作成は若干わかりづらいのですが、作成したバッチコンテキストの詳細ページから行います(私はこれが見つからず、APIを直接叩いて作成してしまいました、、)。
image.png
ジョブプールのタブを押して、ジョブプールの追加を選択します。
image.png

ジョブプールは名前を適当に設定するだけでOKです。

ジョブを作成

最後にジョブを作成します。今回は事前作成したフリートに何も割り当てられていないため、ジョブを作成すると自動でタスクが開始されます。本来はジョブを作成したら一旦キューに溜まり、優先度などを考慮して順番に処理するものだと思われます。

ジョブはコンソール上から作成することもできますが、今回はJSONファイルから作成します。
image.png

以下のJSONファイルをアップロードしてください。このJSONファイルを使う上で以下の情報を埋めておく必要があるので、コンソール上から探して埋めてください。

  • コンパートメントのOCID
  • ジョブプールのOCID
  • タスクプロファイルのOCID
  • タスク環境のOCID
  • オブジェクトストレージのバケット名
  • オブジェクトストレージネームスペース
{
    "displayName": "batch-job",
    "compartmentId": "<your-compartment-id>",
    "batchJobPoolId": "<your-job-pool-id>",
    "tasks": [
        {
            "name": "debug-etl-task",
            "type": "COMPUTE",
            "batchTaskProfileId": "<your-task-profile-id>",
            "batchTaskEnvironmentId": "<your-task-environment-id>",
            "environmentVariables": [
                {
                    "name": "BUCKET_NAME",
                    "value": "<your-bucket-name>"
                },
                {
                    "name": "NAMESPACE",
                    "value": "<your-namespace>"
                },
                {
                    "name": "OCI_REGION",
                    "value": "us-ashburn-1"
                }
            ],
            "command": [
                "python",
                "main.py"
            ]
        }
    ]
}

このJSONではコンテナのエントリーポイントを上書きするようにcommandフィールドを設定していますが、これは設定しなくても動くと思います(あくまで使ってみたなのでここは試してません、すみません)。

結果を確認してみる

しばらく待つと、投げたジョブが完了していることが確認できます。
image.png
ジョブで実行されたタスクの詳細ページにいくと、ログを確認できます。
image.png
オブジェクトストレージに配置しておいたinput.txtをリソースプリンシパル認証を使って取得して加工し、result_20251223232212.jsonとしてオブジェクトストレージに書き込んだことがわかります。

実際にオブジェクトストレージを見てみると、対象オブジェクトが存在することがわかります。
image.png

このファイルをダウンロードして中身を確認すると、正しく処理されていることがわかります。

result_20251223232212.json
{
  "original_file": "input.txt",
  "line_count": 1,
  "processed_at": "2025-12-23T23:22:12.091037",
  "status": "SUCCESS"
}

ちなみにinput.txtの内容は以下のようなものです。

input.txt
This is a test file.

input.txtの内容(行数)が、正しくアウトプットとして出ていることがわかりますね。

最後に

以上、OCI Batch Serviceの簡単な使用方法でした。今回試したのは最も基本的な使用方法なので、ジョブ優先度構成などを使ってより高度なユースケースでの利用も可能かと思います。
ぜひ試してみてください。

9
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?