SaveMyCert
Log in
5 of 5 free questions left today·for 30 a day
SOA-C03 practice

SOA-C03 sample questions — 25 answered and explained

25 SOA-C03 sample questions written to the official AWS Certified CloudOps Engineer – Associate exam guide, grouped by exam domain and weighted like the real exam. Each shows the correct answer, why every other option is wrong, and the lesson that teaches it. None of them repeat the examples on the other SOA-C03 practice pages.

On this page
25
answers included
Full bank
519
on the practice page
Domains
5
weighted like the exam
Free, no account
5/day
a free account allows 30 a day

Domain 1: Monitoring, Logging, Analysis, Remediation, and Performance Optimization

22% of the SOA-C03 exam, so 6 of the 25 questions on this page.

Question 1Monitoring, Logging, Analysis, Remediation, and Performance Optimization

A security team needs every application log event that matches a pattern delivered within seconds to an Amazon Data Firehose stream, which loads a central analytics bucket. The team does not want to write or run any code. Which CloudWatch Logs configuration should the operations engineer use?

Choose one.

  • a
    A subscription filter on the log group with the Firehose stream as the destination. Correct

    A subscription filter delivers the matching log events themselves, in near real time, to Kinesis Data Streams, Amazon Data Firehose or Lambda, with no code.

  • b
    A metric filter on the log group with a metric stream sending its metric to Firehose.

    Metric streams do deliver to Firehose, but they carry metric datapoints; the metric filter has reduced each event to a number, so the log events never reach the bucket.

  • c
    An hourly export task that copies the log group's events into the analytics bucket.

    Export tasks write batches of log data to S3, but hourly batches miss the within-seconds requirement and still need something to schedule them.

  • d
    A subscription filter to a Lambda function that puts the events on the Firehose stream.

    This delivers the events, but the forwarding Lambda function is code the team would have to write and run; a subscription filter can target Firehose directly.

The concept

Subscription filters stream matching log events from a log group to Kinesis Data Streams, Amazon Data Firehose or Lambda in near real time. Metric filters produce numbers; export tasks are batch copies to S3.

Why that’s the answer

The requirement is to move the events themselves, within seconds, with no code. A subscription filter that targets the Firehose stream directly does exactly that. Routing through a Lambda function also works but adds code. The metric-stream option is tempting because it ends at Firehose, but it delivers metrics, not log events; export tasks are batch and slow.

How to reason it out
  1. Decide whether the destination needs the events or a count: here, the events.
  2. Note the latency: within seconds rules out batch exports.
  3. Choose the feature that delivers matching events to Firehose: a subscription filter.

Exam tip: Need the log events somewhere else in near real time: subscription filter. Need a number to alarm on: metric filter.

CloudWatch Metrics, Alarms, and Log Filters for SOA-C03 — the lesson that teaches this.

Question 2Monitoring, Logging, Analysis, Remediation, and Performance Optimization

During an active incident, an engineer must find exactly when application errors started by counting error events in 5-minute bins across several log groups over the last six hours. Existing monitoring configuration must not be changed. Which approach fits?

Choose one.

  • a
    Run a Logs Insights query that uses filter and stats to count errors by 5-minute bin. Correct

    Logs Insights queries data already ingested, across several log groups, and stats count(*) by bin(5m) gives the per-bin counts without changing any configuration.

  • b
    Create a metric filter on each log group and graph its count as a Sum in 5-minute bins.

    This changes configuration, and a new metric filter only counts events ingested after it exists, so the last six hours would show nothing.

  • c
    Add a subscription filter across the groups that streams error events to OpenSearch.

    This changes configuration and only sends events from now on; the six hours of history are not streamed.

  • d
    Start a Live Tail session across the log groups with an error filter and count matches.

    Live Tail shows events as they are ingested from the moment the session starts; it cannot look back six hours or count by bin.

The concept

CloudWatch Logs Insights runs ad hoc queries over log data already stored in one or more log groups (fields, filter, stats, sort, bin). Live Tail streams new events interactively; metric and subscription filters act only on events ingested after they are created.

Why that’s the answer

The engineer needs historical counts, binned by time, across several groups, without new configuration. Logs Insights does exactly that. Live Tail is the tempting near-miss because it is also an interactive console tool, but it only shows events from now on; metric and subscription filters are new configuration and are not retroactive.

How to reason it out
  1. Note the time direction: the question looks back six hours.
  2. Note the constraint: no new monitoring configuration.
  3. Eliminate forward-only tools (Live Tail, new filters).
  4. Run a Logs Insights stats query with bin(5m) over the incident window.

Exam tip: Looking back through logs during an incident: Logs Insights. Watching new events arrive: Live Tail.

CloudWatch Metrics, Alarms, and Log Filters for SOA-C03 — the lesson that teaches this.

Question 3Monitoring, Logging, Analysis, Remediation, and Performance Optimization

An engineer must find out which IAM principal terminated a production EC2 instance three days ago. The account has no trails configured and no other logging beyond the defaults. Where should the engineer look?

Choose one.

  • a
    The CloudTrail event history in that Region. Correct

    Management events such as TerminateInstances are recorded by default and the event history keeps 90 days of them per Region, including the calling principal — no trail is needed.

  • b
    The AWS Config resource timeline for the instance.

    The Config timeline can link configuration changes to the CloudTrail events behind them, but only when a configuration recorder is running, and Config is not part of the account's defaults.

  • c
    The Session Manager history for the instance.

    Session Manager history records interactive sessions started through Systems Manager, not EC2 API calls such as termination.

  • d
    The VPC Flow Logs for the instance's network interface.

    Flow logs are not enabled by default, and even when they are they record network traffic between addresses, not which IAM principal called the EC2 API.

The concept

CloudTrail records API calls. Management events are captured by default, and the CloudTrail event history shows the last 90 days of them per Region without any trail.

Why that’s the answer

Who terminated an instance is an audit question about an API call, and three days falls inside the 90-day event history, which exists even with no trails configured. AWS Config would need a recorder that was never turned on, VPC Flow Logs are off by default and carry no API identities, and Session Manager history covers shell sessions, not API calls.

How to reason it out
  1. Classify the question: who did what — an audit question.
  2. Recall that management events are in the event history for 90 days by default.
  3. Filter the event history by event name TerminateInstances and the instance ID.

Exam tip: Who did it: CloudTrail. How did it perform: CloudWatch.

CloudWatch Metrics, Alarms, and Log Filters for SOA-C03 — the lesson that teaches this.

Question 4Monitoring, Logging, Analysis, Remediation, and Performance Optimization

