{"id":866,"date":"2026-04-16T11:42:53","date_gmt":"2026-04-16T11:42:53","guid":{"rendered":"https:\/\/www.devopsschool.com\/tutorials\/oracle-cloud-batch-tutorial-architecture-pricing-use-cases-and-hands-on-guide-for-compute\/"},"modified":"2026-04-16T11:42:53","modified_gmt":"2026-04-16T11:42:53","slug":"oracle-cloud-batch-tutorial-architecture-pricing-use-cases-and-hands-on-guide-for-compute","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/tutorials\/oracle-cloud-batch-tutorial-architecture-pricing-use-cases-and-hands-on-guide-for-compute\/","title":{"rendered":"Oracle Cloud Batch Tutorial: Architecture, Pricing, Use Cases, and Hands-On Guide for Compute"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Category<\/h2>\n\n\n\n<p>Compute<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Introduction<\/h2>\n\n\n\n<p>Oracle Cloud <strong>Batch<\/strong> (commonly documented as <strong>Oracle Cloud Infrastructure (OCI) Batch<\/strong>) is a managed service for running <strong>non-interactive, container-based batch workloads<\/strong> on Oracle Cloud\u2019s Compute capacity, without requiring you to manually provision and manage fleets of servers for each job.<\/p>\n\n\n\n<p>In simple terms: you package your code as a container image, define how it should run (CPU\/memory, command, environment variables, networking), then <strong>submit a job<\/strong>. Batch schedules it on appropriate Compute capacity, runs it, captures results\/logs, and lets you scale from one-off jobs to many parallel tasks.<\/p>\n\n\n\n<p>Technically, Batch sits in the <strong>Compute<\/strong> ecosystem and typically integrates with common OCI building blocks such as <strong>Oracle Cloud Infrastructure Registry (OCIR)<\/strong> for container images, <strong>VCN<\/strong> for networking, and <strong>Logging\/Monitoring<\/strong> for observability. Batch resources are created in a <strong>compartment<\/strong> and operate within an OCI <strong>region<\/strong>. Exact capabilities and region availability can vary\u2014verify in the official docs for your tenancy and region.<\/p>\n\n\n\n<p><strong>What problem it solves:<\/strong> Batch solves the operational burden of running scheduled or ad-hoc compute tasks (ETL steps, media processing, Monte Carlo simulations, nightly reports, scientific workloads) by providing <strong>job orchestration + scheduling + scaling<\/strong>, while you focus on code and inputs\/outputs.<\/p>\n\n\n\n<blockquote>\n<p>Naming note (verify in official docs): Oracle\u2019s official documentation generally refers to this service as \u201cOCI Batch\u201d or \u201cBatch\u201d. This tutorial uses <strong>Batch<\/strong> as the primary service name, aligned with Oracle Cloud \u2192 Compute \u2192 Batch.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">2. What is Batch?<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Official purpose<\/h3>\n\n\n\n<p>Batch is intended to <strong>execute batch jobs<\/strong>\u2014workloads that run to completion without interactive sessions\u2014using container images and managed scheduling on OCI Compute.<\/p>\n\n\n\n<p>Official documentation entry point (start here and confirm current capabilities\/limits\/regions):\n&#8211; https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/batch\/home.htm<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Core capabilities (high level)<\/h3>\n\n\n\n<p>Batch commonly provides capabilities in these areas (confirm exact feature set in your region\/tenancy):\n&#8211; <strong>Job submission and execution:<\/strong> Run containerized tasks to completion.\n&#8211; <strong>Scheduling and placement:<\/strong> Decide where\/how jobs run (shape, CPU\/memory), and place them onto Compute capacity.\n&#8211; <strong>Parallelism:<\/strong> Support running many tasks concurrently for throughput (for example, running the same job across many inputs).\n&#8211; <strong>Retry and failure handling:<\/strong> Track job states and optionally retry failures (policy-dependent).\n&#8211; <strong>Networking integration:<\/strong> Run jobs inside your <strong>VCN<\/strong> with controlled ingress\/egress.\n&#8211; <strong>Observability hooks:<\/strong> Surface logs, job status, and metadata for operations teams.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Major components (conceptual model)<\/h3>\n\n\n\n<p>Terminology can evolve; verify exact names in the docs\/console for your tenancy:\n&#8211; <strong>Job definition<\/strong>: Template describing <em>how<\/em> to run a job (container image, command, resources, environment variables).\n&#8211; <strong>Job run<\/strong>: An actual execution instance of a job definition.\n&#8211; <strong>Compute environment \/ execution environment<\/strong>: Where the job runs (shape, networking\/subnet, scaling behavior).\n&#8211; <strong>Queue \/ scheduling layer<\/strong> (if present in current release): Coordinates submissions and dispatch to compute capacity.\n&#8211; <strong>Work requests \/ lifecycle operations<\/strong>: OCI-style asynchronous operations for creating\/updating resources.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Service type<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Managed batch orchestration service<\/strong> in Oracle Cloud <strong>Compute<\/strong> category.<\/li>\n<li>Uses OCI-native IAM, compartments, tagging, and (typically) integrates with standard OCI observability services.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Scope: regional vs. global<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Batch is typically a <strong>regional service<\/strong> (resources live in a specific OCI region), and <strong>compartment-scoped<\/strong> for organization\/governance.<\/li>\n<li>Region availability can vary. If you do not see Batch in the OCI Console for a region, verify service availability and tenancy enablement in official docs.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">How Batch fits into the Oracle Cloud ecosystem<\/h3>\n\n\n\n<p>Batch is usually used alongside:\n&#8211; <strong>Compute<\/strong> (capacity to run jobs)\n&#8211; <strong>OCIR<\/strong> (container images)\n&#8211; <strong>Object Storage<\/strong> (inputs\/outputs\/artifacts)\n&#8211; <strong>Logging<\/strong> (stdout\/stderr and job logs)\n&#8211; <strong>Monitoring\/Alarms<\/strong> (job health, failure detection)\n&#8211; <strong>VCN<\/strong> (private networking, NAT, service gateways)\n&#8211; <strong>IAM<\/strong> (policies controlling submissions and access to resources)<\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">3. Why use Batch?<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Business reasons<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Faster delivery of data and compute pipelines:<\/strong> Teams can ship processing jobs without building custom schedulers.<\/li>\n<li><strong>Lower operational overhead:<\/strong> Reduce time spent managing ephemeral job fleets and scaling logic.<\/li>\n<li><strong>Cost control:<\/strong> Pay primarily for the underlying compute and storage actually used (pricing details depend on your configuration; verify).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Technical reasons<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Container-first execution model:<\/strong> Standardize runtime dependencies and reduce \u201cworks on my machine\u201d issues.<\/li>\n<li><strong>Repeatability:<\/strong> A job definition can be versioned and re-run consistently.<\/li>\n<li><strong>Parallel throughput:<\/strong> Execute multiple tasks concurrently to shorten total processing windows.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Operational reasons<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Centralized job tracking:<\/strong> Monitor job state, failures, durations, and logs.<\/li>\n<li><strong>Controlled environments:<\/strong> Run jobs in dedicated subnets with defined routing and security lists.<\/li>\n<li><strong>Automation:<\/strong> Submit jobs from CI\/CD pipelines or event-driven triggers (for example, an object arrives in storage).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Security\/compliance reasons<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>IAM-based governance:<\/strong> Control who can define jobs, run jobs, and access artifacts.<\/li>\n<li><strong>Network isolation:<\/strong> Keep workloads private in a VCN; egress can be tightly controlled.<\/li>\n<li><strong>Auditability:<\/strong> OCI Audit can record relevant control-plane actions (verify exact events in your tenancy).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Scalability\/performance reasons<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Elastic job execution:<\/strong> Scale number of concurrent jobs (subject to quotas and capacity).<\/li>\n<li><strong>Appropriate shapes:<\/strong> Use CPU\/memory shapes suitable for compute-heavy, memory-heavy, or specialized workloads (availability depends on region).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">When teams should choose Batch<\/h3>\n\n\n\n<p>Choose Batch when:\n&#8211; Your workload is <strong>run-to-completion<\/strong> (ETL steps, rendering, simulations, offline ML inference).\n&#8211; You want <strong>containers<\/strong> and standard OCI controls (compartments, IAM, networking).\n&#8211; You need <strong>burst parallelism<\/strong> and want to avoid writing\/operating a scheduler.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">When teams should not choose Batch<\/h3>\n\n\n\n<p>Consider alternatives when:\n&#8211; You need long-running services with stable endpoints (use Compute instances, Kubernetes, or managed services).\n&#8211; You need interactive sessions (use Bastion + Compute, Data Science notebooks, etc.).\n&#8211; Your workload is better expressed as a managed data service (for example, Spark jobs might fit <strong>OCI Data Flow<\/strong> better).\n&#8211; You require orchestration across many steps with complex dependencies; you may need a workflow\/orchestration layer (for example, managed orchestration services or self-managed tools like Airflow\/Argo Workflows).<\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">4. Where is Batch used?<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Industries<\/h3>\n\n\n\n<p>Batch-style execution appears in:\n&#8211; Finance (risk calculations, end-of-day reporting)\n&#8211; Retail\/e-commerce (catalog processing, image resizing, analytics backfills)\n&#8211; Media and entertainment (transcoding, rendering, thumbnail generation)\n&#8211; Healthcare\/life sciences (genomics pipelines, research simulations)\n&#8211; Manufacturing\/IoT (offline analytics and data consolidation)\n&#8211; SaaS platforms (billing runs, audit scans, exports)<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Team types<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Platform engineering teams building internal compute platforms<\/li>\n<li>Data engineering teams running ETL\/ELT tasks<\/li>\n<li>DevOps\/SRE teams standardizing job execution and observability<\/li>\n<li>Research\/engineering teams running simulations and parameter sweeps<\/li>\n<li>Security teams running scheduled scans and compliance checks<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Workloads<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CPU-heavy transformations (compression, hashing, parsing)<\/li>\n<li>Memory-heavy operations (large in-memory joins, data enrichment)<\/li>\n<li>File-based processing (Object Storage inputs\/outputs)<\/li>\n<li>Batch ML inference (offline scoring)<\/li>\n<li>Map-style tasks (N inputs \u2192 N parallel jobs)<\/li>\n<li>Periodic scheduled processing (nightly\/weekly runs; scheduling may be external)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Architectures<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Event-triggered pipelines (Object Storage event \u2192 job submission)<\/li>\n<li>\u201cBatch backend\u201d for internal tools (submit job via API from portal)<\/li>\n<li>Hybrid flows (on-prem data sync \u2192 OCI Object Storage \u2192 Batch processing)<\/li>\n<li>HPC-adjacent batch execution (verify HPC-specific features in docs)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Production vs dev\/test usage<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Dev\/test<\/strong>: small shapes, low concurrency, sample datasets, minimal network isolation.<\/li>\n<li><strong>Production<\/strong>: private subnets, NAT\/service gateway, strict IAM, defined log retention, alarms, concurrency controls, cost governance, and automated cleanup of artifacts.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">5. Top Use Cases and Scenarios<\/h2>\n\n\n\n<p>Below are realistic scenarios where Oracle Cloud Batch is a strong fit.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1) Nightly ETL file transformation<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem:<\/strong> Convert daily CSV drops into partitioned formats and publish outputs.<\/li>\n<li><strong>Why Batch fits:<\/strong> Run containerized converters reliably, parallelize by file\/date.<\/li>\n<li><strong>Example:<\/strong> A retailer converts 5,000 CSV files nightly to compressed formats and stores results in Object Storage.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2) Media thumbnail generation at scale<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem:<\/strong> Generate thumbnails for millions of images\/videos.<\/li>\n<li><strong>Why Batch fits:<\/strong> Highly parallel; each input is independent.<\/li>\n<li><strong>Example:<\/strong> Submit one job per object prefix; each job pulls images and writes thumbnails to a new bucket.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3) Log reprocessing\/backfill<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem:<\/strong> A bug requires reprocessing last 30 days of logs.<\/li>\n<li><strong>Why Batch fits:<\/strong> Burst compute for a limited time, controlled concurrency.<\/li>\n<li><strong>Example:<\/strong> Run 30 parallel day-based jobs, each reading from Object Storage and writing corrected aggregates.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">4) Monte Carlo simulation \/ parameter sweeps<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem:<\/strong> Run thousands of independent simulation trials.<\/li>\n<li><strong>Why Batch fits:<\/strong> Large numbers of independent tasks; easy scaling.<\/li>\n<li><strong>Example:<\/strong> A fintech runs 50,000 simulation tasks, each with a different random seed, then aggregates results.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">5) Offline ML inference (batch scoring)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem:<\/strong> Score a dataset nightly with a fixed model version.<\/li>\n<li><strong>Why Batch fits:<\/strong> Deterministic runs with pinned container image and model artifact version.<\/li>\n<li><strong>Example:<\/strong> A SaaS vendor scores churn risk nightly and writes results to Object Storage for downstream systems.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">6) Security scanning of artifacts<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem:<\/strong> Regularly scan repositories or exported data for policy violations.<\/li>\n<li><strong>Why Batch fits:<\/strong> Repeatable scans with standardized container tools.<\/li>\n<li><strong>Example:<\/strong> Run weekly scanning jobs; export scan reports to Object Storage and notify on failures.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">7) Data export generation for customers<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem:<\/strong> Generate customer-specific exports on demand.<\/li>\n<li><strong>Why Batch fits:<\/strong> On-demand job submission; isolate per-customer execution.<\/li>\n<li><strong>Example:<\/strong> An internal portal submits a job for a customer; the job produces a signed download link.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">8) Scientific data processing pipeline step<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem:<\/strong> Execute a compute-heavy step (alignment, filtering, normalization) across many samples.<\/li>\n<li><strong>Why Batch fits:<\/strong> Parallelize per sample; keep compute ephemeral.<\/li>\n<li><strong>Example:<\/strong> A research team runs one job per sample, storing outputs for later aggregation.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">9) Batch PDF rendering \/ report generation<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem:<\/strong> Generate millions of PDFs from templates.<\/li>\n<li><strong>Why Batch fits:<\/strong> CPU-bound rendering in containers; parallel by tenant.<\/li>\n<li><strong>Example:<\/strong> A billing run triggers many jobs that render invoices and store them in Object Storage.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">10) Bulk database maintenance (carefully controlled)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem:<\/strong> Periodic offline maintenance scripts (exports, consistency checks).<\/li>\n<li><strong>Why Batch fits:<\/strong> Controlled run-to-completion tasks, with strict network\/IAM controls.<\/li>\n<li><strong>Example:<\/strong> A team runs an export utility container that connects privately to a database subnet (ensure security review).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">11) Migration batch steps<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem:<\/strong> Migrate and transform objects in bulk from one layout to another.<\/li>\n<li><strong>Why Batch fits:<\/strong> Burst processing; jobs can be idempotent and restartable.<\/li>\n<li><strong>Example:<\/strong> Re-key and re-encrypt objects, writing to a new bucket with a new naming scheme.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">12) Build\/test workloads (CI helpers)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem:<\/strong> Run large integration test suites that don\u2019t need a persistent cluster.<\/li>\n<li><strong>Why Batch fits:<\/strong> Containerized tests; easy parallelization.<\/li>\n<li><strong>Example:<\/strong> A team submits test shards as jobs; collects results into Object Storage.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">6. Core Features<\/h2>\n\n\n\n<blockquote>\n<p>Feature availability can vary by region and service version. Confirm details in the official Batch documentation: https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/batch\/home.htm<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">1) Container-based job execution<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>What it does:<\/strong> Runs jobs from container images (commonly stored in OCIR).<\/li>\n<li><strong>Why it matters:<\/strong> Reproducible runtime, dependency isolation.<\/li>\n<li><strong>Practical benefit:<\/strong> Same image runs in dev\/test\/prod, consistent results.<\/li>\n<li><strong>Caveats:<\/strong> Your image must be accessible (network + registry auth). Large images increase startup time.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2) Job definitions and job runs<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>What it does:<\/strong> Separates \u201ctemplate\u201d (definition) from \u201cexecution\u201d (run).<\/li>\n<li><strong>Why it matters:<\/strong> Enables repeatability, versioning, and controlled changes.<\/li>\n<li><strong>Practical benefit:<\/strong> Update a job definition for the next run without breaking previous runs.<\/li>\n<li><strong>Caveats:<\/strong> Changing definitions doesn\u2019t automatically change historical runs.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3) Compute resource selection (shapes\/CPU\/memory)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>What it does:<\/strong> Lets you choose the compute size appropriate for your batch job.<\/li>\n<li><strong>Why it matters:<\/strong> Avoid over-provisioning; align cost with needs.<\/li>\n<li><strong>Practical benefit:<\/strong> CPU-heavy jobs can use more OCPUs; memory-heavy jobs get adequate RAM.<\/li>\n<li><strong>Caveats:<\/strong> Your tenancy quotas and regional capacity apply.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">4) Parallel execution (concurrency)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>What it does:<\/strong> Runs multiple jobs or multiple tasks concurrently (exact mechanisms vary).<\/li>\n<li><strong>Why it matters:<\/strong> Batch workloads often need throughput, not just single-run performance.<\/li>\n<li><strong>Practical benefit:<\/strong> Process 10,000 files with 500 concurrent tasks rather than serial processing.<\/li>\n<li><strong>Caveats:<\/strong> Concurrency can amplify downstream bottlenecks (Object Storage request rates, database connections).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">5) Networking integration with VCN<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>What it does:<\/strong> Run jobs inside OCI VCN subnets.<\/li>\n<li><strong>Why it matters:<\/strong> Enables private access to databases and internal services.<\/li>\n<li><strong>Practical benefit:<\/strong> Keep traffic private; enforce egress controls.<\/li>\n<li><strong>Caveats:<\/strong> Misconfigured routing (no NAT\/service gateway) is a common cause of job failures.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">6) Environment variables and runtime configuration<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>What it does:<\/strong> Parameterize jobs (input paths, output paths, flags).<\/li>\n<li><strong>Why it matters:<\/strong> Same image can handle many datasets\/environments.<\/li>\n<li><strong>Practical benefit:<\/strong> Easy to rerun for new inputs without rebuilding.<\/li>\n<li><strong>Caveats:<\/strong> Do not place secrets in plain environment variables unless you understand exposure risk (see Security section).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">7) Observability (logs\/metrics)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>What it does:<\/strong> Exposes job lifecycle status and logs, and integrates with OCI observability services where available.<\/li>\n<li><strong>Why it matters:<\/strong> Operations teams need visibility for SLA\/SLO.<\/li>\n<li><strong>Practical benefit:<\/strong> Alerts on failures, dashboards for throughput and duration.<\/li>\n<li><strong>Caveats:<\/strong> Log retention and ingestion costs may apply; confirm Logging configuration.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">8) IAM, compartments, and tagging<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>What it does:<\/strong> Apply OCI governance: compartment scoping, tags, and policy-based access.<\/li>\n<li><strong>Why it matters:<\/strong> Multi-team environments need isolation and cost attribution.<\/li>\n<li><strong>Practical benefit:<\/strong> Tag jobs by app\/env\/cost-center; restrict who can run production jobs.<\/li>\n<li><strong>Caveats:<\/strong> Incorrect policy scoping is a common adoption blocker.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">9) API\/CLI\/SDK support (automation)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>What it does:<\/strong> Manage Batch resources programmatically.<\/li>\n<li><strong>Why it matters:<\/strong> Infrastructure-as-code, CI\/CD, and event-driven job submission.<\/li>\n<li><strong>Practical benefit:<\/strong> Submit jobs from pipelines, trigger processing from storage events.<\/li>\n<li><strong>Caveats:<\/strong> Always confirm the latest CLI\/SDK reference for resource names and parameters.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">10) Retry\/failure behavior (policy-based)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>What it does:<\/strong> Provides mechanisms to handle failures (for example, retries) depending on current service capabilities.<\/li>\n<li><strong>Why it matters:<\/strong> Batch workloads need resilient completion.<\/li>\n<li><strong>Practical benefit:<\/strong> Transient network glitches don\u2019t permanently fail pipelines.<\/li>\n<li><strong>Caveats:<\/strong> Retries can double cost if misconfigured; prefer idempotent job design.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">7. Architecture and How It Works<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">High-level architecture<\/h3>\n\n\n\n<p>At a high level, Batch orchestrates:\n1. <strong>You<\/strong> (or a pipeline) submit a job run request.\n2. Batch validates configuration and IAM.\n3. Batch schedules the job on appropriate <strong>Compute capacity<\/strong> (based on your selected environment\/config).\n4. The job pulls the container image (commonly from <strong>OCIR<\/strong>) and runs in your specified network context.\n5. Logs\/status are emitted and accessible through the console\/API and (where configured) <strong>OCI Logging\/Monitoring<\/strong>.\n6. Outputs are written to storage (often <strong>Object Storage<\/strong>) or downstream services.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Request\/data\/control flow (typical)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Control plane<\/strong>: create job definition \u2192 submit job run \u2192 track status \u2192 get logs\/metadata.<\/li>\n<li><strong>Data plane<\/strong>: job reads inputs (Object Storage, DB, APIs) \u2192 processes \u2192 writes outputs \u2192 exits.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Integrations with related services<\/h3>\n\n\n\n<p>Common integrations include:\n&#8211; <strong>OCIR<\/strong> for images: https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Registry\/home.htm\n&#8211; <strong>Object Storage<\/strong> for input\/output: https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Object\/home.htm\n&#8211; <strong>VCN<\/strong> networking: https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Network\/Concepts\/overview.htm\n&#8211; <strong>Logging<\/strong>: https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Logging\/home.htm\n&#8211; <strong>Monitoring<\/strong>: https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Monitoring\/home.htm\n&#8211; <strong>IAM<\/strong>: https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Identity\/home.htm\n&#8211; <strong>Audit<\/strong>: https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Audit\/home.htm<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Dependency services<\/h3>\n\n\n\n<p>Batch workloads almost always depend on:\n&#8211; Compute capacity (quotas and limits)\n&#8211; Network configuration (subnet, routing)\n&#8211; Registry access (image pull)\n&#8211; Storage endpoints and permissions (if reading\/writing data)<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Security\/authentication model<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Control-plane access<\/strong> is governed by OCI <strong>IAM policies<\/strong> (who can create job definitions, submit runs, view logs).<\/li>\n<li><strong>Data-plane access<\/strong> (job accessing Object Storage, databases, etc.) depends on:<\/li>\n<li>Network reachability (VCN + routing), and<\/li>\n<li>Credentials provided to the job (best: instance\/managed identity patterns, where supported; alternative: short-lived scoped credentials like pre-authenticated URLs for Object Storage).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Networking model<\/h3>\n\n\n\n<p>Typical job networking choices:\n&#8211; <strong>Public subnet<\/strong> (simpler to start): job has public egress; easier to pull images and reach public endpoints.\n&#8211; <strong>Private subnet<\/strong> (production-typical): job has no public IP; use <strong>NAT Gateway<\/strong> for internet egress and <strong>Service Gateway<\/strong> for private access to OCI services where applicable.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Monitoring\/logging\/governance considerations<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Set up:<\/li>\n<li>Log collection (stdout\/stderr) and retention policies.<\/li>\n<li>Alarms for failed jobs and abnormal runtimes.<\/li>\n<li>Tags and naming standards for cost tracking.<\/li>\n<li>Compartment structure for environment isolation.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Simple architecture diagram<\/h3>\n\n\n\n<pre><code class=\"language-mermaid\">flowchart LR\n  U[Engineer \/ CI Pipeline] --&gt;|Submit Job Run| B[Oracle Cloud Batch]\n  B --&gt;|Schedule| C[OCI Compute capacity]\n  C --&gt;|Pull image| R[OCIR - Container Registry]\n  C --&gt;|Read\/Write| O[Object Storage]\n  C --&gt;|Emit logs| L[OCI Logging]\n  U --&gt;|View status\/logs| B\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Production-style architecture diagram<\/h3>\n\n\n\n<pre><code class=\"language-mermaid\">flowchart TB\n  subgraph Tenancy[OCI Tenancy]\n    subgraph Compartment[Compartment: prod-batch]\n      B[Batch]\n      L[Logging]\n      M[Monitoring + Alarms]\n      A[Audit]\n      O[Object Storage: input\/output buckets]\n      R[OCIR: private repos]\n      subgraph VCN[VCN]\n        subgraph PrivateSubnet[Private Subnet]\n          CE[Batch compute environment \/ job runtime]\n        end\n        NAT[NAT Gateway]\n        SG[Service Gateway]\n      end\n    end\n  end\n\n  CI[CI\/CD or Orchestrator] --&gt;|API Submit| B\n  B --&gt;|Schedule| CE\n  CE --&gt;|Pull image| R\n  CE --&gt;|Private access| SG --&gt; O\n  CE --&gt;|Egress to internet (if needed)| NAT\n  CE --&gt; L\n  L --&gt; M\n  B --&gt; A\n  Ops[Ops\/SRE] --&gt;|Dashboards\/Alerts| M\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">8. Prerequisites<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Oracle Cloud account\/tenancy<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>An active <strong>Oracle Cloud (OCI) tenancy<\/strong> with access to the <strong>region<\/strong> where Batch is available.<\/li>\n<li>If Batch is not visible in the OCI Console for your region, verify service availability and any tenancy enablement requirements in official docs.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Permissions \/ IAM roles<\/h3>\n\n\n\n<p>For the hands-on lab, the simplest approach is to use a user in a group with broad permissions in a dedicated lab compartment (for example, tenancy admin or compartment admin).<\/p>\n\n\n\n<p>In real environments, you should implement least-privilege policies:\n&#8211; Separate roles for:\n  &#8211; Batch administrators (create\/maintain job definitions\/environments)\n  &#8211; Batch submitters (run jobs)\n  &#8211; Batch observers (read-only status\/logs)<\/p>\n\n\n\n<blockquote>\n<p>Verify the exact policy \u201cresource-types\u201d and \u201cverbs\u201d for Batch in the official IAM policy reference or Batch docs. OCI policy syntax and resource families can be service-specific.<\/p>\n<\/blockquote>\n\n\n\n<p>IAM docs:\n&#8211; https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Identity\/Concepts\/policies.htm<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Billing requirements<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You need a billing-enabled tenancy for paid Compute usage.<\/li>\n<li>Many OCI accounts include promotions\/credits; costs still apply once credits expire.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Tools<\/h3>\n\n\n\n<p>For the tutorial workflow, you\u2019ll typically use:\n&#8211; <strong>OCI Console<\/strong> (web)\n&#8211; <strong>Docker<\/strong> (to build\/push images)\n&#8211; Optional: <strong>OCI CLI<\/strong> for automation<br\/>\n  CLI docs: https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/API\/Concepts\/cliconcepts.htm<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Region availability<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Verify in the Batch documentation and the OCI Console region selector.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Quotas\/limits<\/h3>\n\n\n\n<p>Common constraints that can block your first run:\n&#8211; Compute service limits (OCPUs, instance counts)\n&#8211; Network limits (subnets, VNICs)\n&#8211; Registry limits (storage, pulls)\n&#8211; Logging ingestion\/retention configurations<\/p>\n\n\n\n<p>Check:\n&#8211; Service limits: https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/General\/Concepts\/servicelimits.htm<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Prerequisite services<\/h3>\n\n\n\n<p>Most Batch jobs require:\n&#8211; A network (VCN\/subnet)\n&#8211; A container image repository (OCIR or another accessible registry)\n&#8211; A data source\/sink (often Object Storage)<\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">9. Pricing \/ Cost<\/h2>\n\n\n\n<blockquote>\n<p>Pricing varies by region, currency, and sometimes by agreement. Do not rely on example numbers. Always validate with Oracle\u2019s official pricing pages and your tenancy\u2019s Cost Analysis.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">Official pricing references<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Oracle Cloud Pricing overview: https:\/\/www.oracle.com\/cloud\/pricing\/<\/li>\n<li>Oracle Cloud price list: https:\/\/www.oracle.com\/cloud\/price-list\/<\/li>\n<li>OCI cost management (docs): https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Billing\/home.htm<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Pricing model (how Batch is typically billed)<\/h3>\n\n\n\n<p>Batch as an orchestration layer is commonly priced in one of these ways (verify for Batch specifically):\n1. <strong>No separate charge for the Batch control plane<\/strong>, but you pay for underlying resources used by the job (Compute, Storage, Logging, Networking).\n2. <strong>Service charge + underlying resources<\/strong> (less common in OCI patterns, but must be verified).<\/p>\n\n\n\n<p>If the Batch pricing page is not explicit, treat it as: <strong>your bill is dominated by the compute runtime and attached services<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Pricing dimensions you should plan for<\/h3>\n\n\n\n<p>Even if Batch itself has no standalone line item, batch workloads incur costs from:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Compute<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Shape type (ECPU\/OCPU), memory size, GPU (if used), and runtime duration.<\/li>\n<li>Whether you use on-demand vs discounted capacity types (for example, preemptible\u2014verify availability\/support with Batch).<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Container registry (OCIR)<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Storage consumed by images and artifacts.<\/li>\n<li>Data transfer for pulls (depends on network path and region).<\/li>\n<\/ul>\n\n\n\n<p>OCIR docs:\n&#8211; https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Registry\/home.htm<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Object Storage<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Storage for inputs\/outputs.<\/li>\n<li>Requests (PUT\/GET\/LIST) and retrieval patterns.<\/li>\n<li>Data transfer out (egress) if downloading to the public internet.<\/li>\n<\/ul>\n\n\n\n<p>Object Storage docs:\n&#8211; https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Object\/home.htm<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Logging<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Log ingestion volume (stdout\/stderr can be large).<\/li>\n<li>Retention duration.<\/li>\n<li>Search\/analytics features if enabled.<\/li>\n<\/ul>\n\n\n\n<p>Logging docs:\n&#8211; https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Logging\/home.htm<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Networking<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>NAT Gateway processing (if used) and data processed.<\/li>\n<li>Data egress to the internet (if jobs download\/upload externally).<\/li>\n<li>Load balancers are usually not needed for batch, but may exist in surrounding architecture.<\/li>\n<\/ul>\n\n\n\n<p>VCN docs:\n&#8211; https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Network\/Concepts\/overview.htm<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Cost drivers (what makes costs spike)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>High parallelism without concurrency limits<\/li>\n<li>Large container images pulled repeatedly<\/li>\n<li>Chatty jobs that do many Object Storage GET\/PUT requests<\/li>\n<li>Excessive logs (debug logging left on)<\/li>\n<li>Jobs that retry repeatedly without fixing root cause<\/li>\n<li>Jobs that sit in a \u201crunning\u201d state due to stuck I\/O or waiting on external services<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Hidden\/indirect costs<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Developer time spent debugging network\/IAM issues<\/li>\n<li>Storage growth from keeping outputs and logs indefinitely<\/li>\n<li>Costs from copying data between regions<\/li>\n<li>Costs from leaving test environments running (subnets, gateways, retained logs)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Network\/data transfer implications<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Prefer keeping data <strong>in-region<\/strong> (Object Storage in the same region as your jobs).<\/li>\n<li>Prefer <strong>private access<\/strong> to OCI services (Service Gateway where applicable) to reduce internet exposure.<\/li>\n<li>Control internet egress via NAT and route rules in production.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">How to optimize cost (practical checklist)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Right-size CPU\/memory (test with small datasets first).<\/li>\n<li>Keep container images small (multi-stage builds, minimal base images).<\/li>\n<li>Use concurrency caps aligned with downstream systems (DB connections, request rates).<\/li>\n<li>Store intermediate data with lifecycle rules (Object Storage lifecycle policies).<\/li>\n<li>Reduce logs to necessary signal; keep debug logs off by default.<\/li>\n<li>Implement timeouts and fail-fast behavior.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Example low-cost starter estimate (non-numeric)<\/h3>\n\n\n\n<p>A minimal lab run usually includes:\n&#8211; A small amount of compute runtime (minutes)\n&#8211; A small OCIR image (tens to hundreds of MB)\n&#8211; A few Object Storage operations\n&#8211; Some log lines<\/p>\n\n\n\n<p>This is typically inexpensive, but the exact amount depends on your region and selected compute shape.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Example production cost considerations<\/h3>\n\n\n\n<p>For production, cost planning should include:\n&#8211; Peak concurrency * average runtime * compute rate\n&#8211; Data volume processed per day and corresponding Object Storage request patterns\n&#8211; Log ingestion volume and retention\n&#8211; NAT\/data egress if calling external APIs\n&#8211; Reserved capacity or committed use discounts (if applicable to your org)<\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">10. Step-by-Step Hands-On Tutorial<\/h2>\n\n\n\n<p>This lab is designed to be <strong>beginner-friendly<\/strong>, <strong>low-risk<\/strong>, and realistic. It demonstrates a containerized batch job that:\n&#8211; Downloads an input text file from Object Storage using a <strong>Pre-Authenticated Request (PAR) URL<\/strong>\n&#8211; Counts lines\/words\n&#8211; Uploads a small output report back to Object Storage using a <strong>write PAR URL<\/strong>\n&#8211; Emits logs you can view as the job output<\/p>\n\n\n\n<p>Using PAR URLs avoids having to configure in-job OCI authentication for your first run (which is important, but a separate security-focused lab).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Objective<\/h3>\n\n\n\n<p>Run your first <strong>Oracle Cloud Batch<\/strong> job using:\n&#8211; OCIR for container image\n&#8211; Object Storage for input\/output\n&#8211; Batch for scheduling\/execution\n&#8211; Logging (or job logs) for verification<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Lab Overview<\/h3>\n\n\n\n<p>You will:\n1. Create Object Storage buckets and objects (input + output destination)\n2. Create PAR URLs (read for input, write for output)\n3. Build and push a small container image to OCIR\n4. Create a Batch job definition and compute environment (as required by your console)\n5. Submit a job run with environment variables pointing to PAR URLs\n6. Validate logs and output object\n7. Clean up all resources to stop charges<\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">Step 1: Create a compartment (recommended)<\/h3>\n\n\n\n<p><strong>Goal:<\/strong> isolate lab resources for easier cleanup.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>In OCI Console, open <strong>Identity &amp; Security \u2192 Compartments<\/strong><\/li>\n<li>Create a compartment, e.g.:\n   &#8211; Name: <code>lab-batch<\/code>\n   &#8211; Description: <code>Batch tutorial lab<\/code><\/li>\n<li>Ensure you are working in this compartment for the rest of the lab.<\/li>\n<\/ol>\n\n\n\n<p><strong>Expected outcome:<\/strong> a dedicated compartment to hold Batch, VCN, OCIR, and Object Storage resources.<\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">Step 2: Create Object Storage buckets and an input file<\/h3>\n\n\n\n<p><strong>Goal:<\/strong> provide input and a place to write output.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Go to <strong>Storage \u2192 Object Storage &amp; Archive Storage \u2192 Buckets<\/strong><\/li>\n<li>Create two buckets in the same region:\n   &#8211; <code>batch-lab-input-&lt;unique&gt;<\/code>\n   &#8211; <code>batch-lab-output-&lt;unique&gt;<\/code><\/li>\n<li>Enter the input bucket and upload a small text file named <code>input.txt<\/code> with contents like:<\/li>\n<\/ol>\n\n\n\n<pre><code class=\"language-text\">alpha beta gamma\ndelta epsilon zeta\neta theta iota\n<\/code><\/pre>\n\n\n\n<p><strong>Expected outcome:<\/strong> <code>input.txt<\/code> exists in the input bucket.<\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">Step 3: Create Pre-Authenticated Requests (PAR URLs)<\/h3>\n\n\n\n<p><strong>Goal:<\/strong> allow the job container to access Object Storage without embedding OCI credentials.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">3A) Create a read PAR for the input object<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open the input bucket \u2192 locate <code>input.txt<\/code><\/li>\n<li>Use the console option for <strong>Pre-Authenticated Request<\/strong> (PAR)<\/li>\n<li>Create a PAR that allows <strong>read access<\/strong> to <code>input.txt<\/code><\/li>\n<li>Set a short expiration time (for example, a few hours)<\/li>\n<li>Copy the generated PAR URL; you will use it as <code>INPUT_URL<\/code><\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">3B) Create a write PAR for the output bucket<\/h4>\n\n\n\n<p>You want a URL the job can use to upload a report.<\/p>\n\n\n\n<p>Approach varies depending on OCI PAR options in the console:\n&#8211; If the console allows a PAR for <strong>object write<\/strong> with a defined object name, create one for <code>report.txt<\/code>.\n&#8211; If it only supports bucket-level or prefix-level access, create accordingly and plan to PUT to the allowed path.<\/p>\n\n\n\n<p>Create a PAR that allows <strong>write<\/strong> to the output location and copy it as <code>OUTPUT_URL<\/code>.<\/p>\n\n\n\n<p><strong>Expected outcome:<\/strong> you have two URLs:\n&#8211; <code>INPUT_URL<\/code> (GET)\n&#8211; <code>OUTPUT_URL<\/code> (PUT\/WRITE)<\/p>\n\n\n\n<p><strong>Security note:<\/strong> PAR URLs are bearer secrets. Treat them like credentials and expire them quickly.<\/p>\n\n\n\n<p>Docs:\n&#8211; https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Object\/Tasks\/usingpreauthenticatedrequests.htm<\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">Step 4: Create an OCIR repository<\/h3>\n\n\n\n<p><strong>Goal:<\/strong> store your container image where Batch can pull it.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Go to <strong>Developer Services \u2192 Containers &amp; Artifacts \u2192 Container Registry<\/strong><\/li>\n<li>Find your <strong>Tenancy namespace<\/strong> (you will need it for image naming)<\/li>\n<li>Create a repository, for example:\n   &#8211; Repo name: <code>batch-lab\/wordcount<\/code>\n   &#8211; Visibility: private (recommended)<\/li>\n<\/ol>\n\n\n\n<p><strong>Expected outcome:<\/strong> an OCIR repo exists and you know your tenancy namespace and region key (e.g., <code>iad<\/code>, <code>fra<\/code>, etc.).<\/p>\n\n\n\n<p>Docs:\n&#8211; https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Registry\/Concepts\/registryoverview.htm<\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">Step 5: Build a small container image (word\/line count + upload report)<\/h3>\n\n\n\n<p><strong>Goal:<\/strong> create a container that reads <code>INPUT_URL<\/code>, computes counts, and uploads to <code>OUTPUT_URL<\/code>.<\/p>\n\n\n\n<p>On your local machine with Docker installed, create a folder and files:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">5A) <code>process.sh<\/code><\/h4>\n\n\n\n<pre><code class=\"language-bash\">#!\/usr\/bin\/env bash\nset -euo pipefail\n\necho \"Starting batch job...\"\necho \"INPUT_URL is set: ${INPUT_URL:+yes}\"\necho \"OUTPUT_URL is set: ${OUTPUT_URL:+yes}\"\n\nif [[ -z \"${INPUT_URL:-}\" || -z \"${OUTPUT_URL:-}\" ]]; then\n  echo \"ERROR: INPUT_URL and OUTPUT_URL environment variables must be set.\"\n  exit 2\nfi\n\necho \"Downloading input...\"\ncurl -fsSL \"$INPUT_URL\" -o \/tmp\/input.txt\n\nLINES=$(wc -l &lt; \/tmp\/input.txt | tr -d ' ')\nWORDS=$(wc -w &lt; \/tmp\/input.txt | tr -d ' ')\n\ncat &gt; \/tmp\/report.txt &lt;&lt;EOF\nBatch report\n============\nLines: $LINES\nWords: $WORDS\nEOF\n\necho \"Uploading report...\"\n# Upload report to the write PAR URL\ncurl -fsS -X PUT --upload-file \/tmp\/report.txt \"$OUTPUT_URL\"\n\necho \"Done. Report uploaded.\"\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5B) <code>Dockerfile<\/code><\/h4>\n\n\n\n<pre><code class=\"language-dockerfile\">FROM alpine:3.20\n\nRUN apk add --no-cache bash curl coreutils\n\nWORKDIR \/app\nCOPY process.sh \/app\/process.sh\nRUN chmod +x \/app\/process.sh\n\nENTRYPOINT [\"\/app\/process.sh\"]\n<\/code><\/pre>\n\n\n\n<p>Build the image:<\/p>\n\n\n\n<pre><code class=\"language-bash\">docker build -t batch-lab-wordcount:1.0 .\n<\/code><\/pre>\n\n\n\n<p><strong>Expected outcome:<\/strong> you have a local image <code>batch-lab-wordcount:1.0<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">Step 6: Push the image to OCIR<\/h3>\n\n\n\n<p><strong>Goal:<\/strong> make the image available for Batch execution.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">6A) Create an auth token (if needed)<\/h4>\n\n\n\n<p>OCIR commonly uses an <strong>Auth Token<\/strong> for Docker login (created under your user settings).<\/p>\n\n\n\n<p>OCI docs for auth tokens:\n&#8211; https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Identity\/Tasks\/managingcredentials.htm<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">6B) Log in to OCIR and push<\/h4>\n\n\n\n<p>You need:\n&#8211; Region-specific registry endpoint: <code>&lt;region-key&gt;.ocir.io<\/code>\n&#8211; Tenancy namespace: shown in the Container Registry page\n&#8211; Username format: commonly <code>&lt;tenancy-namespace&gt;\/&lt;username&gt;<\/code> (verify in console instructions)<\/p>\n\n\n\n<p>Example (replace placeholders with your values):<\/p>\n\n\n\n<pre><code class=\"language-bash\">export REGION_KEY=\"&lt;your_region_key&gt;\"              # e.g., iad\nexport NAMESPACE=\"&lt;your_tenancy_namespace&gt;\"\nexport OCIR_ENDPOINT=\"${REGION_KEY}.ocir.io\"\nexport REPO=\"${OCIR_ENDPOINT}\/${NAMESPACE}\/batch-lab\/wordcount\"\nexport TAG=\"1.0\"\n\ndocker tag batch-lab-wordcount:1.0 \"${REPO}:${TAG}\"\n\ndocker login \"${OCIR_ENDPOINT}\"\n# Username: &lt;namespace&gt;\/&lt;your-oci-username&gt;\n# Password: your auth token\n\ndocker push \"${REPO}:${TAG}\"\n<\/code><\/pre>\n\n\n\n<p><strong>Expected outcome:<\/strong> the image tag appears in the OCIR repository.<\/p>\n\n\n\n<p>Common issues:\n&#8211; <code>denied: requested access to the resource is denied<\/code> \u2192 wrong repo path\/namespace or missing permissions\n&#8211; <code>unauthorized: authentication required<\/code> \u2192 wrong username format or wrong auth token<\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">Step 7: Create network prerequisites (VCN + subnet)<\/h3>\n\n\n\n<p><strong>Goal:<\/strong> allow the job runtime to pull images and reach Object Storage PAR URLs.<\/p>\n\n\n\n<p>For a first lab, a <strong>public subnet<\/strong> is the simplest path.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Go to <strong>Networking \u2192 Virtual Cloud Networks<\/strong><\/li>\n<li>Create a VCN with \u201cVCN Wizard\u201d:\n   &#8211; <strong>VCN with Internet Connectivity<\/strong><\/li>\n<li>Ensure you have:\n   &#8211; A VCN\n   &#8211; An Internet Gateway\n   &#8211; A public subnet with a route to the Internet Gateway\n   &#8211; Security list allowing egress (default egress is typically allowed)<\/li>\n<\/ol>\n\n\n\n<p><strong>Expected outcome:<\/strong> you have a subnet you can choose when configuring Batch job runtime networking.<\/p>\n\n\n\n<blockquote>\n<p>Production note: For production, prefer private subnets + NAT Gateway + Service Gateway. Public subnets are fine for learning but require careful security review.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">Step 8: Create a Batch job definition (and compute environment if required)<\/h3>\n\n\n\n<p><strong>Goal:<\/strong> define how the job runs (image, command, compute, networking, env vars).<\/p>\n\n\n\n<p>Because OCI Console screens can vary by service release, use the official Batch \u201cGetting Started\u201d flow as the source of truth and map the fields below to your UI:\n&#8211; https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/batch\/home.htm<\/p>\n\n\n\n<p>In OCI Console:\n1. Go to <strong>Compute \u2192 Batch<\/strong> (service location may vary by console layout)\n2. Create required foundational resources (if prompted), such as:\n   &#8211; A <strong>compute environment<\/strong> \/ execution environment (choose your VCN\/subnet, shape sizing)\n3. Create a <strong>job definition<\/strong> (or equivalent):\n   &#8211; <strong>Image:<\/strong> <code>\"&lt;region-key&gt;.ocir.io\/&lt;namespace&gt;\/batch-lab\/wordcount:1.0\"<\/code>\n   &#8211; <strong>Environment variables:<\/strong>\n     &#8211; <code>INPUT_URL<\/code> = your input PAR URL\n     &#8211; <code>OUTPUT_URL<\/code> = your output write PAR URL\n   &#8211; <strong>Resources:<\/strong> start small (minimal CPU\/memory supported)\n   &#8211; <strong>Networking:<\/strong> select the subnet created in Step 7\n   &#8211; <strong>Logging:<\/strong> enable job logs if offered, or ensure you can view stdout\/stderr from the job run<\/p>\n\n\n\n<p><strong>Expected outcome:<\/strong> a saved job definition ready to run.<\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">Step 9: Submit a job run<\/h3>\n\n\n\n<p><strong>Goal:<\/strong> execute the container.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>In the Batch console, select the job definition<\/li>\n<li>Click <strong>Run<\/strong> \/ <strong>Submit job run<\/strong><\/li>\n<li>Confirm:\n   &#8211; Correct image tag\n   &#8211; Env vars are populated with your PAR URLs\n   &#8211; Correct subnet\/VCN\n   &#8211; Any retry policy is reasonable (for the lab, keep it minimal)<\/li>\n<\/ol>\n\n\n\n<p><strong>Expected outcome:<\/strong> a job run is created and transitions through states such as queued \u2192 running \u2192 succeeded\/failed (exact state names may vary).<\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">Validation<\/h3>\n\n\n\n<p>Validate through <strong>both logs and outputs<\/strong>.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\n<p><strong>Check job status<\/strong>\n   &#8211; In Batch console, open the job run details and confirm it reaches <strong>Succeeded<\/strong>.<\/p>\n<\/li>\n<li>\n<p><strong>View job logs<\/strong>\n   &#8211; Look for lines:<\/p>\n<ul>\n<li><code>Downloading input...<\/code><\/li>\n<li><code>Uploading report...<\/code><\/li>\n<li><code>Done. Report uploaded.<\/code><\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>Verify the output object<\/strong>\n   &#8211; Go to the output bucket\n   &#8211; Confirm <code>report.txt<\/code> (or your configured output object path) exists\n   &#8211; Download and confirm it contains line\/word counts<\/p>\n<\/li>\n<\/ol>\n\n\n\n<p><strong>Expected outcome:<\/strong> output report exists in Object Storage and job logs show success.<\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">Troubleshooting<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Issue: Job fails to pull image<\/h4>\n\n\n\n<p>Symptoms:\n&#8211; Job fails quickly; logs show image pull errors.<\/p>\n\n\n\n<p>Fixes:\n&#8211; Ensure the image reference is correct: <code>&lt;region-key&gt;.ocir.io\/&lt;namespace&gt;\/&lt;repo&gt;:&lt;tag&gt;<\/code>\n&#8211; Ensure the job runtime can reach OCIR (network egress)\n&#8211; Ensure registry permissions are correct (repo visibility, IAM)\n&#8211; Confirm the image exists and tag is correct<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Issue: Job can\u2019t download INPUT_URL<\/h4>\n\n\n\n<p>Symptoms:\n&#8211; <code>curl: (22) The requested URL returned error: 403<\/code> or <code>404<\/code><\/p>\n\n\n\n<p>Fixes:\n&#8211; Confirm the PAR URL hasn\u2019t expired\n&#8211; Confirm it\u2019s for the correct object\n&#8211; Confirm it allows <strong>read<\/strong> access\n&#8211; Confirm the job has internet egress (public subnet or NAT)<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Issue: Job can\u2019t upload OUTPUT_URL<\/h4>\n\n\n\n<p>Symptoms:\n&#8211; <code>curl: (22) ... 403<\/code> on PUT<\/p>\n\n\n\n<p>Fixes:\n&#8211; Confirm PAR allows <strong>write<\/strong> for the target object\/path\n&#8211; Confirm you used a <strong>write-enabled<\/strong> PAR (not read-only)\n&#8211; If the PAR is object-specific, ensure the URL matches the object name you\u2019re uploading<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Issue: Job stuck in queued state<\/h4>\n\n\n\n<p>Fixes:\n&#8211; Check Compute quotas\/service limits (OCPUs, instance counts)\n&#8211; Check regional capacity\n&#8211; Reduce requested CPU\/memory\n&#8211; Verify your compute environment configuration (subnet, shape)<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Issue: No logs visible<\/h4>\n\n\n\n<p>Fixes:\n&#8211; Check if logging needs explicit enablement in the job definition\n&#8211; Check OCI Logging configuration in the compartment\n&#8211; Confirm you\u2019re looking at the correct job run and time window<\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">Cleanup<\/h3>\n\n\n\n<p>To avoid ongoing charges and clutter, delete resources in this order:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Stop\/delete job runs<\/strong> (if still running)<\/li>\n<li>Delete <strong>job definition(s)<\/strong><\/li>\n<li>Delete <strong>compute environment\/execution environment<\/strong> (if created)<\/li>\n<li>Delete <strong>VCN<\/strong> (this deletes subnets and gateways; ensure nothing else uses it)<\/li>\n<li>Delete <strong>Object Storage PARs<\/strong> (important\u2014treat them like secrets)<\/li>\n<li>Delete <strong>Object Storage objects<\/strong> and buckets (or apply lifecycle rules)<\/li>\n<li>Delete <strong>OCIR image tags<\/strong> and repository (if not needed)<\/li>\n<li>Delete the <strong>compartment<\/strong> (optional; only after it is empty)<\/li>\n<\/ol>\n\n\n\n<p><strong>Expected outcome:<\/strong> your tenancy returns to its pre-lab state, and billable resources are removed.<\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">11. Best Practices<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Architecture best practices<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Keep Batch jobs <strong>stateless<\/strong> and store state in external systems (Object Storage, databases).<\/li>\n<li>Design for <strong>idempotency<\/strong>: rerunning a job should not corrupt outputs.<\/li>\n<li>Use <strong>one job per unit of work<\/strong> (per file, per partition, per customer) to maximize parallelism safely.<\/li>\n<li>Prefer <strong>in-region data<\/strong> to avoid latency and egress.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">IAM\/security best practices<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use least-privilege IAM:<\/li>\n<li>Separate \u201cdefine\u201d vs \u201crun\u201d permissions.<\/li>\n<li>Restrict who can reference sensitive networks\/subnets.<\/li>\n<li>Avoid embedding long-lived secrets in images or env vars.<\/li>\n<li>Use short-lived access methods where possible (PAR URLs with short expiration for simple patterns).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Cost best practices<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Right-size compute and set concurrency limits.<\/li>\n<li>Keep images small and reuse layers to reduce pull time.<\/li>\n<li>Store only necessary logs; set retention policies.<\/li>\n<li>Use Object Storage lifecycle policies for outputs and intermediates.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Performance best practices<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Batch more work per job when overhead dominates (startup time, image pulls).<\/li>\n<li>Split work into more jobs when parallelism dominates (many independent inputs).<\/li>\n<li>Reduce Object Storage chattiness:<\/li>\n<li>Use larger sequential reads instead of many tiny GETs.<\/li>\n<li>Aggregate small files where possible.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Reliability best practices<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Implement timeouts and retries thoughtfully:<\/li>\n<li>Retry transient network errors.<\/li>\n<li>Avoid retry loops on deterministic failures (bad input, permission denied).<\/li>\n<li>Emit structured logs (key=value) to make searches easier.<\/li>\n<li>Record a run identifier in outputs for traceability.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Operations best practices<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Build dashboards for:<\/li>\n<li>Job success rate<\/li>\n<li>Average runtime and p95 runtime<\/li>\n<li>Concurrency and queue depth (if available)<\/li>\n<li>Alert on:<\/li>\n<li>Failure spikes<\/li>\n<li>Jobs exceeding expected runtime (stuck jobs)<\/li>\n<li>Standardize naming:<\/li>\n<li><code>app-env-jobname-version<\/code><\/li>\n<li>Use tags:<\/li>\n<li><code>CostCenter<\/code>, <code>App<\/code>, <code>Env<\/code>, <code>Owner<\/code>, <code>DataSensitivity<\/code><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Governance\/tagging\/naming best practices<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use compartments per environment (<code>dev<\/code>, <code>test<\/code>, <code>prod<\/code>) and per team when needed.<\/li>\n<li>Apply tag defaults at compartment level for cost attribution.<\/li>\n<li>Track \u201cimage version \u2192 job definition version \u2192 run\u201d mappings.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">12. Security Considerations<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Identity and access model<\/h3>\n\n\n\n<p>Security splits into two planes:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\n<p><strong>Control plane (who can manage Batch resources)<\/strong>\n   &#8211; Governed by OCI IAM policies and compartments.\n   &#8211; Recommended:<\/p>\n<ul>\n<li>Admin group: manage job definitions\/environments<\/li>\n<li>Operator group: submit job runs<\/li>\n<li>Observer group: read job status\/logs only<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>Data plane (what the job can access at runtime)<\/strong>\n   &#8211; Governed by network reachability + credentials\/authorization patterns.\n   &#8211; Avoid giving jobs broader access than needed.<\/p>\n<\/li>\n<\/ol>\n\n\n\n<p>IAM docs:\n&#8211; https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Identity\/home.htm<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Encryption<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>OCI services typically encrypt data at rest by default (verify for each dependent service).<\/li>\n<li>Use TLS endpoints for Object Storage and registry pulls (standard).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Network exposure<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Prefer <strong>private subnets<\/strong> for production.<\/li>\n<li>Use:<\/li>\n<li>NAT Gateway for controlled egress<\/li>\n<li>Service Gateway for private access to OCI services (where supported)<\/li>\n<li>Restrict egress where feasible (at least by route design; consider network firewall patterns for advanced controls).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Secrets handling<\/h3>\n\n\n\n<p>Avoid:\n&#8211; Hardcoding secrets in container images\n&#8211; Passing secrets as plain environment variables in shared environments\n&#8211; Leaving PAR URLs valid for days<\/p>\n\n\n\n<p>Prefer:\n&#8211; Short-lived credentials (PAR with short TTL, rotated frequently)\n&#8211; Centralized secret management patterns (verify your organization\u2019s approved approach; OCI Vault is commonly used in OCI architectures)<\/p>\n\n\n\n<p>OCI Vault docs:\n&#8211; https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/KeyManagement\/home.htm<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Audit\/logging<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use OCI Audit to track who created\/changed job definitions and who submitted job runs.<\/li>\n<li>Ensure logs do not contain secrets (redact tokens, URLs with signatures).<\/li>\n<\/ul>\n\n\n\n<p>Audit docs:\n&#8211; https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Audit\/home.htm<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Compliance considerations<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Data residency: keep data and job execution in approved regions.<\/li>\n<li>Access controls: compartment design + IAM reviews.<\/li>\n<li>Retention: define log and output retention policies.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Common security mistakes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Running production jobs in public subnets unnecessarily<\/li>\n<li>Over-permissive IAM (\u201cmanage all resources in tenancy\u201d for CI systems)<\/li>\n<li>Long-lived PAR URLs embedded in job definitions<\/li>\n<li>No tag\/ownership \u2192 orphaned jobs and unknown data exposure<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Secure deployment recommendations<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use private networking for production.<\/li>\n<li>Enforce least-privilege policies and periodic reviews.<\/li>\n<li>Add automated checks in CI\/CD:<\/li>\n<li>Approved image registries only<\/li>\n<li>Required tags<\/li>\n<li>Concurrency limits<\/li>\n<li>Max runtime\/timeout settings (where supported)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">13. Limitations and Gotchas<\/h2>\n\n\n\n<blockquote>\n<p>Confirm current limits and behavior in the official docs for Batch and your region.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">Known limitations (common in batch systems)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Region availability:<\/strong> Batch may not be available in all OCI regions.<\/li>\n<li><strong>Quotas:<\/strong> Compute quotas can block job scheduling.<\/li>\n<li><strong>Network misconfiguration:<\/strong> Private subnet without NAT\/service gateway leads to failures pulling images or fetching input URLs.<\/li>\n<li><strong>Image size\/time-to-start:<\/strong> Large images slow job startup.<\/li>\n<li><strong>Log volume:<\/strong> High-volume logs can become expensive and hard to search.<\/li>\n<li><strong>Output consistency:<\/strong> If jobs are not idempotent, retries can create duplicate or inconsistent outputs.<\/li>\n<li><strong>Downstream bottlenecks:<\/strong> High concurrency can overload databases or APIs.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Pricing surprises<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>NAT Gateway processing and internet egress can be non-trivial at scale.<\/li>\n<li>Logging ingestion can grow quickly with debug logs or verbose applications.<\/li>\n<li>Object Storage request costs can rise with large numbers of small objects.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Compatibility issues<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Container images built for the wrong CPU architecture won\u2019t run (ensure correct platform).<\/li>\n<li>Jobs that require privileged containers or special kernel features may not be supported (verify runtime constraints in Batch docs).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Operational gotchas<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u201cQueued forever\u201d usually means quotas\/capacity mismatch.<\/li>\n<li>\u201cWorks in dev, fails in prod\u201d often points to network egress restrictions or missing private endpoints.<\/li>\n<li>Missing tags\/ownership leads to orphaned spend.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Migration challenges<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>If migrating from self-managed schedulers (Cron + VMs, Slurm, Kubernetes), map:<\/li>\n<li>job definition semantics<\/li>\n<li>retries\/timeouts<\/li>\n<li>logging and artifact handling<\/li>\n<li>concurrency controls and quotas<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Vendor-specific nuances<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>OCI uses compartments, policies, and region-scoped resources; plan org structure early.<\/li>\n<li>Naming\/console placement can evolve; keep runbooks updated.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">14. Comparison with Alternatives<\/h2>\n\n\n\n<p>Batch workloads can be executed in multiple ways. The right choice depends on whether you prioritize managed scheduling, container standardization, workflow orchestration, or tight Kubernetes integration.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Comparison table<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Option<\/th>\n<th>Best For<\/th>\n<th>Strengths<\/th>\n<th>Weaknesses<\/th>\n<th>When to Choose<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Oracle Cloud Batch<\/strong><\/td>\n<td>Containerized run-to-completion jobs on OCI<\/td>\n<td>Managed job execution, OCI-native IAM\/networking integration<\/td>\n<td>Service availability\/feature set may vary; learning curve<\/td>\n<td>You want a managed batch scheduler on OCI with containerized workloads<\/td>\n<\/tr>\n<tr>\n<td><strong>OCI Compute instances + cron\/systemd<\/strong><\/td>\n<td>Simple scheduled tasks<\/td>\n<td>Full control, straightforward<\/td>\n<td>You manage servers, scaling, patching<\/td>\n<td>Low volume, stable jobs, or legacy scripts that aren\u2019t containerized yet<\/td>\n<\/tr>\n<tr>\n<td><strong>OCI Container Instances<\/strong><\/td>\n<td>Running containers without managing servers<\/td>\n<td>Simple container runs, quick start<\/td>\n<td>Not a scheduler by itself; orchestration is external<\/td>\n<td>You need ad-hoc container runs and will build minimal orchestration around it<\/td>\n<\/tr>\n<tr>\n<td><strong>OCI Kubernetes Engine (OKE) Jobs\/CronJobs<\/strong><\/td>\n<td>Kubernetes-native batch<\/td>\n<td>Strong ecosystem, portability, GitOps<\/td>\n<td>Cluster ops overhead<\/td>\n<td>You already run OKE and want unified platform for services + batch<\/td>\n<\/tr>\n<tr>\n<td><strong>OCI Data Flow (Spark)<\/strong><\/td>\n<td>Big data batch processing<\/td>\n<td>Managed Spark, scalable for large datasets<\/td>\n<td>Different paradigm than general container jobs<\/td>\n<td>You have Spark workloads (ETL\/analytics at scale)<\/td>\n<\/tr>\n<tr>\n<td><strong>AWS Batch<\/strong><\/td>\n<td>Batch on AWS<\/td>\n<td>Mature service, deep integrations<\/td>\n<td>Different cloud; migration overhead<\/td>\n<td>Your org is AWS-first or building multi-cloud strategy<\/td>\n<\/tr>\n<tr>\n<td><strong>Azure Batch<\/strong><\/td>\n<td>Batch\/HPC on Azure<\/td>\n<td>Strong HPC\/job scheduling<\/td>\n<td>Azure-specific<\/td>\n<td>Your data\/workloads live in Azure<\/td>\n<\/tr>\n<tr>\n<td><strong>Google Cloud Batch<\/strong><\/td>\n<td>Batch on GCP<\/td>\n<td>Managed batch execution<\/td>\n<td>GCP-specific<\/td>\n<td>Your workloads live in GCP<\/td>\n<\/tr>\n<tr>\n<td><strong>Argo Workflows \/ Airflow (self-managed)<\/strong><\/td>\n<td>Multi-step workflows<\/td>\n<td>Rich orchestration, DAGs, retries<\/td>\n<td>You operate it<\/td>\n<td>You need complex multi-step pipelines across services<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">15. Real-World Example<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Enterprise example: Financial risk nightly run<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem:<\/strong> A financial institution runs nightly risk simulations across thousands of scenarios. The workload is run-to-completion, CPU-heavy, and must finish within a fixed window.<\/li>\n<li><strong>Proposed architecture:<\/strong><\/li>\n<li>Batch job definitions versioned per model release<\/li>\n<li>OCIR stores signed, scanned images<\/li>\n<li>Inputs\/outputs in Object Storage (encrypted, strict retention)<\/li>\n<li>Jobs run in private subnets; NAT only if external data is required<\/li>\n<li>Logging to OCI Logging with retention and redaction rules<\/li>\n<li>Monitoring alarms on failure rates and completion time SLA<\/li>\n<li><strong>Why Batch was chosen:<\/strong><\/li>\n<li>Standardizes job submission and parallelism without maintaining a custom scheduler<\/li>\n<li>Integrates with OCI IAM and compartment governance<\/li>\n<li><strong>Expected outcomes:<\/strong><\/li>\n<li>Faster completion due to controlled parallelism<\/li>\n<li>Better auditability of runs and artifacts<\/li>\n<li>Reduced operational overhead compared to manually managed compute fleets<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Startup\/small-team example: Media processing pipeline<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem:<\/strong> A small SaaS needs to process user uploads (images and short clips) into multiple formats and store results.<\/li>\n<li><strong>Proposed architecture:<\/strong><\/li>\n<li>Object Storage receives uploads<\/li>\n<li>An app triggers Batch job runs per uploaded object (or per batch of objects)<\/li>\n<li>Jobs run a containerized transcoder\/resizer<\/li>\n<li>Outputs stored back into Object Storage; app serves them via CDN patterns (outside Batch scope)<\/li>\n<li><strong>Why Batch was chosen:<\/strong><\/li>\n<li>Simple operational model: submit job, get result<\/li>\n<li>Easy to scale during bursts without running idle servers<\/li>\n<li><strong>Expected outcomes:<\/strong><\/li>\n<li>Lower idle costs<\/li>\n<li>Predictable runtime environment via containers<\/li>\n<li>Faster iteration without building a scheduler from scratch<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">16. FAQ<\/h2>\n\n\n\n<p>1) <strong>Is Batch the same as running a script on a VM?<\/strong><br\/>\nNo. Batch is a managed way to define, submit, schedule, and track run-to-completion jobs (typically containerized). Running scripts on VMs can work, but you manage scaling, retries, scheduling, and server lifecycle yourself.<\/p>\n\n\n\n<p>2) <strong>Do I need Kubernetes to use Batch?<\/strong><br\/>\nNot necessarily. Batch is intended to run jobs without you having to operate a Kubernetes cluster. If you already use OKE, Kubernetes Jobs\/CronJobs are another option.<\/p>\n\n\n\n<p>3) <strong>Is Batch regional?<\/strong><br\/>\nTypically yes\u2014resources are created in a specific OCI region and compartment. Verify in official docs for any cross-region behavior.<\/p>\n\n\n\n<p>4) <strong>What\u2019s the difference between a job definition and a job run?<\/strong><br\/>\nA job definition describes <em>how<\/em> to run (image, resources, env vars). A job run is an <em>execution instance<\/em> of that definition.<\/p>\n\n\n\n<p>5) <strong>Where should I store input and output data?<\/strong><br\/>\nObject Storage is a common choice for batch pipelines (inputs, outputs, artifacts). Databases can be used for structured output but watch connection limits at scale.<\/p>\n\n\n\n<p>6) <strong>How do I pass parameters to a job?<\/strong><br\/>\nCommonly through environment variables, command arguments, or configuration files retrieved at runtime.<\/p>\n\n\n\n<p>7) <strong>How do I handle secrets?<\/strong><br\/>\nAvoid hardcoding. Use short-lived scoped access methods or your organization\u2019s secret management approach (often OCI Vault). For simple learning labs, use short-lived PAR URLs and expire them quickly.<\/p>\n\n\n\n<p>8) <strong>Why is my job stuck in queued state?<\/strong><br\/>\nUsually quotas\/capacity: insufficient Compute quota (OCPUs), shape not available, or misconfigured execution environment. Check service limits and job configuration.<\/p>\n\n\n\n<p>9) <strong>How do I see stdout\/stderr?<\/strong><br\/>\nUse the job run log view in the Batch console and\/or OCI Logging if integrated and enabled.<\/p>\n\n\n\n<p>10) <strong>Can I run thousands of jobs in parallel?<\/strong><br\/>\nOften yes in principle, but you will be constrained by quotas, downstream service limits (Object Storage request rates, DB connections), and account-level concurrency controls. Plan and test.<\/p>\n\n\n\n<p>11) <strong>Do I pay for Batch itself?<\/strong><br\/>\nYou pay at least for the underlying resources used (Compute, storage, logs, network). Whether Batch has a separate control-plane charge must be verified in Oracle\u2019s pricing for your region.<\/p>\n\n\n\n<p>12) <strong>How do I trigger Batch jobs automatically?<\/strong><br\/>\nCommon patterns include CI\/CD pipelines, scheduled triggers from an external scheduler, or event-driven triggers when new objects arrive. The exact integration approach depends on your orchestration tooling.<\/p>\n\n\n\n<p>13) <strong>Can Batch run in a private subnet?<\/strong><br\/>\nTypically yes, and this is recommended for production. Ensure NAT\/service gateway routing is set up so the runtime can reach OCIR and OCI endpoints as needed.<\/p>\n\n\n\n<p>14) <strong>What\u2019s the best way to design outputs?<\/strong><br\/>\nMake outputs deterministic and idempotent: write to a unique run ID path, then optionally \u201cpromote\u201d to a final path after success.<\/p>\n\n\n\n<p>15) <strong>How do I keep costs under control?<\/strong><br\/>\nSet concurrency limits, right-size shapes, minimize image size, limit logs, and apply lifecycle policies to output storage.<\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">17. Top Online Resources to Learn Batch<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Resource Type<\/th>\n<th>Name<\/th>\n<th>Why It Is Useful<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Official documentation<\/td>\n<td>OCI Batch docs: https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/batch\/home.htm<\/td>\n<td>Primary source for concepts, limits, and current workflow<\/td>\n<\/tr>\n<tr>\n<td>Official docs (IAM)<\/td>\n<td>IAM policies: https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Identity\/Concepts\/policies.htm<\/td>\n<td>Required to secure who can manage\/run Batch jobs<\/td>\n<\/tr>\n<tr>\n<td>Official docs (Compute limits)<\/td>\n<td>Service Limits: https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/General\/Concepts\/servicelimits.htm<\/td>\n<td>Helps troubleshoot queued jobs and quota errors<\/td>\n<\/tr>\n<tr>\n<td>Official docs (OCIR)<\/td>\n<td>Container Registry: https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Registry\/home.htm<\/td>\n<td>How to push\/pull images used by Batch<\/td>\n<\/tr>\n<tr>\n<td>Official docs (Object Storage)<\/td>\n<td>Object Storage: https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Object\/home.htm<\/td>\n<td>Common input\/output storage for batch pipelines<\/td>\n<\/tr>\n<tr>\n<td>Official docs (PAR)<\/td>\n<td>Pre-Authenticated Requests: https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Object\/Tasks\/usingpreauthenticatedrequests.htm<\/td>\n<td>Practical method for short-lived object access in labs and some patterns<\/td>\n<\/tr>\n<tr>\n<td>Official docs (Networking)<\/td>\n<td>VCN overview: https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Network\/Concepts\/overview.htm<\/td>\n<td>Required for subnet\/routing design for Batch runtimes<\/td>\n<\/tr>\n<tr>\n<td>Official docs (Logging)<\/td>\n<td>OCI Logging: https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Logging\/home.htm<\/td>\n<td>Log collection\/retention\/search for operations<\/td>\n<\/tr>\n<tr>\n<td>Official docs (Monitoring)<\/td>\n<td>Monitoring: https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Monitoring\/home.htm<\/td>\n<td>Metrics and alarms for reliability<\/td>\n<\/tr>\n<tr>\n<td>Official pricing<\/td>\n<td>Oracle Cloud Pricing: https:\/\/www.oracle.com\/cloud\/pricing\/<\/td>\n<td>Pricing overview and links to calculators\/price lists<\/td>\n<\/tr>\n<tr>\n<td>Official pricing<\/td>\n<td>Oracle Cloud Price List: https:\/\/www.oracle.com\/cloud\/price-list\/<\/td>\n<td>Detailed SKU pricing by service and region\/currency<\/td>\n<\/tr>\n<tr>\n<td>Official docs (CLI)<\/td>\n<td>OCI CLI concepts: https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/API\/Concepts\/cliconcepts.htm<\/td>\n<td>Automate Batch and dependent services (confirm Batch CLI reference for your release)<\/td>\n<\/tr>\n<tr>\n<td>Architecture guidance<\/td>\n<td>OCI Architecture Center: https:\/\/docs.oracle.com\/en\/solutions\/<\/td>\n<td>Reference architectures that often include batch-style patterns<\/td>\n<\/tr>\n<tr>\n<td>Community learning<\/td>\n<td>OCI blog and tutorials (search official Oracle blogs)<\/td>\n<td>Practical examples and announcements; validate against docs<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">18. Training and Certification Providers<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Institute<\/th>\n<th>Suitable Audience<\/th>\n<th>Likely Learning Focus<\/th>\n<th>Mode<\/th>\n<th>Website URL<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>DevOpsSchool.com<\/td>\n<td>DevOps engineers, SREs, platform teams, beginners<\/td>\n<td>DevOps + cloud fundamentals, CI\/CD, containers; OCI topics may vary<\/td>\n<td>check website<\/td>\n<td>https:\/\/www.devopsschool.com\/<\/td>\n<\/tr>\n<tr>\n<td>ScmGalaxy.com<\/td>\n<td>SCM\/DevOps learners, engineers<\/td>\n<td>Source control, CI\/CD, DevOps toolchains; cloud integration modules may vary<\/td>\n<td>check website<\/td>\n<td>https:\/\/www.scmgalaxy.com\/<\/td>\n<\/tr>\n<tr>\n<td>CLoudOpsNow.in<\/td>\n<td>Cloud operations, administrators<\/td>\n<td>Cloud ops practices, monitoring, governance; OCI coverage may vary<\/td>\n<td>check website<\/td>\n<td>https:\/\/cloudopsnow.in\/<\/td>\n<\/tr>\n<tr>\n<td>SreSchool.com<\/td>\n<td>SREs, operations teams<\/td>\n<td>Reliability engineering, observability, incident response; cloud patterns<\/td>\n<td>check website<\/td>\n<td>https:\/\/sreschool.com\/<\/td>\n<\/tr>\n<tr>\n<td>AiOpsSchool.com<\/td>\n<td>Ops + automation teams<\/td>\n<td>AIOps concepts, monitoring automation; cloud operations focus<\/td>\n<td>check website<\/td>\n<td>https:\/\/aiopsschool.com\/<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">19. Top Trainers<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Platform\/Site<\/th>\n<th>Likely Specialization<\/th>\n<th>Suitable Audience<\/th>\n<th>Website URL<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>RajeshKumar.xyz<\/td>\n<td>DevOps\/cloud training content (verify current catalog)<\/td>\n<td>Beginners to intermediate engineers<\/td>\n<td>https:\/\/rajeshkumar.xyz\/<\/td>\n<\/tr>\n<tr>\n<td>devopstrainer.in<\/td>\n<td>DevOps tools and practices (verify OCI-specific offerings)<\/td>\n<td>DevOps engineers, students<\/td>\n<td>https:\/\/devopstrainer.in\/<\/td>\n<\/tr>\n<tr>\n<td>devopsfreelancer.com<\/td>\n<td>DevOps consulting\/training marketplace style (verify offerings)<\/td>\n<td>Teams seeking short-term expertise<\/td>\n<td>https:\/\/devopsfreelancer.com\/<\/td>\n<\/tr>\n<tr>\n<td>devopssupport.in<\/td>\n<td>DevOps support and training resources (verify offerings)<\/td>\n<td>Ops\/DevOps teams<\/td>\n<td>https:\/\/devopssupport.in\/<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">20. Top Consulting Companies<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Company<\/th>\n<th>Likely Service Area<\/th>\n<th>Where They May Help<\/th>\n<th>Consulting Use Case Examples<\/th>\n<th>Website URL<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>cotocus.com<\/td>\n<td>Cloud\/DevOps engineering (verify service catalog)<\/td>\n<td>Architecture, DevOps enablement, platform implementation<\/td>\n<td>Batch platform setup, CI\/CD integration, observability and cost governance<\/td>\n<td>https:\/\/cotocus.com\/<\/td>\n<\/tr>\n<tr>\n<td>DevOpsSchool.com<\/td>\n<td>DevOps consulting and training<\/td>\n<td>DevOps transformation, tooling, pipelines<\/td>\n<td>Container build\/push workflows, job automation patterns, operational runbooks<\/td>\n<td>https:\/\/www.devopsschool.com\/<\/td>\n<\/tr>\n<tr>\n<td>DEVOPSCONSULTING.IN<\/td>\n<td>DevOps consulting (verify scope)<\/td>\n<td>DevOps practices and delivery enablement<\/td>\n<td>Infrastructure automation, monitoring setup, cloud migration planning<\/td>\n<td>https:\/\/devopsconsulting.in\/<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">21. Career and Learning Roadmap<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">What to learn before Batch<\/h3>\n\n\n\n<p>To use Oracle Cloud Batch effectively, learn:\n&#8211; OCI fundamentals: regions, compartments, VCN, IAM\n&#8211; Containers: Dockerfiles, image tagging, registries (OCIR)\n&#8211; Basic Linux troubleshooting (networking, logs, exit codes)\n&#8211; Object Storage patterns (prefixes, lifecycle rules, PARs)<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What to learn after Batch<\/h3>\n\n\n\n<p>To build production-grade systems:\n&#8211; Infrastructure as Code (OCI Resource Manager\/Terraform patterns\u2014verify current tooling)\n&#8211; Event-driven triggers (OCI Events\/Notifications patterns\u2014verify integration options)\n&#8211; Observability engineering (dashboards, alarms, log queries)\n&#8211; Security hardening (private networking, Vault, policy design)\n&#8211; Workflow orchestration (multi-step pipelines with dependencies)<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Job roles that use Batch<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Cloud engineer \/ DevOps engineer<\/li>\n<li>Platform engineer<\/li>\n<li>SRE \/ operations engineer<\/li>\n<li>Data engineer<\/li>\n<li>Solutions architect<\/li>\n<li>Research engineer (simulation pipelines)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Certification path (if available)<\/h3>\n\n\n\n<p>Oracle certifications change over time. Start at Oracle\u2019s official certification portal and map:\n&#8211; OCI Foundations\n&#8211; OCI Architect\n&#8211; OCI Developer (if applicable)<\/p>\n\n\n\n<p>Certification portal (verify current tracks):\n&#8211; https:\/\/education.oracle.com\/<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Project ideas for practice<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Build a \u201cfile processing platform\u201d:<\/li>\n<li>Upload file \u2192 submit Batch job \u2192 write output \u2192 notify user<\/li>\n<li>Parallel web scraping (careful with legal\/policy constraints)<\/li>\n<li>Batch image optimization pipeline with lifecycle-managed outputs<\/li>\n<li>Cost-optimized backfill runner with concurrency controls and retries<\/li>\n<li>Secure private-subnet batch connecting to a database (with strict IAM)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">22. Glossary<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Batch<\/strong>: Run-to-completion compute jobs that are not interactive and often scheduled or triggered.<\/li>\n<li><strong>OCI (Oracle Cloud Infrastructure)<\/strong>: Oracle Cloud\u2019s infrastructure platform (Compute, Networking, Storage, IAM, etc.).<\/li>\n<li><strong>Compartment<\/strong>: A logical container in OCI used for organizing and isolating resources and access control.<\/li>\n<li><strong>VCN (Virtual Cloud Network)<\/strong>: A private network in OCI where you create subnets, gateways, and routing.<\/li>\n<li><strong>Subnet<\/strong>: A segment of a VCN where resources attach network interfaces.<\/li>\n<li><strong>OCIR (Oracle Cloud Infrastructure Registry)<\/strong>: OCI\u2019s container registry service for storing Docker\/OCI images.<\/li>\n<li><strong>Container image<\/strong>: A packaged filesystem and metadata that defines how to run your application.<\/li>\n<li><strong>Job definition<\/strong>: The template describing how a Batch job should run (image\/resources\/config).<\/li>\n<li><strong>Job run<\/strong>: A specific execution instance of a job definition.<\/li>\n<li><strong>PAR (Pre-Authenticated Request)<\/strong>: A URL that grants time-bound access to Object Storage resources without requiring OCI user credentials.<\/li>\n<li><strong>IAM policy<\/strong>: A rule defining who can do what on which resources in OCI.<\/li>\n<li><strong>NAT Gateway<\/strong>: Enables private subnet resources to reach the internet without public IPs.<\/li>\n<li><strong>Service Gateway<\/strong>: Enables private access from a VCN to OCI services (region-dependent).<\/li>\n<li><strong>Logging ingestion<\/strong>: The volume of logs sent into OCI Logging, often a cost factor.<\/li>\n<li><strong>Idempotent<\/strong>: A job that can be run multiple times with the same result and without unintended side effects.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">23. Summary<\/h2>\n\n\n\n<p>Oracle Cloud <strong>Batch<\/strong> (Compute category) provides a managed way to run <strong>containerized, run-to-completion workloads<\/strong> on OCI without building your own scheduler and worker fleet. It fits best when you need repeatable job definitions, scalable parallel execution, OCI-native governance (compartments\/IAM\/tags), and operational visibility.<\/p>\n\n\n\n<p>Cost is usually driven less by \u201cBatch\u201d itself and more by the underlying <strong>Compute runtime<\/strong>, <strong>storage I\/O<\/strong>, <strong>log ingestion<\/strong>, and <strong>network egress\/NAT<\/strong>. Security success depends on strong IAM boundaries, private networking in production, and disciplined secret handling (avoid long-lived tokens; prefer short-lived access patterns like expiring PARs for simple cases and stronger secret management for production).<\/p>\n\n\n\n<p>Use Batch for ETL, media processing, simulations, backfills, and offline inference\u2014avoid it for interactive workloads or long-running services.<\/p>\n\n\n\n<p><strong>Next learning step:<\/strong> read the official Batch documentation for your region\/tenancy, then extend this lab by running jobs in a <strong>private subnet<\/strong> with controlled egress and a least-privilege IAM model.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Compute<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26,62],"tags":[],"class_list":["post-866","post","type-post","status-publish","format-standard","hentry","category-compute","category-oracle-cloud"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/866","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/comments?post=866"}],"version-history":[{"count":0,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/866\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/media?parent=866"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/categories?post=866"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/tags?post=866"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}