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
Quick reference
AWS S3 Storage Class Comparison
| Storage Class | Min Duration | Retrieval | Use Case |
|---|---|---|---|
| S3 Standard | None | Immediate | Frequently accessed data |
| S3 Standard-IA | 30 days | Immediate | Infrequent access, rapid retrieval |
| S3 One Zone-IA | 30 days | Immediate | Non-critical infrequent data |
| S3 Intelligent-Tiering | None | Immediate–hours | Unknown or changing access patterns |
| S3 Glacier Instant | 90 days | Milliseconds | Archive with instant retrieval |
| S3 Glacier Flexible | 90 days | Minutes–hours | Archive, flexible retrieval |
| S3 Glacier Deep Archive | 180 days | Hours | Long-term compliance archive |
Go deeper
Related to this question
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 →
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.