A compliance requirement states that all management API activity in an AWS account must be retained for three years. Today the team relies only on the CloudTrail console's event history. Which change meets the requirement?

Choose one.

  • a
    Turn on CloudTrail Insights so unusual management activity is recorded and kept.

    Insights events flag unusual call rates or error rates; they need a trail anyway and record anomalies, not every management event.

  • b
    Extend the event history retention for management events to three years.

    The event history's 90-day window is fixed and cannot be extended; keeping events longer requires a trail that delivers them to storage you control.

  • c
    Create a trail that records management events and delivers them to an S3 bucket. Correct

    A trail delivers management events continuously to S3, where they are kept as long as the bucket's lifecycle allows — three years or longer.

  • d
    Add an EventBridge rule that forwards CloudTrail management events to SNS.

    This sends notifications as events occur but stores nothing; SNS does not retain messages for three years.

The concept

The CloudTrail event history shows only the last 90 days of management events. Keeping events longer requires a trail that delivers log files to an S3 bucket (management events are logged by trails by default; data events are opt-in).

Why that’s the answer

The requirement is long-term retention of management activity. A trail to S3 provides it. The event history cannot be extended past 90 days, Insights records only unusual activity (and needs a trail anyway), and EventBridge notifications forward activity but keep nothing for three years.

How to reason it out
  1. Recall the event history limit: 90 days.
  2. Identify the event class required: management events.
  3. Choose a trail that records them and delivers to S3, then set the bucket's lifecycle for three years.

Exam tip: Retention beyond 90 days needs a trail to S3 — and it must record the event class the requirement names.

CloudWatch Metrics, Alarms, and Log Filters for SOA-C03 — the lesson that teaches this.

Question 5Monitoring, Logging, Analysis, Remediation, and Performance Optimization

A CPU alarm on a batch-processing instance uses a 1-minute period and pages the on-call several times a night on single 1-minute spikes that recover immediately. The team still needs a page within about 3 minutes when CPU stays high. Which alarm change BEST reduces the noise?

Choose one.

  • a
    Raise the CPU threshold from 80 percent to 95 percent on the alarm.

    A single spike to 99 percent still pages, and sustained load between 80 and 95 percent would now be missed.

  • b
    Set the alarm to treat missing data as notBreaching for each period.

    Missing-data handling only applies when no datapoint arrives; these spikes are real datapoints that breach.

  • c
    Require 2 of 3 datapoints to breach before the alarm enters ALARM. Correct

    With 1-minute periods, 2 breaching datapoints out of 3 ignore a lone spike yet still page within about 3 minutes of sustained high CPU.

  • d
    Lengthen the alarm period from 1 minute to 15 minutes with 1 datapoint.

    Averaging over 15 minutes smooths spikes but delays detection of sustained high CPU well past the 3-minute requirement.

The concept

An alarm evaluates the most recent N periods (evaluation periods) and enters ALARM when M of them breach (datapoints to alarm). M out of N filters isolated spikes without lengthening the period.

Why that’s the answer

The requirement has two halves: ignore single-minute spikes and still detect sustained load within about 3 minutes. 2 of 3 one-minute datapoints satisfies both. A higher threshold still pages on spikes and misses moderate load, a 15-minute period breaks the 3-minute requirement, and missing-data handling does not apply to real breaching datapoints.

How to reason it out
  1. Name the problem: isolated breaching datapoints, not gaps.
  2. Keep the 1-minute period so detection stays fast.
  3. Require more than one breaching datapoint in a short window: M out of N.

Exam tip: Flapping on short spikes: use M out of N datapoints, not a longer period or a higher threshold.

CloudWatch Metrics, Alarms, and Log Filters for SOA-C03 — the lesson that teaches this.

Question 6Monitoring, Logging, Analysis, Remediation, and Performance Optimization

An alarm watches an error-count metric produced by a metric filter that has no default value configured. During healthy overnight hours no errors occur, no datapoints are published, and the alarm drifts into INSUFFICIENT_DATA. The team wants the alarm to read OK when there are simply no errors. Which alarm setting change accomplishes this?

Choose one.

  • a
    Set treat missing data to breaching.

    Breaching treats gaps as bad, so the alarm would go into ALARM every quiet night — appropriate for heartbeat metrics where silence is the failure, not for error counts.

  • b
    Set treat missing data to missing.

    Missing is the default causing the current behavior: the alarm ignores gaps while it can and then falls into INSUFFICIENT_DATA.

  • c
    Set treat missing data to notBreaching. Correct

    For a sparse metric that only emits when errors occur, silence means health — notBreaching tells the alarm to treat gaps as good, keeping it in OK.

  • d
    Set treat missing data to ignore.

    ignore keeps the alarm in whatever state it is already in. From INSUFFICIENT_DATA it stays there, and after an error burst it would stay in ALARM through the quiet night instead of returning to OK.

The concept

Treat missing data decides what a gap in the metric means. The four options: missing (the default — eventually INSUFFICIENT_DATA), ignore (keep current state), breaching (gaps are bad — right for heartbeats where silence is the failure), and notBreaching (gaps are good — right for sparse metrics like error counts that only emit when something goes wrong).

Why that’s the answer

notBreaching matches the semantics of a sparse error metric: no datapoints means no errors, so the alarm should read OK. breaching would page every quiet night, missing is the default that produces INSUFFICIENT_DATA, and ignore just freezes whatever state the alarm was last in. An equivalent fix at the source is a metric filter default value of 0 so datapoints keep flowing during quiet periods.

How to reason it out
  1. Identify the metric as sparse — it only emits datapoints when errors occur.
  2. Edit the alarm and set treat missing data to notBreaching.
  3. Alternatively (or additionally), set a default value of 0 on the metric filter so the metric emits during quiet periods.
  4. Confirm the alarm sits in OK overnight and still fires when errors appear.

Exam tip: Choose treat-missing-data deliberately: notBreaching for sparse error metrics, breaching for heartbeats — the default missing just yields INSUFFICIENT_DATA.

CloudWatch Metrics, Alarms, and Log Filters for SOA-C03 — the lesson that teaches this.

Domain 2: Reliability and Business Continuity

22% of the SOA-C03 exam, so 6 of the 25 questions on this page.

Question 7Reliability and Business Continuity

A news website's EC2 Auto Scaling group doubles in size during traffic peaks, driving up cost. Analysis shows most requests fetch the same article pages and images, which change infrequently. Which change reduces load on the fleet MOST cost-effectively?

