Courseiva

SOA-C02 Deployment, Provisioning, and Automation Practice Question

Which TWO actions should a SysOps administrator take to automate the deployment of a multi-tier application with AWS CloudFormation? (Choose two.)

⚠ Common exam trap

SOA-C02 often tests the confusion between AWS::Include (snippet reuse) and nested stacks (full stack modularity), leading candidates to pick AWS::Include when separation of concerns is required.

Answer choices

Why each option matters

Answer the question above first, then reveal the full breakdown to understand why each option is right or wrong.

Correct answer & explanation

✓

Use nested stacks to separate concerns such as network, app, and database

Option B is correct because nested stacks let you decompose a multi-tier application into reusable, independently managed templates (for example, a network stack, an application stack, and a database stack), which CloudFormation deploys as a parent stack with AWS::CloudFormation::Stack resources and promotes separation of concerns and reuse. Option D is correct because cross-stack references via Export in an Outputs section and Fn::ImportValue allow one stack to consume another stack's outputs (such as a VPC ID or subnet IDs), enabling modular, loosely coupled templates that pass values between stacks without hardcoding. Option A is wrong because hardcoding CIDR blocks and instance types reduces reusability and portability; parameters (with defaults and constraints) are the proper mechanism for environment-specific inputs. Option C is wrong because AWS::Include is a transform for inserting template snippets from S3 at deployment time, not a substitute for parameters, and it does not by itself provide the modular stack separation needed here. Option E is wrong because defining every resource in a single template creates a monolithic, hard-to-maintain stack and prevents the independent lifecycle management that nested stacks and cross-stack references provide.

Answer analysis

Option-by-option breakdown

For each option: why learners choose it and why it is or isn't the right answer here.

  • ✗

    Hardcode CIDR blocks and instance types to avoid parameter input

    Why it's wrong here

    Hardcoding CIDR blocks, instance types, and other environment-specific values directly into a template defeats the purpose of CloudFormation's parameterization mechanism, which exists to make templates reusable across dev, test, and production environments. Every hardcoded value creates a maintenance burden because any change requires editing the template itself and risks accidental drift, whereas parameters let you redeploy the same template with different inputs through stacks or change sets. While parameters add a small amount of upfront verbosity, they are the intended, safe way to pass dynamic values; hardcoding reduces flexibility and increases the chance of misconfiguration.

  • ✓

    Use nested stacks to separate concerns such as network, app, and database

    Why this is correct

    Nested stacks are the correct way to separate concerns because they allow you to break a large, monolithic infrastructure into smaller, reusable template components—for example, one nested stack for the VPC/network layer, another for the application layer, and another for the database layer. Each nested stack is treated as a CloudFormation resource within the root stack, so you can deploy, update, and roll back the entire architecture from a single root stack while still isolating failures and reusing templates across multiple environments. This modularity improves manageability, makes the stack more readable, and aligns with best practices for infrastructure as code.

  • ✗

    Use AWS::Include to reuse snippets instead of parameters

    Why it's wrong here

    AWS::Include is a transform that lets you insert literal template snippets into your template, such as a common block of resources or policies, but it does not, and cannot, replace the functionality of parameters. Parameters are for supplying dynamic, runtime values like CIDR blocks or instance types; AWS::Include simply performs textual substitution at stack creation time and offers no way to take user input or validate against allowed values. Using AWS::Include instead of parameters would not only leave the environment-specific values still hardcoded in the snippet, but also add an unintended layer of indirection, so it is both a category error and a poor substitute for parameterization.

  • ✓

    Use cross-stack references to pass outputs between stacks

    Why this is correct

    Cross-stack references are a correct way to pass outputs between independent CloudFormation stacks, using the Fn::ImportValue function to import an exported output from another stack. This pattern promotes separation of concerns because it lets different stacks own their resources—like a network stack exporting a VPC ID and subnet IDs, which an application stack imports—without duplicating values or creating a single monolithic stack. However, be aware that cross-stack references create a dependency relationship; you cannot delete the exporting stack until the importing stack removes the reference, so plan your stack lifecycle and update order carefully to avoid deadlocks.

  • ✗

    Define all resources in a single template to simplify management

    Why it's wrong here

    Defining all resources in a single template may seem simpler at first, but as the stack grows it becomes extremely complex, hard to read, and difficult to update without risking unintended changes to unrelated resources. A monolithic template also means that any update, even to a tiny Lambda function, requires the entire stack to be evaluated and deployed, increasing the blast radius if something goes wrong. In contrast, separating resources into nested stacks or independent stacks lets you update components in isolation, roll back only the failing module, and reuse common patterns, so a single template is an anti-pattern except for the simplest of workloads.

Visual reference

192.168.1.0 /24 256 addresses (254 usable) 192.168.1.0 /25 Subnet A 128 addr (126 usable) 192.168.1.128 /25 Subnet B 128 addr (126 usable) Borrowing 1 bit from host portion creates 2 subnets (/25)

Quick reference

AWS S3 Storage Class Comparison

Storage ClassMin DurationRetrievalUse Case
S3 StandardNoneImmediateFrequently accessed data
S3 Standard-IA30 daysImmediateInfrequent access, rapid retrieval
S3 One Zone-IA30 daysImmediateNon-critical infrequent data
S3 Intelligent-TieringNoneImmediate–hoursUnknown or changing access patterns
S3 Glacier Instant90 daysMillisecondsArchive with instant retrieval
S3 Glacier Flexible90 daysMinutes–hoursArchive, flexible retrieval
S3 Glacier Deep Archive180 daysHoursLong-term compliance archive

About these practice questions

This SOA-C02 question is part of Courseiva's 1,169-question bank — original exam-style content with full explanations and wrong-answer analysis, never real exam questions or exam dumps. Learn why practice questions differ from exam dumps →

How Courseiva writes practice questions · Editorial policy

JA

Written and reviewed by Johnson Ajibi, MSc IT Security

Senior Network & Security Engineer · founder of Courseiva

Last reviewed September 2026 · checked against the official Amazon Web Services exam blueprint

This SOA-C02 practice question is part of Courseiva's free Amazon Web Services certification practice question bank. Courseiva provides original exam-style practice questions with explanations, topic-based practice, mock exams, readiness tracking, and study analytics to help learners prepare for the SOA-C02 exam.