مرکزی مواد پر جائیں
友田 陽大
Azure Container Apps in production
Azure
Container Apps
ジョブ
バッチ
KEDA
信頼性
冪等性
アーキテクチャ設計

Azure Container Apps Jobs 実装ガイド:バッチ・スケジュール(cron)・イベント駆動の本番設計

Azure Container Apps Jobsを本番品質で設計する実装ガイド。Manual/Schedule/Eventの3トリガー、cron式(UTC)、replicaTimeout・retry・parallelism・completionの設定、KEDAイベント駆動ジョブ、セルフホストCI Runner、冪等な設計と実行履歴の監視までを、Microsoft Learn公式に忠実なaz CLI/ARMで解説します。

Published
Reading time
8 min read
Author
友田 陽大
شیئر کریں

「夜間にレポートを生成したい」「キューに溜まった処理を捌きたい」「CIのRunnerを自前で動かしたい」——常駐サービスではなく走って終わる処理は、Azure Container Apps Jobs の領分です。常駐アプリと同じ基盤で扱えるのに、設計を誤ると二重実行・取りこぼし・無限リトライが起きます。

この記事は、Microsoft LearnのJobsドキュメントに忠実に、Container Apps Jobsの本番設計を解説します。私はAWSでSQS駆動の冪等バッチを本番運用してきました。「リトライを正常系にする=冪等に作る」という原則はAzureでも同じです。ACA全体は Azure Container Apps 本番運用ガイド を参照してください。


ジョブとは:走って終わるタスク