Choose one.

  • a
    Raise the group's maximum capacity so it can absorb the traffic peaks

    More instances absorb the peaks, but that is exactly the cost the team wants to cut — every repeated request is still served by the fleet.

  • b
    Move the fleet to larger instance types to absorb the traffic peaks

    Larger instances add capacity per instance and cost more; the same repeated requests still reach the fleet.

  • c
    Add ElastiCache behind the web tier to cache rendered pages and images

    An in-memory cache can save rendering and database work, but every request still arrives at the web servers, so the fleet must still scale with request volume.

  • d
    Add CloudFront in front of the site to cache pages and images at the edge Correct

    Correct. Edge caches answer repeated requests for slowly changing pages and images without contacting the origin, so far fewer requests reach the fleet and the Auto Scaling group stays smaller.

The concept

Caching is a scaling mechanism: CloudFront serves static and cacheable dynamic responses from edge locations, cutting the request volume the origin fleet must handle.

Why that’s the answer

The load is dominated by repeated fetches of infrequently changing content — the ideal CloudFront workload. Offloading it at the edge reduces the fleet size needed at peak, directly cutting cost. Raising max or resizing instances buys capacity to redo work a cache would eliminate, and an ElastiCache page cache behind the web tier saves rendering work per request but every request still reaches the web servers, so the fleet still scales with request volume.

How to reason it out
  1. Identify that the hot requests are cacheable: same pages and assets, infrequent changes.
  2. Create a CloudFront distribution with the site as origin.
  3. Tune cache behaviors and TTLs so the article pages — not just images and CSS — are cached.
  4. Watch the cache hit ratio and origin request count, then right-size the Auto Scaling group.

Exam tip: Offload repeated, cacheable traffic to CloudFront before resizing the fleet — cached requests never reach your compute.

Auto Scaling and Elasticity: EC2, Caching, and Database Scaling — the lesson that teaches this.

Question 8Reliability and Business Continuity

An operations team is deploying an ElastiCache cache in front of a relational database. If a cache node fails, the cache must keep serving its existing data and recover without engineer action, so the database never takes the full read load. Which engine and configuration should the team choose?

Choose one.

  • a
    Valkey with a replica per shard and Multi-AZ automatic failover enabled Correct

    Correct. Replicas hold a copy of each shard's data, and Multi-AZ with automatic failover promotes a replica when the primary fails, so cached data stays available and recovery needs no operator.

  • b
    Memcached with additional nodes spread across several Availability Zones

    Memcached has no replication. Spreading nodes limits how much is lost, but the failed node's share of keys is gone and those reads fall through to the database.

  • c
    Memcached with Auto Discovery so clients locate the replacement nodes

    Auto Discovery only updates the client's node list. A replacement Memcached node starts empty, so its keys are re-fetched from the database.

  • d
    Valkey with cluster mode enabled and zero replicas configured per shard

    Cluster mode spreads keys over shards, but without replicas a failed shard has nothing to fail over to — its data is lost and its reads hit the database.

The concept

ElastiCache for Valkey or Redis OSS replicates each shard to replica nodes and, with Multi-AZ enabled, fails over automatically; Memcached has no replication or persistence.

Why that’s the answer

Surviving a node failure with the data intact requires a copy of the data on another node, plus automatic promotion. That is Valkey or Redis OSS with at least one replica per shard and Multi-AZ automatic failover. Memcached cannot replicate, so more nodes or Auto Discovery only change how much is lost or how fast clients reconnect; cluster mode with zero replicas shards data but has nothing to fail over to.

How to reason it out
  1. Read the requirement: keep the existing cached data after a node failure, with no manual step.
  2. Rule out Memcached: no replication, so a lost node means lost keys.
  3. Require at least one replica per shard; sharding alone does not protect data.
  4. Enable Multi-AZ so ElastiCache promotes a replica automatically.

Exam tip: Cache must survive node loss → Valkey/Redis OSS with replicas and Multi-AZ failover; Memcached and replica-less shards lose data.

Auto Scaling and Elasticity: EC2, Caching, and Database Scaling — the lesson that teaches this.

Question 9Reliability and Business Continuity

Database CPU on an RDS instance has climbed steadily even though an ElastiCache for Redis OSS cluster fronts it. Over two weeks the CacheHitRate metric has fallen from 92% to 60%, and over the same period the Evictions metric has climbed. What is the MOST likely cause?

Choose one.

  • a
    The application tier has exhausted its database connection pool

    An exhausted pool causes connection errors and queueing at the database, not a falling cache hit rate with rising evictions.

  • b
    Key TTLs are expiring entries before the application reuses them

    Expiring keys also lower the hit rate, but expired keys are counted as Reclaimed, not Evictions; TTL expiry cannot explain the rising Evictions metric.

  • c
    Too few read replicas are in the replication group to serve reads

    Replicas add read throughput, but each holds a full copy of the same data in the same memory, so they neither cause nor cure evictions and misses.

  • d
    The working set has outgrown the memory of the cache nodes Correct

    Correct. Evictions happen only when the cache is full and must drop keys to store new ones; rising evictions with a falling hit rate mean the working set no longer fits, so reads fall through to the database.

The concept

In ElastiCache, Evictions counts keys removed because memory is full, while expired keys (TTL) are tracked separately; rising evictions with a falling CacheHitRate mean the cache is undersized for its working set.

Why that’s the answer

Two facts combine: a falling hit rate sends reads back to the database, and the Evictions metric rises only under memory pressure — keys removed because their TTL expired are reported separately (Reclaimed), so TTL expiry cannot account for rising Evictions. The fix is more memory: a larger node type or, with cluster mode enabled, more shards. Connection-pool exhaustion shows up as errors, and read replicas add read throughput, not memory.

How to reason it out
  1. Link the database CPU climb to the falling CacheHitRate: misses fall through to the database.
  2. Read Evictions as memory pressure; expired keys are counted as Reclaimed, a different metric.
  3. Confirm with memory metrics such as DatabaseMemoryUsagePercentage.
  4. Scale up the node type or add shards, then watch evictions fall and the hit rate recover.

Exam tip: Evictions rising + hit rate falling = cache too small; TTL expiry shows up as Reclaimed, not Evictions.

Auto Scaling and Elasticity: EC2, Caching, and Database Scaling — the lesson that teaches this.

Question 10Reliability and Business Continuity

A CloudOps engineer must move a production RDS for MySQL DB instance, currently Single-AZ, to a larger instance class. The business accepts an interruption of no more than a minute or two, and the application must keep using its existing DB instance endpoint. Which approach meets these requirements?

