Security groups and network ACLs are the two firewalls inside a VPC, and the SAA-C03 tests whether you can place a requirement on the right one. They are not interchangeable: one is stateful and allow-only at the instance, the other is stateless and can deny at the subnet. Almost every distractor on this topic comes from swapping a property between them.
Two firewalls, four properties
A security group is stateful, allow-only, and attached to an elastic network interface — so it wraps an individual instance and returns traffic automatically. A network ACL is stateless, carries both allow and deny rules, and guards a whole subnet. Hold those four properties side by side and most questions answer themselves. The diagram places the stateless numbered ACL at the subnet boundary and the stateful security groups around each instance inside it — the coarse edge and the fine filter.
Rule order is the whole mechanism
Network ACL rules are numbered and evaluated in ascending order, and evaluation stops at the first match. A deny at rule 90 beats an allow at rule 100 not because deny outranks allow, and not because one CIDR is narrower, but purely because 90 is reached first. There is no specificity contest and no allow-versus-deny precedence pass — only the number line. When a scenario hands you rule numbers, read them in order and stop at the first one that matches the packet.
Stateless means you own the return trip
Because an ACL is stateless, the response to a permitted flow is not allowed automatically. A request to a service arrives on its port; the reply goes back to the caller’s ephemeral port in the 1024–65535 range. So an instance making outbound HTTPS calls needs an inbound ACL rule for the ephemeral range, even though the outbound 443 rule looks complete. Connections that hang with the “right” rule in place are almost always a missing ephemeral-port rule. A security group never has this problem — its statefulness handles the return trip for you.
When you need which
The reflexes are short. Need to block a specific address or range at a subnet’s edge? Only the network ACL can deny. Need different rules for two instances in one subnet? Only the security group is per-instance. Governing routine tier-to-tier access? Use security groups that reference each other and leave the ACL at its default allow — pushing ordinary traffic into numbered ACL rules is stateless bookkeeping you do not need. And the stateful catch: emptying a security group’s outbound rules does not stop responses to allowed inbound requests, because return traffic is exempt from the outbound rule set entirely.
Layer them on purpose
The two are not rivals; they are layers. Put the coarse subnet-wide deny on the network ACL and the fine per-application allow on the security groups, and you have defence in depth where each control does what it is built for. Trying to force everything onto one layer — detailed per-app rules on an ACL, or a block guardrail on an allow-only security group — is the design mistake the exam plants.
How to use the seven scenarios below
Answer each before opening the explanation, and when you miss, name the property that decided it — “stateless”, “allow-only”, “subnet-level”, “rule order”, “ephemeral”. Every explanation states that property and dismantles the distractors, most of which are real controls with one property swapped. For the wider picture, see Design Secure Architectures.
Updated for SAA-C03 (July 2026). The sample questions above are our own work
in the style of the exam — not real exam items. The exam itself is set and marked
by the certification body.