Azure Container Apps jobs enable you to run containerized tasks that run for a finite duration and then stop.(— Jobs in Azure Container Apps

アプリ(常駐サービス)とジョブは、同じ環境で動き、ネットワークとログを共有します。違いは「終わるかどうか」。

アプリ(App)ジョブ(Job)
性質継続的に動く有限時間で走って止まる
失敗時コンテナが落ちれば自動再起動非ゼロ終了は失敗。リトライ設定可
HTTP API・Webアプリ・常駐ワーカー夜間バッチ・データ移行・キュー1件処理

アプリとジョブの使い分け(公式の例)

やりたいこと選ぶ
Webコンテンツ/APIを返すHTTPサーバーApp(HTTPスケールルール)
毎晩レポートを生成Job(Scheduleトリガー+cron)
Service Busキューを継続的に処理App(カスタムスケールルール)
キューの1件/小バッチを処理して止まるJob(Eventトリガー)
オンデマンドで起動して終わる背景処理Job(Manualトリガー)
セルフホストCI RunnerJob(Eventトリガー)

3つのトリガー

A job's trigger type determines how the job is started.(— Jobs

  • Manual:オンデマンド(CLI・ポータル・ARM API)。
  • Schedule:cron式で定期。
  • Event:KEDAスケーラーでイベント起点。

Manual:オンデマンド実行

データ移行のような単発処理に。作成して、必要なときに起動します。

az containerapp job create \
  --name migrate-job --resource-group my-rg --environment my-env \
  --trigger-type "Manual" \
  --replica-timeout 1800 --replica-retry-limit 0 \
  --replica-completion-count 1 --parallelism 1 \
  --image myregistry.azurecr.io/migrate:2026-06-26-a1b2c3d \
  --cpu "0.5" --memory "1.0Gi"

# 起動(設定の上書きも可能)
az containerapp job start --name migrate-job --resource-group my-rg

起動時に設定を上書きできます(環境変数や起動コマンドを変えて同じジョブを別入力で走らせる)。ただしWhen you override a configuration, the job's entire template configuration is replaced——テンプレート全体が置き換わるので、必要な設定を全部含めること。

Schedule:cron(UTC)

毎晩0時のレポート生成など。

az containerapp job create \
  --name nightly-report --resource-group my-rg --environment my-env \
  --trigger-type "Schedule" --cron-expression "0 0 * * *" \
  --replica-timeout 1800 --replica-retry-limit 1 \
  --replica-completion-count 1 --parallelism 1 \
  --image myregistry.azurecr.io/report:2026-06-26-a1b2c3d \
  --cpu "0.5" --memory "1.0Gi"

cron式の例(標準5フィールド):

意味
*/5 * * * *5分ごと
0 */2 * * *2時間ごと
0 0 * * *毎日0時
0 0 * * 0毎週日曜0時
0 0 1 * *毎月1日0時

重要:Cron expressions in scheduled jobs are evaluated in Coordinated Universal Time (UTC).——cronはUTC評価です。「毎日深夜2時(JST)」なら、UTCで0 17 * * *(前日17:00 UTC)と書きます。タイムゾーンのズレは事故の定番なので注意。

Event:KEDAイベント駆動

キューにメッセージが来たら起動。1イベント=1実行が基本です。

az containerapp job create \
  --name queue-job --resource-group my-rg --environment my-env \
  --trigger-type "Event" \
  --replica-timeout 1800 \
  --image myregistry.azurecr.io/queue-job:2026-06-26-a1b2c3d \
  --cpu "0.5" --memory "1.0Gi" \
  --min-executions 0 --max-executions 10 \
  --scale-rule-name "queue" --scale-rule-type "azure-queue" \
  --scale-rule-metadata "accountName=mystorage" "queueName=myqueue" "queueLength=1" \
  --scale-rule-auth "connection=connection-string-secret" \
  --secrets "connection-string-secret=<QUEUE_CONNECTION_STRING>"

アプリとジョブのKEDAの使い方の違いは、スケーリングガイドで詳説していますが要点はこれ——アプリは「レプリカ数」を、ジョブは「実行数」をスケールルールで決めます。「1イベントごとに専用リソースの新インスタンスが要る/長時間処理」ならジョブが向きます。


ジョブ設定:4つの主役

設定プロパティ意味
完了待ち上限replicaTimeoutレプリカ完了を待つ最大秒数。超えたら打ち切り
リトライ上限replicaRetryLimit失敗レプリカのリトライ回数。0でリトライ無し
並列度parallelism1実行あたりのレプリカ数(多くは1
完了数replicaCompletionCount成功とみなすのに必要な完了レプリカ数(≤parallelism)

The replicaTimeout setting takes precedence if it expires before all retries occur.——timeoutがリトライより優先。「3回リトライ」でも、timeoutが先に来れば打ち切られます。timeoutは想定処理時間より十分長く取ります。

並列バッチ(分割処理)

大量データを分割して並列処理するなら、parallelismreplicaCompletionCountを上げます。

az containerapp job create \
  --name batch-job --resource-group my-rg --environment my-env \
  --trigger-type "Schedule" --cron-expression "0 0 * * *" \
  --replica-timeout 1800 --replica-retry-limit 3 \
  --parallelism 5 --replica-completion-count 5 \
  --image myregistry.azurecr.io/batch:2026-06-26-a1b2c3d \
  --cpu "0.5" --memory "1.0Gi"

各レプリカが自分の担当範囲(環境変数やキューで割り当て)を処理し、5つ全部成功で実行成功。大規模並列が必要ならAWS Batch相当の使い方ができます。


冪等性:リトライを正常系にする

ジョブはリトライ前提です。replicaRetryLimitで再試行し、イベント駆動なら同じメッセージが再配信されることもある。だから——

⚠️ ジョブ本体を冪等に作る。同じ入力(メッセージ・日付・ID)を2回処理しても、結果が1回分にしかならないこと。

決済や課金が絡むなら、冪等性キー(メッセージID・注文ID)で「処理済みか」を記録し、二度目はスキップする。これは決済基盤で本番二重課金0件を達成した設計の核で、冪等な非同期処理の設計がそのまま使えます。「リトライしても壊れない」=「リトライを正常系として扱える」=本番で安心して自動リトライを有効化できる、ということです。


CI Runner:イベント駆動ジョブの定番

イベント駆動ジョブの強力な用途が、セルフホストのCI Runnerです。

A self-hosted GitHub Actions runner or Azure Pipelines agent that runs when a new job is queued in a workflow or pipeline.(— Jobs

ワークフローにジョブがキューされたら、KEDAがそれを検知してRunnerコンテナを1実行起動し、終わったら消える。常駐Runnerを抱えずに、必要なときだけスケールする——コスト効率とセキュリティ(使い捨て)の両方で優れた構成です。


ジョブの制約と監視

制約:IngressもDaprも無い

The following features aren't supported: Dapr; Ingress and related features such as custom domains and SSL certificates.(— Jobs

ジョブはIngressを持たない(外部から叩けない)し、Daprも使えません。HTTPで受ける処理はアプリに、Daprのサービス呼び出しが要るならアプリに寄せます。なお、ジョブが起動時に他アプリを呼ぶ場合、sidecar containers (such as the Envoy proxy) are guaranteed to be ready before the main job container begins execution——Envoyサイドカーは主コンテナ起動前に必ず準備完了するので、起動時のapp-to-app呼び出しに接続失敗対策のリトライを足す必要はありません。

監視:実行履歴とログ

# 直近の実行ステータス
az containerapp job execution list --name my-job --resource-group my-rg

The execution history for scheduled and event-based jobs is limited to the most recent 100 successful and failed job executions.——実行履歴は直近100件。それ以上の監査や詳細出力は、環境のLog Analyticsにクエリします(可観測性の設計)。長期保持・アラートが要るなら、Log Analytics+Azure Monitorアラートで「失敗実行が閾値を超えたら通知」を組みます。


設計チェックリスト

  • 「走って終わる」処理はJob、「常駐」はAppに正しく分ける。
  • トリガーを選ぶ:単発=Manual、定期=Schedule(cronはUTC!)、イベント=Event
  • 冪等に作る(リトライ・再配信で二重実行しない)。決済系は冪等性キー必須。
  • replicaTimeoutは想定処理時間より十分長く。replicaRetryLimitはリトライ方針に応じて(0で無効)。
  • イメージタグはコミットSHAで一意(latest禁止)。
  • Ingress/Daprは使えない前提で設計。HTTP受けやDaprはアプリへ。
  • 実行履歴は100件。監査・アラートはLog Analytics+Azure Monitorで。

まとめ

Container Apps Jobsは、常駐アプリと同じ基盤で有限時間のタスクを扱える機能です。トリガーはManual/Schedule(cron・UTC)/Event(KEDA)の3種。本番品質の鍵は——正しいトリガー選択UTCを意識したcron、そして何より冪等な設計(リトライを正常系にする)。バッチ・定期処理・キュー駆動・CI Runnerを、同じ語彙で安全に回せます。

バッチ・定期処理・イベント駆動ジョブの設計と冪等化のご相談はお問い合わせへ。本番運用全体は Azure Container Apps 本番運用ガイド をどうぞ。

友田

友田 陽大

وزیر (METI) ایوارڈ یافتہ پروڈکٹ کے ڈویلپر۔ TypeScript + Python + AWS کے ساتھ میں SaaS، صنعتی ڈیجیٹل تبدیلی اور پروڈکشن کے قابل جنریٹو اے آئی (RAG) تنہا ابتدا سے انتہا تک فراہم کرتا ہوں — تقاضوں کی تعیین سے انفراسٹرکچر اور آپریشن تک۔

Got a challenge?

From design to implementation and operations — solo × generative AI

Implementation like this article's, end to end from requirements to production. Start with a free 30-minute technical consult and tell me about your situation.

پروجیکٹ کی بنیاد پر کام اور تکنیکی مشاورت دونوں کے لیے دستیاب ہوں۔ 30 منٹ کی مفت مشاورت سے آغاز کریں۔

最短ルート:カレンダーから直接予約

相談内容が固まっている方は、フォーム送信よりその場で日程を確定する方がスムーズです。下記から空き時間をお選びください。

  • 30分のオンライン無料相談
  • Google Meet / Zoom / Microsoft Teams
  • NDA 商談前締結可・無理な営業はいたしません
無料相談の空き枠を予約する

یہ بھی پڑھنے کے قابل