Choose one.

  • a
    Modify the instance class on the Single-AZ instance and apply it immediately

    On a Single-AZ instance the class change restarts the only copy of the database, so the outage lasts the whole resize — far longer than a minute or two.

  • b
    Convert the instance to Multi-AZ first, then modify the instance class Correct

    Correct. Converting to Multi-AZ builds a standby without downtime; the class change is then applied to the standby first, followed by a failover, so the interruption is about one failover and the endpoint stays the same.

  • c
    Create a larger read replica, promote it, then point the application at it

    A promoted replica becomes a separate instance with its own endpoint, which breaks the requirement to keep the existing endpoint, and writes made during the switch need careful handling.

  • d
    Modify the instance class in the next maintenance window on the instance

    Deferring the change to the maintenance window changes when the outage happens, not how long it lasts — still a full Single-AZ resize.

The concept

On a Multi-AZ DB instance deployment, RDS applies an instance class change to the standby, fails over to it, then updates the old primary — the interruption is about the length of a failover. Converting Single-AZ to Multi-AZ itself does not require downtime.

Why that’s the answer

Two facts combine: the Single-AZ to Multi-AZ conversion runs online (RDS creates the standby from a snapshot), and once Multi-AZ, the resize is applied through a failover, keeping the same endpoint. Resizing the Single-AZ instance, now or in the maintenance window, takes the database down for the full resize; promoting a replica changes the endpoint. A blue/green deployment is another endpoint-preserving route, but it is not offered here.

How to reason it out
  1. Note the constraints: an interruption of a minute or two at most, same endpoint.
  2. Convert to Multi-AZ (no downtime, some I/O impact while the standby is built).
  3. Modify the instance class; RDS upgrades the standby, fails over, then upgrades the old primary.
  4. Keep Multi-AZ for resilience or convert back to Single-AZ afterwards if cost requires it.

Exam tip: Resize with only a brief interruption → be Multi-AZ first; the change rides a failover and the endpoint stays put.

Auto Scaling and Elasticity: EC2, Caching, and Database Scaling — the lesson that teaches this.

Question 11Reliability and Business Continuity

An RDS database's FreeStorageSpace metric keeps triggering low-storage alarms as application data grows at an unpredictable rate, and engineers repeatedly perform manual storage modifications. Which change removes this recurring task with the LEAST operational overhead?

Choose one.

  • a
    Enable RDS storage autoscaling with a maximum storage threshold Correct

    Correct. Storage autoscaling grows the allocated storage when free space runs low, up to the maximum you set, which removes the manual modifications with one setting.

  • b
    Migrate the database to Aurora Serverless v2 and set its capacity range

    Aurora storage does grow by itself, but migrating engines is a project, far more effort than turning on a setting on the existing instance.

  • c
    Create a read replica to take on part of the growing data volume

    A read replica holds a full copy of the data and offloads reads; it does not add storage to the primary.

  • d
    Modify the DB instance to a larger instance class with more storage

    For RDS the instance class sets CPU and memory; allocated storage is a separate setting, so this does not solve the recurring low-storage alarms.

The concept

RDS storage autoscaling automatically grows a DB instance's allocated storage when free space drops below a threshold, up to a configured maximum — and storage only grows, never shrinks.

Why that’s the answer

The task is eliminating manual storage grows on an existing RDS instance, which is the exact feature description of storage autoscaling. Aurora Serverless v2 answers spiky compute demand and requires migrating; replicas scale reads, not primary storage; and instance class changes compute while forcing a restart.

How to reason it out
  1. Enable storage autoscaling on the DB instance.
  2. Set a maximum storage threshold that caps cost while leaving growth headroom.
  3. Keep a FreeStorageSpace alarm as a backstop near the configured maximum.
  4. Remember the volume never shrinks back after growing.

Exam tip: Unpredictable data growth on RDS → enable storage autoscaling with a sensible maximum; it grows automatically and never shrinks.

Auto Scaling and Elasticity: EC2, Caching, and Database Scaling — the lesson that teaches this.

Question 12Reliability and Business Continuity

An application routes its reporting queries to an RDS for PostgreSQL read replica. Report users intermittently see data that is several minutes old, and the staleness is getting worse over time. Which CloudWatch metric should the operations team alarm on to detect this condition?

Choose one.

  • a
    ReplicaLag reported by the read replica Correct

    ReplicaLag measures how far the asynchronous replica trails the primary — rising lag is exactly the stale-reads condition being reported, and the metric to alarm on.

  • b
    FreeStorageSpace on the primary instance

    Free storage tracks disk capacity; it says nothing about how current the replica's data is.

  • c
    DatabaseConnections on the read replica

    Connection count measures client load, not replication currency — a lightly loaded replica can still lag badly.

  • d
    CPUUtilization on the primary instance

    Primary CPU can be one contributing cause of lag, but it is an indirect signal — the direct measure of replica staleness is ReplicaLag itself.

The concept

RDS read replicas replicate asynchronously, so they serve eventually consistent reads; the ReplicaLag metric quantifies how far behind the replica is.

Why that’s the answer

Stale reads from a replica are lag by definition, and ReplicaLag is the metric that measures it directly — alarm on it to catch the condition before users do. Storage, connections, and primary CPU are all adjacent signals that can be normal while lag grows, or abnormal without any lag.

How to reason it out
  1. Create a CloudWatch alarm on the replica's ReplicaLag metric with a threshold matching the tolerable staleness.
  2. When the alarm fires, investigate replica capacity and write volume on the primary.
  3. Consider a larger replica instance class or reduced replica query load.
  4. Remember rising lag also means a longer catch-up if the replica is ever promoted.

Exam tip: Read replicas are asynchronous — alarm on ReplicaLag to catch stale reads and growing catch-up risk.

Auto Scaling and Elasticity: EC2, Caching, and Database Scaling — the lesson that teaches this.

Domain 3: Deployment, Provisioning, and Automation

22% of the SOA-C03 exam, so 5 of the 25 questions on this page.

Question 13Deployment, Provisioning, and Automation

A drift check on a production stack shows the stack as DRIFTED, with one security group marked MODIFIED. The on-call engineer assumes CloudFormation has now put the security group back to the template's configuration. What is the actual state of the security group?

Choose one.

  • a
    CloudFormation reverted the security group during the check and the stack is back in sync.

    Drift detection is read-only; it never changes a resource, so nothing was reverted.

  • b
    The resource is now flagged for reconciliation, and the next stack update reverts it on its own.

    A stack update only changes properties whose template values changed; it does not automatically reset drifted properties, and drift detection sets no reconciliation flag.

  • c
    CloudFormation blocks further updates to the stack until the drift is resolved manually.

    Updates are still allowed on a drifted stack; they may fail or overwrite properties, but drift itself does not lock the stack.

  • d
    The console edit is still in effect until someone reconciles the template or the resource. Correct

    Drift detection only reports differences. The out-of-band change stays live until the engineer updates the template to match, reverts the resource, or redeploys the property.

The concept

Drift detection reports differences between the template and live resources; it never remediates them.

Why that’s the answer

Running drift detection is a read-only comparison. The MODIFIED security group still has its console changes, remains part of the stack, and the stack can still be updated. Reconciliation is a separate step: either change the template to accept the new configuration or revert the resource (by hand or by redeploying the property) so it matches.

How to reason it out
  1. Read the drift result's expected and actual property values.
  2. Decide which side is correct: the template or the live change.
  3. Update the template, or revert the resource so it matches the template.
  4. Re-run drift detection to confirm IN_SYNC.

Exam tip: Drift detection tells you; it never fixes.

CloudFormation, StackSets, and golden images: provisioning for SOA-C03 — the lesson that teaches this.

Question 14Deployment, Provisioning, and Automation

A large CloudFormation stack update failed at 2 AM and rolled back, leaving hundreds of entries in the stack's event history, many of them failures. What is the FASTEST way for the on-call engineer to find the root cause?

Choose one.

  • a
    Start from the newest events and read the status reason of the latest failed resource.

    The newest failures are usually 'Resource update cancelled' entries triggered by the real failure, so they rarely explain the root cause.

  • b
    Start from the oldest failure and read the status reason of the first failed resource. Correct

    The first UPDATE_FAILED or CREATE_FAILED event is the one that triggered the rollback; later failures cascade from it. Its status reason (the console's root-cause view highlights it) names the actual problem.

  • c
    Run drift detection on the stack and inspect each resource reported as modified.

    Drift detection compares live resources with the template; it says nothing about why an update operation failed.

  • d
    Search CloudTrail for errors made by the deploying principal during the update window.

    CloudTrail can show API errors, but sifting the trail is slower than reading the first failed event, and the stack's status reason usually already contains the error.

The concept

In a failed deployment, the first failure event is the root cause; the later failures are cancellations that cascade from it.

Why that’s the answer

When one resource fails, CloudFormation cancels the operations still in progress and rolls back, so the history fills with secondary failures. The earliest failed event's status reason (which the console's 'Detect root cause' option points to) is the actual error. Newest-first reading lands on cancellations, drift detection is unrelated to deployment errors, and CloudTrail is a slower path to the same message.

How to reason it out
  1. Filter the stack events to failed statuses.
  2. Sort chronologically and go to the earliest CREATE_FAILED or UPDATE_FAILED event.
  3. Read its status reason (permissions, limits, invalid property, name conflict).
  4. Fix that cause and redeploy; the cascaded failures disappear with it.

Exam tip: Read the first failure, not the last - everything after it is collateral.

CloudFormation, StackSets, and golden images: provisioning for SOA-C03 — the lesson that teaches this.

Question 15Deployment, Provisioning, and Automation

The first deployment of a brand-new CloudFormation stack failed, and the stack now shows ROLLBACK_COMPLETE. The engineer has already fixed the template error. What must the engineer do next?

Choose one.

  • a
    Update the stack in place with the corrected template.

    A stack in ROLLBACK_COMPLETE cannot be updated; CloudFormation rejects update operations in this state.

  • b
    Run continue update rollback to move the stack to a healthy state.

    Continue update rollback is the recovery for UPDATE_ROLLBACK_FAILED after a failed update; it does not apply to a failed creation.

  • c
    Delete the stack, then create it again with the corrected template. Correct

    ROLLBACK_COMPLETE after a failed create is a terminal state: the stack's resources were deleted during rollback and the stack cannot be updated — deletion and recreation is the only path forward.

  • d
    Detect drift on the stack and remediate the drifted resources before retrying.

    There is nothing to drift: the create rolled back and deleted everything it had built, so drift detection has no role here.

The concept

Failed creates and failed updates end differently: a failed create rolls back to ROLLBACK_COMPLETE (terminal — delete and recreate), while a failed update automatically rolls back to the last working configuration and the stack stays usable.

Why that’s the answer

Because the failure happened during creation, there is no previous working state to return to; CloudFormation deleted the partial resources and parked the stack in a terminal state. Updating is rejected in ROLLBACK_COMPLETE, continue update rollback belongs to the UPDATE_ROLLBACK_FAILED state, and drift detection is irrelevant when the rollback already removed every resource.

How to reason it out
  1. Confirm the root cause is fixed (read the first CREATE_FAILED event if not already done).
  2. Delete the stack in ROLLBACK_COMPLETE.
  3. Create the stack again with the corrected template.
  4. Monitor the new creation's events to verify it completes.

Exam tip: ROLLBACK_COMPLETE after a failed create means delete and recreate — the stack cannot be updated out of that state.

CloudFormation, StackSets, and golden images: provisioning for SOA-C03 — the lesson that teaches this.

Question 16Deployment, Provisioning, and Automation

A production stack update failed, and the automatic rollback then failed as well because a dependency had been deleted out of band. The stack is now in UPDATE_ROLLBACK_FAILED. The engineer has restored the missing dependency. How should the stack be recovered with the least disruption?

Choose one.

  • a
    Run continue update rollback, skipping any resources that still cannot roll back. Correct

    ContinueUpdateRollback retries the rollback from UPDATE_ROLLBACK_FAILED; resources that still cannot be rolled back can be skipped, returning the stack to UPDATE_ROLLBACK_COMPLETE.

  • b
    Delete the stack and recreate it from the last template that deployed successfully.

    Deleting a production stack destroys its resources; it is the most disruptive option and unnecessary when the rollback can be continued.

  • c
    Run a new stack update that rolls back to the last template that deployed successfully.

    A stack in UPDATE_ROLLBACK_FAILED cannot be updated; it must first be returned to a stable state.

  • d
    Cancel the stack update so CloudFormation restores the stack's previous configuration.

    Cancel update stack only applies while an update is in progress (UPDATE_IN_PROGRESS); the stack is already in a failed rollback state.

The concept

UPDATE_ROLLBACK_FAILED is recovered with continue update rollback (optionally skipping resources), not with another update or a delete.

Why that’s the answer

When a rollback fails, the stack cannot accept updates. After fixing the cause, ContinueUpdateRollback retries the rollback, and any resource that still cannot be restored can be listed in ResourcesToSkip so the stack reaches UPDATE_ROLLBACK_COMPLETE. A new update is rejected in this state, cancel only works during an in-progress update, and deleting a production stack is needlessly destructive.

How to reason it out
  1. Read the rollback failure reason to find the blocking resource.
  2. Fix the cause (here, restore the deleted dependency).
  3. Run continue update rollback, adding resources to skip only if they still cannot roll back.
  4. Once the stack reaches UPDATE_ROLLBACK_COMPLETE, reconcile any skipped resources and redeploy.

Exam tip: Stuck in UPDATE_ROLLBACK_FAILED? Fix the cause, then continue update rollback.

CloudFormation, StackSets, and golden images: provisioning for SOA-C03 — the lesson that teaches this.

Question 17Deployment, Provisioning, and Automation

A CloudOps engineer plans a stack update that adds instances, each with a single network interface, to a /28 subnet. The subnet already hosts 9 network interfaces, and no addresses are reserved by other means. How many more instances can the subnet take?

Choose one.

  • a
    5, because AWS reserves 2 addresses in every subnet

    That would be true only if just the network and broadcast addresses were reserved. AWS reserves 5 addresses per subnet.

  • b
    4, because AWS reserves 3 addresses in every subnet

    AWS reserves the first four addresses and the last one, which is 5, not 3.

  • c
    2, because AWS reserves 5 addresses in every subnet Correct

    A /28 has 16 addresses; AWS reserves the first four (network, VPC router, DNS, future use) and the last (broadcast), leaving 11 usable. With 9 in use, 2 remain.

  • d
    7, because AWS reserves no addresses in a /28 subnet

    Every subnet, whatever its size, has 5 reserved addresses.

The concept

AWS reserves 5 IP addresses in every subnet (the first four and the last), which matters most in small subnets.

Why that’s the answer

A /28 contains 16 addresses. AWS keeps the network address, the VPC router, the DNS server, one for future use and the broadcast address, so 11 are usable. Nine are already taken by network interfaces, leaving 2. A deployment that adds more than 2 instances fails with an insufficient free IP addresses error unless the group can use a larger subnet.

How to reason it out
  1. Compute the subnet size: 2^(32-28) = 16 addresses.
  2. Subtract the 5 AWS-reserved addresses: 11 usable.
  3. Subtract the 9 addresses already in use: 2 free.
  4. If the deployment needs more, add or enlarge subnets (or add a secondary CIDR block).

Exam tip: Usable IPs = 2^(32 - prefix) - 5.

CloudFormation, StackSets, and golden images: provisioning for SOA-C03 — the lesson that teaches this.

Domain 4: Security and Compliance

16% of the SOA-C03 exam, so 4 of the 25 questions on this page.

Question 18Security and Compliance

An IAM role has the AdministratorAccess managed policy attached and a permissions boundary that allows only s3:GetObject and s3:ListBucket on one bucket. The account's SCPs allow all actions and no Deny statements apply. The role then calls s3:PutObject on that bucket and ec2:DescribeInstances. What happens?

Choose one.

  • a
    Both calls succeed, because AdministratorAccess on the role grants the permissions the boundary leaves out.

    A boundary is a ceiling. Actions outside it are not effective, however broad the identity policy is.

  • b
    The s3:PutObject call succeeds and ec2:DescribeInstances fails, because the boundary covers Amazon S3.

    The boundary lists two specific S3 actions, not the whole S3 namespace, so s3:PutObject is outside it too.

  • c
    Both calls fail, because effective permissions are the overlap of the boundary and the identity policy. Correct

    Neither action is in both the boundary and the identity policy, so neither is allowed.

  • d
    The ec2:DescribeInstances call succeeds, because Describe actions that read metadata are not limited by boundaries.

    Permissions boundaries apply to read-only actions in the same way as to any other action.

The concept

A principal's effective permissions are the intersection of its identity-based policies with each limiting policy that applies: the permissions boundary and the SCPs.

Why that’s the answer

AdministratorAccess allows everything, but the boundary allows only two actions on one bucket, so only those two are effective. s3:PutObject and ec2:DescribeInstances are outside the boundary and are implicitly denied. Read-only actions get no exemption.

How to reason it out
  1. List what the identity policy allows: everything.
  2. List what the boundary allows: two S3 read actions.
  3. Take the overlap and test each requested action against it.

Exam tip: Boundary + identity policy = intersection; the boundary itself grants nothing.

IAM, AWS Organizations, and Compliance Tools for CloudOps (SOA-C03) — the lesson that teaches this.

Question 19Security and Compliance

An application role's identity-based policy allows s3:ListBucket and s3:PutObject with Resource "arn:aws:s3:::app-uploads". Listing the bucket works, but every upload returns AccessDenied. The bucket is in the same account, has no bucket policy and uses SSE-S3. What should the CloudOps engineer change?

Choose one.

  • a
    Add a bucket policy that allows s3:PutObject for the role on Resource "arn:aws:s3:::app-uploads"

    A same-account identity allow is already sufficient, and this bucket policy repeats the same bucket ARN, which never matches object-level requests.

  • b
    Add s3:PutObjectAcl to the statement that grants s3:PutObject on "arn:aws:s3:::app-uploads"

    PutObjectAcl is only needed when an upload sets an ACL, and it would still be scoped to the bucket ARN, which object requests do not match.

  • c
    Set the s3:PutObject statement's Resource to "arn:aws:s3:::app-uploads/*" instead of the bucket ARN Correct

    s3:PutObject is an object-level action, so it matches object ARNs (bucket/*). The bucket ARN only covers bucket-level actions such as s3:ListBucket, which is why listing works.

  • d
    Change the s3:PutObject statement to s3:* while keeping Resource "arn:aws:s3:::app-uploads"

    Widening the actions does not help: object actions still do not match the bucket ARN, and s3:* over-grants bucket-level actions.

The concept

S3 bucket-level actions (s3:ListBucket) match the bucket ARN; object-level actions (s3:GetObject, s3:PutObject) match object ARNs of the form bucket-name/*.

Why that’s the answer

The symptom pattern, list works but put fails, points at the resource element: the allow for s3:PutObject names only the bucket, so it never matches a request for an object. Adding /* fixes it. A bucket policy or extra actions keep the same mismatched ARN.

How to reason it out
  1. Compare what works (bucket-level) with what fails (object-level).
  2. Check the Resource element against the action's resource type.
  3. Add the object ARN pattern bucket-name/* for object actions.

Exam tip: Object actions need bucket/*; the bare bucket ARN covers only bucket-level actions.

IAM, AWS Organizations, and Compliance Tools for CloudOps (SOA-C03) — the lesson that teaches this.

Question 20Security and Compliance

A production security group was changed overnight to allow inbound SSH from 0.0.0.0/0. The operations team must find which IAM principal made the change, the source IP address of the request and the exact time. Which source has this information?

Choose one.

  • a
    VPC Flow Logs for the security group's network interfaces during the overnight window

    Flow logs record network traffic metadata to and from interfaces. They contain no record of API calls that changed a security group.

  • b
    IAM Access Analyzer findings for the account, filtered to the overnight window

    Access Analyzer reports resources shared outside the zone of trust and unused access. It does not record who called which API.

  • c
    The IAM credential report for the account, filtered to users active during the window

    The credential report shows each IAM user's credential status and last-used dates. It does not say which API call was made, from where or by a role.

  • d
    CloudTrail event history for the AuthorizeSecurityGroupIngress call in that Region Correct

    CloudTrail records each management API call with userIdentity, sourceIPAddress and eventTime, and event history keeps 90 days of management events by default.

The concept

CloudTrail is the record of who did what: each management API call is logged with the calling principal (userIdentity), event name, source IP address and time.

Why that’s the answer

Changing a security group is a management API call (AuthorizeSecurityGroupIngress), so CloudTrail holds the principal, source IP and timestamp; event history shows the last 90 days without any trail configured. Flow logs show traffic, Access Analyzer shows potential access, and the credential report shows credential status.

How to reason it out
  1. Recognise that the question is who made an API call.
  2. Open CloudTrail event history in the Region of the security group.
  3. Filter on the AuthorizeSecurityGroupIngress event name and read userIdentity, sourceIPAddress and eventTime.

Exam tip: Who changed what and from where: CloudTrail.

IAM, AWS Organizations, and Compliance Tools for CloudOps (SOA-C03) — the lesson that teaches this.

Question 21Security and Compliance

Before replacing the policy on a production role, a CloudOps engineer must confirm that the revised policy would still allow 12 specific actions on named S3, DynamoDB and SQS resources, without making any of those calls. Which approach meets the requirement?

Choose one.

  • a
    Search CloudTrail event history for the 12 actions to confirm the role ran them successfully

    CloudTrail shows what happened under the current policy. It cannot predict whether the revised, undeployed policy allows the actions.

  • b
    Run IAM Access Analyzer policy validation on the revised policy and resolve its security warnings

    Policy validation checks grammar and best practices and flags broad grants. It does not report whether specific actions on specific resources would be allowed.

  • c
    Call each action with the AWS CLI --dry-run option while the role uses the revised policy

    The DryRun parameter exists mainly for EC2 API operations; S3, DynamoDB and SQS calls have no dry-run mode, so these calls would actually run.

  • d
    Test the revised policy in the IAM policy simulator against each action and resource ARN Correct

    The policy simulator evaluates policies against chosen actions and resources and reports allowed or denied, with the deciding statement, without calling the services.

The concept

The IAM policy simulator answers 'would this be allowed?': it evaluates policies for given actions and resources without executing any API call.

Why that’s the answer

The simulator can test a new or edited policy before it is attached and shows the result per action and resource. CloudTrail is historical, Access Analyzer validation is a lint, not an allow/deny evaluation, and --dry-run is limited to EC2-style operations.

How to reason it out
  1. Note the constraints: unreleased policy, specific actions, no real calls.
  2. Rule out historical tools such as CloudTrail.
  3. Rule out linting tools that do not evaluate specific requests.
  4. Use the policy simulator with each action and resource ARN.

Exam tip: Predict allow or deny without calling the API: IAM policy simulator.

IAM, AWS Organizations, and Compliance Tools for CloudOps (SOA-C03) — the lesson that teaches this.

Domain 5: Networking and Content Delivery

18% of the SOA-C03 exam, so 4 of the 25 questions on this page.

Question 22Networking and Content Delivery

A CloudOps engineer replaces the default network ACL on a public web subnet with a custom NACL that allows inbound TCP 443 from 0.0.0.0/0 and allows outbound TCP 443 to 0.0.0.0/0. Users now report that HTTPS connections to the web servers hang, although the security groups allow the traffic. What should the engineer add to the NACL?

Choose one.

  • a
    An outbound allow rule for TCP ports 1024-65535 to 0.0.0.0/0 Correct

    NACLs are stateless, so server responses — which return to the client's ephemeral port — need their own outbound allow; without it every reply is silently dropped.

  • b
    An inbound allow rule for TCP ports 1024-65535 from 0.0.0.0/0

    For inbound-initiated web traffic the replies leave the subnet outbound; inbound ephemeral rules matter for the returns of connections the servers initiate outward.

  • c
    An outbound allow rule for UDP ports 1024-65535 to 0.0.0.0/0

    The responses are TCP segments from port 443 to the client's ephemeral port. A UDP rule matches none of them.

  • d
    An inbound allow rule for TCP port 80 from 0.0.0.0/0

    Port 80 would enable plain HTTP, but the reported failure is HTTPS replies dying, which is an outbound ephemeral-port problem.

The concept

Network ACLs are stateless: return traffic is evaluated as brand-new packets and must be explicitly allowed. A client connecting to port 443 receives the response on a high-numbered ephemeral port — commonly within 1024-65535 — so the subnet's NACL needs an outbound allow covering that range.

Why that’s the answer

The custom NACL allows the request in but has no outbound rule matching the ephemeral destination ports of the responses, so connections hang after the initial packets. Security groups never hit this because they are stateful. The inbound ephemeral rule addresses the wrong direction for this flow, a UDP rule cannot match TCP replies, and port 80 is unrelated to failing HTTPS replies.

How to reason it out
  1. Recognize the symptom: requests arrive (SYNs accepted) but connections hang — a return-path block.
  2. Recall that NACLs are stateless and evaluate replies as new packets.
  3. Add an outbound allow for TCP 1024-65535 to 0.0.0.0/0 on the subnet's NACL.
  4. Retest HTTPS; the stateful security groups needed no change.

Exam tip: A stateless NACL needs explicit allows for ephemeral-port return traffic — forgetting the outbound 1024-65535 rule is the classic hang.

VPC Networking and Private Connectivity for SOA-C03 — the lesson that teaches this.

Question 23Networking and Content Delivery

A hostile IP range on the internet is scanning every instance in a public subnet on many ports. The operations team must block all traffic from this range to the entire subnet without modifying the dozens of security groups that the workloads use. The subnet's network ACL currently has rule 100 allowing all inbound traffic. What should the team configure?

Choose one.

  • a
    A network ACL deny rule for the range, numbered below the subnet's rule 100 Correct

    A network ACL applies to every interface in the subnet, supports deny rules, and evaluates the lowest rule number first, so a deny below rule 100 blocks the range before the allow matches.

  • b
    A new security group with a deny rule for the range, on each instance's network interface

    Security groups have allow rules only, so the deny rule cannot be written, and attaching a group to every instance also changes the workloads' security group sets.

  • c
    An AWS WAF IP set rule for the range, in a web ACL on the subnet's Application Load Balancer

    WAF inspects only HTTP(S) requests that pass through the load balancer. Scans sent directly to instances on other ports never reach it.

  • d
    A network ACL deny rule for the range, numbered above the subnet's rule 100

    Network ACL rules are evaluated from the lowest number and stop at the first match, so rule 100 allows the range before a higher-numbered deny is ever reached.

The concept

Network ACLs are subnet-level, stateless filters that support both allow and deny rules, evaluated from the lowest rule number. Security groups are instance-level and allow-only.

Why that’s the answer

Blocking a source across a whole subnet without touching security groups is the job of the network ACL: one deny rule covers every interface in the subnet. Because rule 100 already allows everything and evaluation stops at the first matching rule, the deny must have a lower number than 100; a higher-numbered deny is never reached. Security groups cannot deny, and WAF only sees HTTP(S) traffic through its associated resource.

How to reason it out
  1. Note the scope (an entire subnet) and the action (deny a source range).
  2. Rule out security groups: allow-only, and the stem forbids changing them.
  3. Add a network ACL inbound deny for the range with a number lower than 100.
  4. Confirm in VPC Flow Logs that traffic from the range is now REJECT.

Exam tip: Subnet-wide deny of a source range is a low-numbered network ACL deny rule; security groups cannot deny.

VPC Networking and Private Connectivity for SOA-C03 — the lesson that teaches this.

Question 24Networking and Content Delivery

EC2 instances in private subnets with no internet path must call the AWS Systems Manager APIs so the operations team can use Session Manager. The traffic must not traverse the internet, and no changes to SDK endpoint configuration on the instances are allowed. What should the engineer configure?

Choose one.

  • a
    A gateway VPC endpoint for Systems Manager

    Gateway endpoints support exactly two services, Amazon S3 and DynamoDB — Systems Manager requires interface endpoints.

  • b
    A NAT gateway in a public subnet with a default route from the private subnets

    A NAT gateway sends the API calls out over the internet path, violating the requirement that traffic not traverse the internet, and adds data-processing cost.

  • c
    Interface VPC endpoints with private DNS disabled, overriding the endpoint URLs on each instance

    Overriding endpoint URLs is exactly the per-instance configuration change the requirement forbids; enabling private DNS removes that need.

  • d
    Interface VPC endpoints for the required Systems Manager services, with private DNS enabled Correct

    Interface endpoints put PrivateLink-powered ENIs in the subnets, and private DNS makes the services' normal public hostnames resolve to those private IPs — no application or SDK changes needed.

The concept

Interface VPC endpoints, powered by AWS PrivateLink, place elastic network interfaces with private IPs in your subnets for most AWS services. With private DNS enabled, the service's default public hostname resolves to those private IPs inside the VPC, so applications work unchanged.

Why that’s the answer

Interface endpoints with private DNS meet both constraints: traffic stays on the AWS network, and the unchanged default hostnames mean zero SDK reconfiguration. A gateway endpoint cannot serve Systems Manager, a NAT gateway reintroduces the internet path, and disabling private DNS forces the endpoint-URL overrides the requirement rules out.

How to reason it out
  1. Create interface endpoints for the Systems Manager services Session Manager requires.
  2. Enable private DNS on each endpoint (the VPC needs DNS support and DNS hostnames enabled).
  3. Allow inbound HTTPS (443) from the instances in the endpoints' security group.
  4. Start a Session Manager session to confirm connectivity without any instance-side changes.

Exam tip: Interface endpoints plus private DNS give private subnets AWS API access with no application changes — gateway endpoints exist only for S3 and DynamoDB.

VPC Networking and Private Connectivity for SOA-C03 — the lesson that teaches this.

Question 25Networking and Content Delivery

A security review requires that EC2 instances reaching Amazon S3 through a gateway VPC endpoint be able to access only the company's approved buckets, with the restriction enforced at the network path itself. What should the CloudOps engineer configure?

Choose one.

  • a
    Security group rules on the gateway endpoint that allow the approved buckets' IP ranges

    Gateway endpoints have no network interfaces, so security groups cannot be attached to them; S3 IP ranges are also shared by every bucket.

  • b
    Network ACL rules on the private subnets that allow the approved buckets' domain names

    Network ACLs match IP addresses, ports and protocols. They cannot match DNS names or individual buckets.

  • c
    An endpoint policy on the gateway endpoint that allows actions on the approved buckets Correct

    An endpoint policy is a resource policy evaluated for every request through the endpoint, so listing the approved bucket ARNs blocks access to any other bucket through that path.

  • d
    Route table entries on the private subnets that point at the approved buckets' prefixes

    The gateway endpoint route uses the S3 prefix list for the whole Region. Routes cannot distinguish one bucket from another.

The concept

Both gateway and interface VPC endpoints accept an endpoint policy — an IAM-style resource policy that scopes what the endpoint may be used for. For an S3 gateway endpoint, that typically means restricting access to specific buckets, complementing bucket policies and identity policies.

Why that’s the answer

The endpoint policy is the control that lives on the network path itself, restricting every request through the endpoint regardless of which instance or role sends it. Gateway endpoints have no security groups, NACLs cannot understand buckets or hostnames, and route entries direct packets rather than authorize API actions.

How to reason it out
  1. Open the S3 gateway endpoint's configuration and edit its endpoint policy.
  2. Write a policy allowing the needed S3 actions only on the approved buckets' ARNs.
  3. Apply the policy and test access to an approved bucket (success) and an unapproved one (denied).
  4. Layer bucket policies and IAM policies on top for defense in depth.

Exam tip: An endpoint policy scopes what a VPC endpoint can be used for — the way to pin an S3 gateway endpoint to approved buckets.

VPC Networking and Private Connectivity for SOA-C03 — the lesson that teaches this.

Keep going with SOA-C03

SOA-C03 practice by domain

SOA-C03 sample questions: your questions

No. Real exam questions are confidential. These are original questions written to the skills in the official SOA-C03 exam guide, so they test the same knowledge in the same style without being copies of the exam.

Source

The domains and weights on this page come from the official SOA-C03 exam guide.