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

SAA-C03 sample questions — 25 answered and explained

25 SAA-C03 sample questions written to the official AWS Certified Solutions Architect – 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 SAA-C03 practice pages.

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

Domain 1: Design Secure Architectures

30% of the SAA-C03 exam, so 8 of the 25 questions on this page.

Question 1Design Secure Architectures

An analytics application in account A runs under an IAM role and must assume a role in account B to query resources there. The cross-account access is currently failing. Which TWO configuration elements are required for the role assumption to succeed? (Select TWO.)

Choose TWO.

  • a
    A trust policy on the role in account B that names the application's role in account A as a trusted principal. Correct

    Correct. The target role's trust policy decides who may assume it; without it naming the account A principal (or account A), AssumeRole is refused.

  • b
    A service control policy attached to account B that allows the account A role to call sts:AssumeRole on the role.

    SCPs never grant permissions; they only set the maximum available permissions in the accounts they apply to.

  • c
    A permissions boundary on the role in account B that names the application's role in account A as a trusted principal.

    A permissions boundary caps a role's own permissions; it has no Principal element and plays no part in deciding who may assume the role.

  • d
    A trust policy on the application's role in account A that names the role in account B as a trusted principal.

    This reverses the relationship. The trust policy that matters belongs to the role being assumed, in account B.

  • e
    An identity-based policy in account A that allows the application's role to call sts:AssumeRole on the account B role. Correct

    Correct. Across accounts both sides must agree: the caller also needs an identity-based allow for sts:AssumeRole on the target role's ARN.

The concept

Cross-account role assumption needs consent on both sides: the target role's trust policy must name the caller, and the caller's identity-based policy must allow sts:AssumeRole on the target role.

Why that’s the answer

Within one account a single allow can be enough, but across accounts both accounts must allow the request. Account B consents through the trust policy on the role being assumed, and account A consents by allowing its role to call sts:AssumeRole on that role's ARN. An SCP cannot grant anything, a permissions boundary has no say in who may assume a role, and a trust policy on the caller's own role controls who can assume the caller, not what the caller can assume.

How to reason it out
  1. Locate the role being assumed: it is in account B.
  2. Its trust policy must name the caller.
  3. Across accounts the caller's account must also allow the action: sts:AssumeRole in an identity-based policy.
  4. Discard layers that cannot grant (SCPs) or that do not control assumption (boundaries).

Exam tip: Cross-account AssumeRole = trust policy on the target role + sts:AssumeRole allow on the caller.

Designing Secure Access: IAM Best Practices, Roles, and AWS Organizations — the lesson that teaches this.

Question 2Design Secure Architectures

A company's central operations account hosts a deployment pipeline that must create, update, and delete CloudFormation stacks, EC2 instances, and IAM roles in each of 12 workload accounts in the same organization. Which design provides this access MOST securely?

Choose one.

  • a
    Set up a deployment role in each workload account that trusts the pipeline's role, and have the pipeline assume it per run. Correct

    Correct. The pipeline receives temporary credentials per deployment, each role can be scoped to what that account needs, and every assumption is logged.

  • b
    Have the pipeline assume the OrganizationAccountAccessRole that AWS Organizations created in each workload account for each deployment.

    That role carries full administrator access and by default trusts only the management account, so it would need its trust changed and would still give the pipeline far more than it needs.

  • c
    Attach resource-based policies to the stacks, instances, and roles in each workload account that grant the pipeline's role access.

    CloudFormation stacks and EC2 instances do not support resource-based policies, and an IAM role's only resource policy is its trust policy, so this cannot grant the pipeline these actions.

  • d
    Attach an SCP to the workload accounts' OU that grants the pipeline's role the CloudFormation, EC2, and IAM permissions it needs.

    SCPs never grant permissions. They can only limit what IAM policies in the member accounts allow.

The concept

A central pipeline or tool that acts in many accounts should assume a role in each target account. Each role trusts the pipeline's role, carries only the permissions that account needs, and issues temporary credentials per session.

Why that’s the answer

Per-account deployment roles give the pipeline short-lived credentials, keep permissions scoped account by account, and leave an AssumeRole record for every deployment. Reusing OrganizationAccountAccessRole is the tempting shortcut because it already exists in accounts created by Organizations, but it grants AdministratorAccess and trusts the management account, not the operations account, so it fails least privilege. Resource-based policies are not available for the stacks and instances involved, and an SCP cannot grant anything.

How to reason it out
  1. Identify the actor: an automated principal in one account acting in many others.
  2. Rule out layers that cannot grant (SCPs) and resources with no resource policy (EC2 instances, CloudFormation stacks).
  3. Reject the existing administrator role: it works only with a trust change and is far broader than the pipeline needs.
  4. Create a scoped role per workload account whose trust policy names the pipeline's role.

Exam tip: Hub-and-spoke automation: one trusted role per target account, assumed per run.

Designing Secure Access: IAM Best Practices, Roles, and AWS Organizations — the lesson that teaches this.

Question 3Design Secure Architectures

A company wants to adopt a third-party SaaS cost-optimization service that runs in the vendor's own AWS account and serves many customers. The vendor's onboarding guide instructs each customer to create an IAM user with read-only permissions and email the access keys to the vendor's support team. What should the solutions architect implement instead as the MOST secure integration?

Choose one.

  • a
    Create a read-only cross-account role that trusts the vendor's account, with no condition in its trust policy.

    This removes the long-lived keys, but without an external ID condition another customer of the vendor could get the vendor's service to assume this company's role (the confused-deputy problem).

  • b
    Create an IAM Identity Center user for the vendor's support team and assign it a read-only permission set.

    Identity Center gives people a sign-in portal; the vendor's automated service runs in its own AWS account and should assume a role from there rather than hold a workforce identity in this company's directory.

  • c
    Grant the vendor's AWS account read access through resource-based policies on each service the tool analyzes.

    Most services the tool reads, such as EC2, RDS and Cost Explorer, do not support resource-based policies for those read actions.

  • d
    Create a read-only cross-account role that trusts the vendor's account and requires the vendor's external ID. Correct

    Correct. The vendor assumes the role with STS and receives temporary credentials, no keys change hands, and the external ID condition prevents another vendor customer from steering the vendor into this role.

The concept

Third parties that run in their own AWS account should get access through a cross-account role, not IAM user keys. For multi-tenant vendors, the trust policy also requires an external ID that the vendor assigns to each customer.

Why that’s the answer

A cross-account role with an external ID condition gives the vendor only temporary credentials, never exposes long-lived keys, and can be revoked by editing the trust policy. The same role without the external ID is the near-twin: it fixes the keys but leaves the confused-deputy gap that a multi-tenant vendor creates. An Identity Center user is a workforce sign-in for people, not a way for a vendor's service in another AWS account to call this one. Resource-based policies do not cover most of what a cost tool reads.

How to reason it out
  1. Identify the actor: an automated multi-tenant service in its own AWS account.
  2. Rule out any design that gives the vendor long-lived keys or a workforce identity.
  3. Use a cross-account role with read-only permissions in the company's account.
  4. Because the vendor serves many customers, add an external ID condition to the trust policy.

Exam tip: Vendors assume a role with an external ID; they never receive access keys.

Designing Secure Access: IAM Best Practices, Roles, and AWS Organizations — the lesson that teaches this.

Question 4Design Secure Architectures

A company already grants a SaaS monitoring vendor access through a cross-account IAM role whose trust policy names the vendor's AWS account and whose permissions are read-only. A security review raises one remaining concern: a different customer of the same vendor could manipulate the vendor's service into assuming this company's role. Which change mitigates this risk with the LEAST disruption?

Choose one.

  • a
    Require a unique external ID that the vendor generates for this company in a condition in the role's trust policy. Correct

    Correct. The vendor passes this company's external ID only when acting for this company, so a request made on behalf of another customer fails the condition. This is the confused-deputy defense.

  • b
    Require multi-factor authentication in a condition in the role's trust policy for each assumption of the role.

    The vendor's automated service cannot complete MFA, so this would break the integration, and it does not tell apart requests made for different customers.

  • c
    Require the vendor's published source IP address ranges in a condition in the role's trust policy.

    Requests on behalf of every customer come from the same vendor infrastructure and IP ranges, so this does not stop the confused-deputy scenario.

  • d
    Attach a permissions boundary to the role that caps it at the read actions the monitoring tool needs.

    The role is already read-only. A boundary limits what the role can do, not which customer's request causes it to be assumed.

The concept

The confused-deputy problem: a trusted multi-tenant service can be tricked into using its access to one customer on behalf of another. The external ID, a value the vendor assigns per customer and checks in the trust policy condition sts:ExternalId, ties each assumption to the right customer.

Why that’s the answer

Requiring the vendor-generated external ID means the vendor can assume this role only when acting for this company, which is exactly the risk raised. MFA would break an automated integration. Source IP conditions cannot tell customers apart, because every customer's requests come from the same vendor. A permissions boundary narrows what the role can do but does nothing about who causes it to be assumed.

How to reason it out
  1. Name the risk: another customer using the vendor as a confused deputy.
  2. Find the control that distinguishes customers, not callers: the external ID.
  3. Rule out MFA (breaks automation) and IP ranges (same for all customers).
  4. Add the sts:ExternalId condition to the trust policy; the permissions stay as they are.

Exam tip: External ID = confused-deputy defense for multi-tenant vendors; it goes in the trust policy condition.

Designing Secure Access: IAM Best Practices, Roles, and AWS Organizations — the lesson that teaches this.

Question 5Design Secure Architectures

A company with 500 employees and 25 AWS accounts manages access today with separate IAM users in every account. Employees complain about juggling credentials, and offboarding a departing employee takes days of tracking down users across accounts. The company manages its workforce in Microsoft Entra ID. Which solution reduces this operational overhead the MOST?

Choose one.

  • a
    Write a scheduled script that creates, updates, and deletes IAM users across the 25 accounts based on an HR system export.

    Automation reduces some manual work, but it keeps thousands of IAM users with long-lived credentials and adds a custom tool to maintain.

  • b
    Configure SAML 2.0 federation between Microsoft Entra ID and an IAM identity provider separately in each of the 25 accounts.

    This works, but every account needs its own identity provider, roles and trust configuration, which is the per-account overhead the company wants to remove.

  • c
    Enable IAM Identity Center with Microsoft Entra ID as its identity source and assign permission sets in the accounts. Correct

    Correct. Employees sign in once with their Entra ID identity; permission sets become roles in each assigned account, and disabling the user in Entra ID removes their access.

  • d
    Create one IAM user per employee in a central identity account and let employees switch roles into the other 24 accounts.

    This reduces credentials per person, but the company still manages 500 IAM users separately from Entra ID, so offboarding is still a separate task in AWS.

The concept

IAM Identity Center provides workforce single sign-on across every account in an organization. It connects to an existing identity source (here Microsoft Entra ID through SAML 2.0 and SCIM) and grants access with permission sets assigned to accounts.

Why that’s the answer

Identity Center connected to Entra ID lets employees use the identity they already have, provisions roles in each account from permission sets, and makes offboarding a single change in Entra ID. Per-account SAML federation also removes IAM users but has to be configured and maintained 25 times. A hub account with role switching and a sync script both keep IAM users that live apart from the corporate directory.

How to reason it out
  1. Identify the actor: a workforce across many accounts with an existing IdP.
  2. Prefer federation to the existing IdP over creating identities in AWS.
  3. Compare federation options: per-account SAML versus one central configuration.
  4. Choose IAM Identity Center with permission sets for the lowest ongoing overhead.

Exam tip: Workforce + many accounts + existing IdP = IAM Identity Center with permission sets.

Designing Secure Access: IAM Best Practices, Roles, and AWS Organizations — the lesson that teaches this.

Question 6Design Secure Architectures

A company with 30 AWS accounts in AWS Organizations is eliminating per-account IAM users for its workforce. Employees are managed in an on-premises Microsoft Active Directory, and the security team requires that all AWS access use temporary credentials with centralized assignment of permissions per account. Which combination of steps should a solutions architect take? (Select TWO.)

Choose TWO.

  • a
    Run a nightly job that mirrors on-premises Active Directory users into IAM users with permission policies in each account.

    This keeps IAM users with long-lived credentials in every account, which the company is eliminating.

  • b
    Connect the on-premises Active Directory to IAM Identity Center as its identity source through AWS Directory Service. Correct

    Correct. Identity Center can use a self-managed Active Directory as its identity source through AD Connector or AWS Managed Microsoft AD with a trust, so employees keep their existing AD credentials.

  • c
    Enable IAM Identity Center with its default Identity Center directory and recreate the employees there as users.

    This centralizes AWS access, but it creates a second user directory instead of using the on-premises Active Directory, so employees and their group memberships would be managed twice.

  • d
    Create permission sets in IAM Identity Center and assign Active Directory groups to accounts with those permission sets. Correct

    Correct. Permission sets are provisioned as roles in each assigned account; users receive temporary credentials and access is managed centrally by group.

  • e
    Configure SAML 2.0 federation from the on-premises directory to an IAM identity provider and role in each of the 30 accounts.

    This gives temporary credentials, but permissions are configured account by account, which does not meet the centralized assignment requirement.

The concept

To federate an existing on-premises Active Directory for workforce access to many AWS accounts, connect it to IAM Identity Center (through AD Connector or AWS Managed Microsoft AD) and assign directory groups to accounts with permission sets.

Why that’s the answer

Connecting the AD as Identity Center's identity source lets employees use their existing credentials, and permission sets assigned to AD groups give every account temporary-credential roles that are managed from one place. Identity Center with its default directory is the near-twin: it centralizes access but duplicates the workforce in a second directory. Per-account SAML federation also gives temporary credentials but splits the permission assignment across 30 accounts, and mirroring users into IAM keeps long-lived credentials.

How to reason it out
  1. Note the existing directory: an on-premises Microsoft AD.
  2. Note the requirements: temporary credentials and centralized per-account assignment.
  3. Connect the AD to IAM Identity Center through AWS Directory Service.
  4. Assign AD groups to accounts with permission sets.

Exam tip: Existing AD + many accounts: connect AD to IAM Identity Center and assign groups with permission sets.

Designing Secure Access: IAM Best Practices, Roles, and AWS Organizations — the lesson that teaches this.

Question 7Design Secure Architectures

A platform team wants development teams to create IAM roles for their own applications without waiting for the security team, but security requires assurance that no role a developer creates can exceed a defined set of maximum permissions. Which approach meets both goals?

Choose one.

  • a
    Attach an SCP to the development OU that denies iam:CreateRole unless the request comes from the security team's role.

    This keeps roles within limits but removes self-service, because developers would again wait for the security team.

  • b
    Attach a permissions boundary to each developer's own IAM role and let developers create roles with policies they choose.

    A boundary limits only the identity it is attached to. Roles the developers create would carry no boundary and could exceed the maximum.

  • c
    Let developers call iam:CreateRole only when the request attaches the approved permissions boundary to the new role. Correct

    Correct. A condition on iam:PermissionsBoundary forces every new role to carry the approved boundary, so its effective permissions can never exceed it, while developers still create roles themselves.

  • d
    Let developers create roles freely and use an AWS Config rule to detect and report roles with excessive permissions.

    This is detective. Over-privileged roles would exist and could be used before anyone reacts.

The concept

Permissions boundaries enable safe delegation: developers may create roles only if each new role carries an approved boundary (enforced with the iam:PermissionsBoundary condition key), so no delegated role can exceed it.

Why that’s the answer

Requiring the approved boundary on every role created gives both self-service and a hard ceiling. The full pattern also denies developers the ability to remove or edit the boundary. Putting the boundary on the developers themselves is the near-twin trap: it caps the developers, not the roles they create. Blocking role creation with an SCP removes self-service, and a Config rule only detects violations after the roles exist.

How to reason it out
  1. Separate the two goals: self-service role creation and a ceiling on every created role.
  2. Recall that a boundary limits only the identity it is attached to.
  3. Attach the boundary to the created roles by requiring it in an iam:PermissionsBoundary condition.
  4. Also deny developers permission to change or remove the boundary policy.

Exam tip: Delegate IAM safely by forcing a permissions boundary onto every role developers create.

Designing Secure Access: IAM Best Practices, Roles, and AWS Organizations — the lesson that teaches this.

Question 8Design Secure Architectures

An IAM user has an identity-based policy that allows s3:* on all resources. A permissions boundary that allows only dynamodb:* is attached to the user. No SCPs restrict the account and no resource policies or explicit denies apply. The user reports being unable to access Amazon S3 or DynamoDB. What explains the behavior?

Choose one.

  • a
    Effective access is the intersection: S3 falls outside the boundary, and DynamoDB has no allow in the identity policy. Correct

    Correct. An action must be allowed by both the identity policy and the boundary. S3 is outside the boundary, and the boundary cannot grant DynamoDB on its own.

  • b
    Effective access is set by the boundary alone, so DynamoDB requests should succeed while the S3 requests fail.

    A boundary never grants permissions. Without an identity-policy allow for DynamoDB, those requests are implicitly denied.

  • c
    Effective access is the union of both policies, so both services should work once the policy changes finish propagating.

    Boundaries and identity policies intersect rather than combine, and waiting for propagation will not grant either service.

  • d
    Effective access ignores boundaries on IAM users, so the S3 failure comes from a missing bucket policy on each bucket.

    Permissions boundaries apply to IAM users as well as roles, and a same-account principal does not need a bucket policy when its identity policy allows the action.

The concept

A permissions boundary sets the maximum permissions for a user or role but grants nothing. Effective permissions are the intersection of what the identity-based policies allow and what the boundary allows.

Why that’s the answer

S3 is allowed by the identity policy but falls outside the boundary, and DynamoDB is inside the boundary but not allowed by the identity policy, so neither service is in the intersection. Treating the boundary as a grant (DynamoDB works) or the two policies as a union are the common mistakes. Boundaries apply to IAM users too, and same-account access needs no bucket policy when an identity policy allows it.

How to reason it out
  1. List what the identity policy allows: S3.
  2. List what the boundary allows: DynamoDB.
  3. Take the intersection: nothing.
  4. Fix by allowing both in each layer, or adjust whichever layer is wrong.

Exam tip: Boundary ∩ identity policy = effective permissions; a boundary alone grants nothing.

Designing Secure Access: IAM Best Practices, Roles, and AWS Organizations — the lesson that teaches this.

Domain 2: Design Resilient Architectures

26% of the SAA-C03 exam, so 6 of the 25 questions on this page.

Question 9Design Resilient Architectures

A logistics company publishes all shipment lifecycle events to an SNS topic used by several teams. The refunds team needs to process only shipment-cancelled events, must keep them durably so none are lost during its nightly maintenance window, and wants messages that repeatedly fail processing to be set aside for investigation. The publisher team will not change its code. Which combination of steps meets these requirements? (Select TWO.)

Choose TWO.

  • a
    Subscribe a dedicated SQS queue for the refunds service to the topic, and give that queue a redrive policy to a dead-letter queue. Correct

    The queue keeps the refunds team's events through its maintenance window, and the redrive policy moves messages that keep failing to a dead-letter queue.

  • b
    Have the refunds service poll the SNS topic for shipment-cancelled events each morning after the maintenance window ends.

    SNS topics are push-only and do not store messages for later retrieval, so there is nothing to poll.

  • c
    Subscribe the refunds Lambda function directly to the topic, and discard events other than shipment-cancelled in the code.

    This filters in code instead of at the subscription and gives the team no buffer it controls during maintenance or a place to isolate failing messages.

  • d
    Create a second SNS topic for shipment-cancelled events, and have the publisher send those events to both of the topics.

    This separates the events but requires the publisher to change its code, which the stem rules out, and still provides no durable buffer.

  • e
    Apply a filter policy to the refunds subscription so that only shipment-cancelled events are delivered to it. Correct

    A subscription filter policy makes SNS deliver only matching events to that subscriber, with no change to the publisher and no filtering code.

The concept

SNS subscription filter policies let each subscriber receive only the events it wants, and subscribing an SQS queue gives that subscriber a durable buffer with its own dead-letter queue.

Why that’s the answer

The refunds team needs three things, and two subscription-side changes provide them: an SQS queue subscribed to the topic (durable through maintenance, with a redrive policy to a dead-letter queue for repeated failures) and a filter policy on that subscription (only shipment-cancelled events, no publisher change). A second topic would separate the events, but only by changing the publisher. Filtering inside a Lambda subscriber works for selection but leaves the team without a buffer it controls or a dead-letter queue for its processing failures. SNS cannot be polled.

How to reason it out
  1. Split the requirements: selection, durability, failure isolation, no publisher change.
  2. Selection without publisher change: a filter policy on the subscription.
  3. Durability and failure isolation: an SQS queue subscriber with a redrive policy to a dead-letter queue.
  4. Reject polling SNS (not possible) and options that change the publisher.

Exam tip: Subscriber wants a subset of a shared topic: filter policy on its subscription; wants durability: subscribe its own SQS queue with a DLQ.

Scalable, Loosely Coupled Architectures: SQS, SNS, EventBridge, Step Functions — the lesson that teaches this.

Question 10Design Resilient Architectures

A retail company wants order events routed by values inside each order: orders above a value threshold must start a fraud-review AWS Step Functions workflow, while all other orders go to a standard-processing SQS queue. The company also plans to receive support-ticket events from a third-party SaaS help desk that offers a native AWS integration, without building webhook infrastructure. Which service should be at the center of this design?

Choose one.

  • a
    Amazon SNS, with a filter policy on each subscription that matches values in the order payload.

    SNS can filter on the message body, but it cannot start a Step Functions workflow as a subscriber and has no partner event sources for the help desk.

  • b
    Amazon Kinesis Data Streams, with one consumer application per destination that filters each order.

    Every consumer reads every record and filters in its own code, and Kinesis has no partner event source integration for the help desk.

  • c
    Amazon SQS, with a Lambda consumer that reads each order's value and forwards it to a destination.

    This works for the orders only by writing and running routing code, and it offers nothing for receiving the help desk's events.

  • d
    Amazon EventBridge, with rules that match values in each order event and send matches to targets. Correct

    EventBridge rules match on any field in the event and can target both Step Functions and SQS, and partner event sources deliver the help desk's events to a partner event bus.

The concept

EventBridge is an event bus with rules: rules match on event content and route to many target types, and SaaS partner event sources deliver third-party events onto a partner event bus with no polling or webhook code.

Why that’s the answer

Two requirements together point to EventBridge. Content-based routing to a Step Functions workflow and to an SQS queue is a pair of rules with different targets. Receiving a supported SaaS help desk's events without webhooks is what partner event sources do. SNS is the tempting near-twin because its filter policies can now match on the message body, but SNS cannot deliver to Step Functions directly and has no SaaS partner integration. The SQS-plus-Lambda router and per-destination Kinesis consumers both move the routing into custom code and still leave the help desk integration unsolved.

How to reason it out
  1. List the targets: a Step Functions workflow and an SQS queue, chosen by a value in the event.
  2. List the sources: your application and a third-party SaaS partner.
  3. Recall that EventBridge rules route by content to Step Functions, SQS and more, and partner event sources ingest SaaS events.
  4. Check SNS: payload filtering exists, but Step Functions is not a subscriber type and there are no partner sources.

Exam tip: Content-based routing to varied targets plus SaaS partner events = EventBridge; SNS filters but cannot reach every target or ingest SaaS events.

Scalable, Loosely Coupled Architectures: SQS, SNS, EventBridge, Step Functions — the lesson that teaches this.

Question 11Design Resilient Architectures

A company runs each microservice team in its own AWS account. Teams need to publish domain events that other teams' accounts can consume, with routing based on fields in each event and a single place where the platform team governs which events flow to which accounts. The solution must minimize custom integration code. What should a solutions architect recommend?

Choose one.

  • a
    Create a central EventBridge event bus whose resource policy lets producer accounts put events, with rules targeting consumer buses. Correct

    One bus receives events from every producer account under a resource-based policy, and its rules match event fields and send matches to event buses in consumer accounts, all managed in one place.

  • b
    Create an SNS topic in each producer account, with a topic policy that lets consumer accounts subscribe their own SQS queues.

    Cross-account SNS-to-SQS works, but the topics and their policies are spread across every producer account, so there is no single place to govern the flows.

  • c
    Create one SQS queue in a central account, with a queue policy that lets producer and consumer accounts send and receive.

    Consumers of one queue compete for messages, so each event reaches one consuming account rather than every interested one, and there is no routing.

  • d
    Create a Kinesis data stream in a central account, with a resource policy that grants producer and consumer accounts access.

    Cross-account access works, but every consumer reads every record and must filter in its own code, so routing is custom code rather than configuration.

The concept

A central EventBridge event bus with a resource-based policy is the standard pattern for cross-account event-driven architectures: producers put events on it, and rules on that one bus decide which events go to which consumer accounts.

Why that’s the answer

The governance requirement decides it. With a central bus, every routing decision is a rule in one account, producers are granted access by the bus's resource policy, and consumer accounts receive matches on their own buses. SNS topics in each producer account are a workable cross-account pattern but scatter governance across every account, and filter policies are owned per subscription. A central Kinesis stream gives shared access but no routing, so each consumer writes filtering code. A single shared SQS queue fails outright because consumers compete for messages.

How to reason it out
  1. Identify the needs: cross-account publish and consume, routing on event fields, one governance point, minimal code.
  2. Rule out the shared queue: competing consumers.
  3. Rule out the shared stream: no routing, filtering in code.
  4. Choose between SNS per account and a central bus on governance: the central EventBridge bus keeps every rule in one place.

Exam tip: Cross-account event routing governed in one place = a central EventBridge bus with a resource policy and rules.

Scalable, Loosely Coupled Architectures: SQS, SNS, EventBridge, Step Functions — the lesson that teaches this.

Question 12Design Resilient Architectures

A lender is automating loan approval. Several steps must run in strict order, the credit-bureau call must retry with exponential backoff when the bureau is slow, and the process must pause for up to several days until a human underwriter approves or rejects the application in an internal portal before continuing. Which solution requires the LEAST custom code?

Choose one.

  • a
    An AWS Step Functions Standard workflow with per-step retry policies and a callback task token for the underwriter. Correct

    Standard workflows run for up to a year, retry each step declaratively with backoff, and a task can wait on a task token until the portal returns the underwriter's decision.

  • b
    A chain of Lambda functions, each invoking the next, with retry code in each and the decision stored in DynamoDB.

    Retry logic is hand-written in each function, and a Lambda function cannot wait days for a human, so the chain needs extra code to resume when the decision arrives.

  • c
    SQS queues between Lambda steps for retry, and a scheduled function that polls a table for underwriter decisions.

    Queues give redelivery but not ordered multi-step control or backoff per step, and the polling function is custom code that a callback makes unnecessary.

  • d
    An AWS Step Functions Express workflow with per-step retry policies and a callback task token for the underwriter.

    Express workflows run for at most five minutes and do not support the callback (wait for task token) pattern, so they cannot pause days for a human.

The concept

Step Functions has two workflow types. Standard workflows run for up to one year with exactly-once execution and support the callback pattern; Express workflows run for up to five minutes, are at-least-once and suit high-volume, short event processing.

Why that’s the answer

A days-long human pause needs a Standard workflow: a task started with a task token waits until the portal calls SendTaskSuccess or SendTaskFailure, and per-step Retry rules provide the backoff for the bureau call with no code. The Express twin looks identical but fails on two facts: its five-minute maximum duration and its lack of support for the callback pattern. Chained Lambda functions and queue-plus-polling designs can be made to work, but only with hand-written retries, state tracking and polling, which the LEAST custom code qualifier rules out.

How to reason it out
  1. Spot the orchestration need: ordered steps with per-step retries points to Step Functions.
  2. Spot the long human wait: days rules out anything bounded by minutes.
  3. Recall the workflow types: Standard runs up to a year and supports task tokens; Express runs up to five minutes.
  4. Pick Standard with Retry rules and a callback task token.

Exam tip: Human approval or multi-day waits = Step Functions Standard with a task token; Express is for short, high-volume runs.

Scalable, Loosely Coupled Architectures: SQS, SNS, EventBridge, Step Functions — the lesson that teaches this.

Question 13Design Resilient Architectures

A media company's ingest pipeline is a chain of six Lambda functions in which each function synchronously invokes the next. The first function frequently times out waiting for the rest of the chain, the same retry code is copied into every function, and when a run fails the team cannot tell at which step it stopped. Which refactor fixes all three problems with the LEAST operational overhead?

Choose one.

  • a
    Keep the chain, raise each function's timeout to 15 minutes, and move the retry code into a shared Lambda layer.

    This removes the copied code but not the synchronous chain: the first function still waits for the rest, and there is still no record of where a run stopped.

  • b
    Replace the chain with a Step Functions state machine that invokes each function as a task with Retry and Catch rules. Correct

    Each function runs only its own step, Retry and Catch rules replace the copied retry code, and the execution history shows exactly which step failed.

  • c
    Rewrite the pipeline as one container task on AWS Fargate that invokes the six steps' code in sequence and logs progress.

    This removes the timeout but merges the steps into one program with its own retry and progress code, a large rewrite to fix what orchestration fixes directly.

  • d
    Insert an SQS queue between each pair of functions, so that each function returns as soon as it sends work to the next queue.

    Queues remove the waiting, but retries and failure handling are spread across five queues and their consumers, and no single view shows how far a run got.

The concept

Orchestration keeps a workflow's sequence, retries and state outside the functions. A Step Functions state machine calls each function as a task, applies Retry and Catch rules per step, and records every execution.

Why that’s the answer

All three symptoms come from the chain itself. In a state machine no function waits for another, because Step Functions drives each task in turn; retries become declarative Retry rules on each state instead of copied code; and the execution history shows the failed state. Queues between functions are the tempting alternative: they remove the waiting, but each hop needs its own retry and dead-letter handling and there is no end-to-end view of a run. A layer plus longer timeouts tidies the code but keeps the coupling. A single Fargate task is a rewrite that rebuilds what Step Functions provides.

How to reason it out
  1. Trace each symptom to the synchronous chain: waiting, duplicated retries, no run state.
  2. Recall what Step Functions provides: sequencing, per-state Retry/Catch, and execution history.
  3. Check the queue option: it fixes waiting but not visibility or centralised retries.
  4. Choose the state machine as the one change that fixes all three with no new code.

Exam tip: Lambda functions calling Lambda functions is a smell: orchestrate the steps with Step Functions and its Retry/Catch rules.

Scalable, Loosely Coupled Architectures: SQS, SNS, EventBridge, Step Functions — the lesson that teaches this.

Question 14Design Resilient Architectures

A company exposes a public REST API from EC2 instances. Some integration partners occasionally flood the API and degrade it for everyone. The company wants a separate request rate limit and monthly request quota for each partner, request validation before traffic reaches the backend, and the ability to move the backend to Lambda later without partners changing their integration. Which solution meets these requirements with the LEAST operational overhead?

Choose one.

  • a
    Put Amazon API Gateway in front of the backend, with an API key and usage plan for each partner and request validation. Correct

    Usage plans attached to each partner's API key enforce that partner's throttle and quota, request validators reject malformed calls before the backend, and the integration behind the stable API can change to Lambda later.

  • b
    Put an Application Load Balancer in front of the instances, with AWS WAF rate-based rules keyed on each partner's IP address.

    Rate-based rules can throttle by IP, but they do not track monthly quotas or validate request bodies, and partner IPs change or are shared.

  • c
    Put Amazon CloudFront in front of the instances, with AWS WAF rate-based rules and a Lambda@Edge function to validate requests.

    This adds rate limiting and custom validation code at the edge, but still has no per-partner quota, and the validation function is extra code to maintain.

  • d
    Add throttling, per-partner quota counters in DynamoDB, and request validation to the backend application.

    This can meet the needs, but the team builds and runs all of it, and it has to be rebuilt when the backend moves to Lambda.

The concept

API Gateway is a managed front door: usage plans and API keys give per-client throttling and quotas, request validators check requests before integration, and the stable API contract decouples clients from the backend.

Why that’s the answer

Each requirement maps to a built-in API Gateway feature: a usage plan per partner sets that partner's rate, burst and quota; request validation runs before the backend; and swapping the integration from HTTP to Lambda leaves the public contract unchanged. AWS WAF rate-based rules, whether on an ALB or CloudFront, throttle by IP or other request keys but have no concept of a monthly quota per client, and validation would be custom code. Building it into the application meets the functional needs but maximises operational overhead and ties the controls to the backend being replaced.

How to reason it out
  1. List the needs: per-partner rate limit and quota, validation, backend swap without client change.
  2. Map them to API Gateway: usage plans with API keys, request validators, stable API in front of a changeable integration.
  3. Check the WAF options: rate limiting yes, quotas and validation no.
  4. Prefer the managed feature set over custom middleware for least overhead.

Exam tip: Per-client throttles and quotas on an API = API Gateway usage plans with API keys; WAF rate rules don't do quotas.

Scalable, Loosely Coupled Architectures: SQS, SNS, EventBridge, Step Functions — the lesson that teaches this.

Domain 3: Design High-Performing Architectures

24% of the SAA-C03 exam, so 6 of the 25 questions on this page.

Question 15Design High-Performing Architectures

A content-management application runs on an Auto Scaling group of Linux EC2 instances spread across three Availability Zones. Each instance must read and write the same set of files at the same time using standard POSIX file-system operations, and the amount of content grows unpredictably. Which storage solution meets these requirements?

Choose one.

  • a
    An io2 EBS volume with Multi-Attach shared by all the instances

    Multi-Attach works only within a single Availability Zone and requires a cluster-aware file system, so it cannot serve a three-AZ Auto Scaling group.

  • b
    An Amazon S3 bucket that all the instances access through the SDK

    S3 stores objects behind an HTTP API; it does not provide the POSIX file-system operations the application performs.

  • c
    An Amazon EFS file system mounted by all the instances Correct

    EFS is managed NFS with concurrent mounts across multiple AZs, full POSIX semantics and capacity that grows automatically.

  • d
    A gp3 EBS volume per instance, synchronized by a scheduled script

    Per-instance copies with sync scripts invite conflicts and lag, and hand-built replication is heavy operational overhead compared with a managed shared file system.

The concept

When many Linux instances need concurrent read-write access to the same files across AZs with POSIX semantics, the answer is file storage — and with no Windows or HPC keyword, that means EFS.

Why that’s the answer

The four EFS tells all appear: shared, concurrent, across AZs, POSIX. EFS mounts simultaneously from every instance in every AZ and scales capacity automatically as the Auto Scaling group churns files. Multi-Attach is the precise-fact trap: it does exist, but it is same-AZ only and demands a cluster-aware file system, so it fails a multi-AZ fleet twice. S3 fails the access shape — the application performs file operations, not API calls. Per-instance gp3 volumes with sync scripts technically function but recreate a distributed file system by hand, with consistency conflicts and constant maintenance.

How to reason it out
  1. Extract the pattern: shared, concurrent, read-write, multi-AZ, POSIX file semantics.
  2. Eliminate block storage: EBS attaches within one AZ, and Multi-Attach is same-AZ with a cluster-FS requirement.
  3. Eliminate object storage: S3's API access does not satisfy POSIX file operations.
  4. Check for redirect keywords (Windows, SMB, Active Directory, HPC): none, so EFS rather than FSx.
  5. Select EFS mounted on all instances across the three AZs.

Exam tip: Shared + concurrent + across AZs + POSIX on Linux is the EFS signature; EBS Multi-Attach is a same-AZ clustering tool, not general file sharing.

High-Performing Storage: S3 vs EBS vs EFS, Volume Types, and Hybrid Options — the lesson that teaches this.

Question 16Design High-Performing Architectures

A build system stores about 50 GiB on an Amazon EFS file system that uses Bursting throughput, and drives a steady, heavy load against it all working day. Builds run fast each morning, then throughput collapses by midday until traffic stops overnight. The required throughput is known and constant, and finance wants a predictable monthly charge for it. What should a solutions architect do?

Choose one.

  • a
    Copy enough padding data onto the file system to raise its baseline

    More stored data does raise the Bursting baseline, but paying to store useless data is a wasteful workaround that needs re-padding whenever the demand changes.

  • b
    Switch the file system to Provisioned throughput at the required rate Correct

    Provisioned throughput sets throughput independently of stored size and burst credits, is billed at a fixed rate for the amount provisioned, and suits a known, steady requirement.

  • c
    Recreate the file system in Max I/O performance mode and copy data

    Max I/O is a previous-generation performance mode for highly parallel workloads that adds per-operation latency; it does nothing about exhausted burst credits.

  • d
    Switch the file system to Elastic throughput and let it scale on demand

    Elastic throughput would stop the throttling, but it bills per gigabyte read and written, which for a steady, heavy load is less predictable and usually costs more than provisioning a known rate.

The concept

In Bursting mode EFS throughput scales with the data stored, so a small, busy file system drains its burst credits and throttles. Provisioned throughput fixes a known, steady requirement at a fixed rate; Elastic throughput (the default for new file systems) suits spiky or unpredictable load and bills per use.

Why that’s the answer

The symptom (fast in the morning, collapsing by midday) is burst-credit exhaustion on a 50 GiB file system whose baseline is tiny. Both Provisioned and Elastic throughput would remove the throttling, so the stated constraints decide: the requirement is known and constant, and finance wants a predictable charge. AWS recommends Provisioned throughput for known requirements with a high average-to-peak ratio, and Elastic for spiky, hard-to-forecast load, where pay-per-use wins. Padding the file system works mechanically but bills for junk data. Max I/O is a previous-generation performance mode, set only at creation, that adds latency and does not touch throughput credits.

How to reason it out
  1. Recognize the symptom: good throughput after idle periods that collapses under sustained load means burst credits are draining.
  2. Connect it to configuration: Bursting mode ties baseline throughput to stored size, and 50 GiB is small.
  3. List the real fixes: Provisioned or Elastic throughput both decouple throughput from size.
  4. Apply the constraints: a known, steady rate with a predictable bill points to Provisioned; Elastic suits spiky, unpredictable load.
  5. Reject padding (wasteful) and Max I/O (previous-generation latency trade-off, not a throughput fix).

Exam tip: Small, busy EFS on Bursting throttles: choose Provisioned throughput for a known steady rate, Elastic for spiky or unpredictable load.

High-Performing Storage: S3 vs EBS vs EFS, Volume Types, and Hybrid Options — the lesson that teaches this.

Question 17Design High-Performing Architectures

A media company stores project files on shared storage that Linux EC2 instances in multiple Availability Zones mount concurrently over NFS. Analysis shows most files are rarely touched again 30 days after a project wraps, and storage costs are climbing. The company wants to keep the shared POSIX access model while reducing cost with minimal operational effort. Which combination of actions should a solutions architect take? (Select TWO.)

Choose TWO.

  • a
    Store the files on an Amazon EFS file system mounted by the instances Correct

    EFS provides the managed, multi-AZ, concurrent NFS access the workflow depends on, with capacity that grows automatically.

  • b
    Turn on EFS lifecycle management to move files idle for 30 days to Infrequent Access Correct

    Lifecycle management transitions cold files to the cheaper Infrequent Access class automatically and moves them back on access if configured, with no scripts or migration.

  • c
    Run an NFS server on EC2 backed by st1 volumes for the instances to access

    A self-managed NFS server can serve the fleet, but patching, scaling, capacity planning and AZ resilience all fall on the team.

  • d
    Move the files to Amazon S3 and add a lifecycle rule for files idle for 30 days

    S3 lifecycle tiering cuts cost, but objects behind an HTTP API are not a mounted POSIX file system, so it breaks the access model the instances depend on.

  • e
    Switch the EFS file system to Provisioned throughput sized to the steady load

    Throughput mode controls how throughput is billed, not the per-GB storage price, so it does nothing for the growing volume of cold files and adds a fixed monthly throughput charge.

The concept

EFS answers shared multi-AZ POSIX access, and its lifecycle management answers the cost-optimization variant by automatically moving cold files to an Infrequent Access storage class.

Why that’s the answer

Two requirements, two actions. Shared POSIX access across AZs on Linux is EFS's home ground, so the files belong on EFS. The cost problem is storage cost from cold files, and EFS has a built-in answer: lifecycle management transitions files untouched for a chosen period to Infrequent Access automatically, with no scripts or migration. Changing to Provisioned throughput is the tempting EFS-shaped distractor, but throughput mode changes how throughput is billed, not what each stored GB costs. The self-managed NFS server can serve the fleet, but the team inherits an entire file-server operation. S3 with lifecycle rules is cheap but breaks the access model: the instances mount a file system, and S3 is not mountable POSIX storage.

How to reason it out
  1. Match the access pattern (shared, concurrent, multi-AZ, POSIX on Linux) to EFS.
  2. Identify the cost driver: storage of files that are rarely read after 30 days.
  3. Address it with the managed storage-class feature: lifecycle management to Infrequent Access.
  4. Eliminate Provisioned throughput (a throughput billing choice, not a storage-price one), the self-built NFS server (operational effort) and S3 (breaks mount semantics).

Exam tip: EFS plus lifecycle management to Infrequent Access is the managed answer for shared POSIX storage with aging, rarely accessed files.

High-Performing Storage: S3 vs EBS vs EFS, Volume Types, and Hybrid Options — the lesson that teaches this.

Question 18Design High-Performing Architectures

A company is moving a department file share from an on-premises file server to AWS so that applications on EC2 can use it. Clients map the share as a network drive over SMB, and access is controlled by NTFS permissions granted to groups in the company's Active Directory domain. The company wants a fully managed service. Which service should a solutions architect choose?

Choose one.

  • a
    An Amazon EFS file system mounted by the EC2 instances

    EFS speaks NFS to Linux clients; it does not provide the SMB protocol or Active Directory integration Windows desktops require.

  • b
    An Amazon FSx for Windows File Server file system Correct

    FSx for Windows File Server provides fully managed SMB file shares with NTFS features and native Active Directory integration — a direct match for every stated requirement.

  • c
    An Amazon FSx for Lustre file system linked to S3

    FSx for Lustre is a parallel file system for HPC and machine-learning throughput, not an SMB share for Windows users.

  • d
    An Amazon FSx for OpenZFS file system in Multi-AZ mode

    FSx for OpenZFS serves NFS (v3 and v4.x) with Unix permissions; it does not provide SMB shares or Active Directory-based NTFS permissions.

The concept

FSx questions are close to keyword matching: Windows clients, SMB protocol, and Active Directory all name FSx for Windows File Server.

Why that’s the answer

The scenario stacks the FSx for Windows File Server signals: SMB drive mappings, NTFS permissions and Active Directory groups, with a fully managed requirement. FSx for Windows File Server provides managed SMB shares with NTFS ACLs and native AD integration. EFS is the familiarity trap: it serves NFS to Linux and cannot satisfy SMB or AD. FSx for Lustre is a parallel HPC file system, and FSx for OpenZFS is the near-twin within the FSx family: managed and fast, but NFS-only with Unix permissions.

How to reason it out
  1. List the signals: SMB drive mappings, NTFS permissions, Active Directory groups.
  2. Eliminate NFS-only services: EFS and FSx for OpenZFS.
  3. Eliminate FSx for Lustre: parallel HPC throughput, not a departmental Windows share.
  4. Choose the managed Windows-native file service: FSx for Windows File Server.

Exam tip: Windows, SMB, or Active Directory in a file-share scenario points to FSx for Windows File Server, never EFS.

High-Performing Storage: S3 vs EBS vs EFS, Volume Types, and Hybrid Options — the lesson that teaches this.

Question 19Design High-Performing Architectures

A genomics research team stores petabytes of sequencing data in Amazon S3. For each analysis campaign, a large compute cluster needs to process that data through a POSIX file system at very high parallel throughput for several days, writing results back to S3, after which the file system is no longer needed. Which approach meets the performance requirement MOST cost-effectively?

Choose one.

  • a
    Create a persistent FSx for Lustre file system linked to the S3 bucket and keep it running between campaigns

    Persistent Lustre meets the performance need but pays for replication and continuous uptime that a days-long, disposable processing burst does not require.

  • b
    Mount an Amazon EFS file system and copy the S3 data into it before each campaign

    EFS is general-purpose shared NFS, not a parallel HPC file system, and the manual copy step adds time and cost the Lustre-S3 linkage eliminates.

  • c
    Create a scratch FSx for Lustre file system linked to the S3 bucket for the duration of each campaign Correct

    Lustre delivers extreme parallel throughput with the S3 linkage presenting objects as files, and scratch file systems are the cheaper, non-replicated option built for short-lived processing.

  • d
    Copy the dataset onto large gp3 EBS volumes attached to each cluster node

    Per-node copies of a petabyte-scale dataset are impractical and provide no shared namespace; EBS volumes attach to one instance each.

The concept

Data lake in S3 plus a compute burst needing a fast POSIX file system is FSx for Lustre linked to the bucket; the scratch deployment type answers the MOST cost-effective variant for short-lived jobs.

Why that’s the answer

Lustre is the HPC answer: parallel throughput at cluster scale, and the S3 linkage presents the bucket's objects as files and writes results back — no bulk copy phase. The cost qualifier then splits scratch from persistent: scratch file systems are cheaper and non-replicated, built exactly for a several-day campaign after which the file system is discarded, so persistent Lustre is the workable-but-overpaying distractor. EFS fails the performance class — it is general shared NFS, not a parallel file system for hundreds of concurrent HPC clients — and forces a manual data copy besides. Per-node gp3 copies collapse under petabyte scale and offer no shared namespace at all.

How to reason it out
  1. Spot the HPC signals: massive parallel throughput, POSIX access, large compute cluster.
  2. Choose the service: FSx for Lustre, using its S3 linkage to avoid copying the data lake.
  3. Apply the cost qualifier to deployment type: short-lived, disposable work fits cheaper scratch file systems.
  4. Eliminate persistent Lustre (paying for durability between campaigns), EFS (wrong performance class), and per-node EBS copies (unshared, impractical).

Exam tip: S3 data plus a temporary HPC processing burst equals scratch FSx for Lustre linked to the bucket.

High-Performing Storage: S3 vs EBS vs EFS, Volume Types, and Hybrid Options — the lesson that teaches this.

Question 20Design High-Performing Architectures

Field engineers upload multi-gigabyte survey files to an S3 bucket from remote sites with unreliable internet connections. Uploads frequently fail partway through, and each failure forces the transfer to restart from the beginning. What should a solutions architect recommend to make the uploads more reliable and efficient?

Choose one.

  • a
    Enable S3 Transfer Acceleration on the bucket

    Transfer Acceleration attacks distance by routing through edge locations; it does not change the single-object transfer semantics that make a mid-transfer failure restart the whole upload.

  • b
    Split each file into parts and send it with S3 multipart upload Correct

    Multipart upload splits each object into parts uploaded in parallel, and a failed part retries individually instead of restarting the entire multi-gigabyte transfer.

  • c
    Use byte-range fetches when transferring the files

    Byte-range fetches are the download-side parallelism tool; they do not apply to uploads.

  • d
    Raise the client request timeout and retry the whole upload on failure

    A longer timeout does not survive a dropped connection, and whole-object retries are exactly the wasteful behavior the team wants to eliminate.

The concept

Multipart upload is the S3 tool for large objects: parts upload in parallel and failed parts retry individually, which is decisive on unreliable connections.

Why that’s the answer

The pain is stated precisely — large uploads fail partway and restart from zero. Multipart upload fixes that mechanism: the file is split into parts, each part is an independent transfer, and only a failed part is retried, so an interruption costs one part rather than gigabytes of completed progress. Transfer Acceleration is the tempting sibling, but it solves distance, not resilience — an accelerated single-stream upload still restarts entirely on failure. Byte-range fetches are the mirror-image tool for downloads and simply do not apply. Longer timeouts with whole-object retries treat the symptom while preserving the restart-from-zero cost.

How to reason it out
  1. Name the bottleneck: transfer failure recovery on large objects, not distance or request rate.
  2. Match the tool: multipart upload retries failed parts individually and parallelizes the rest.
  3. Eliminate Transfer Acceleration as a distance optimization that keeps whole-transfer failure semantics.
  4. Eliminate byte-range fetches as download-side, and timeout tweaks as not addressing partial-failure recovery.

Exam tip: Large uploads that fail partway resolve to multipart upload — Transfer Acceleration only helps when distance is the bottleneck.

High-Performing Storage: S3 vs EBS vs EFS, Volume Types, and Hybrid Options — the lesson that teaches this.

Domain 4: Design Cost-Optimized Architectures

20% of the SAA-C03 exam, so 5 of the 25 questions on this page.

Question 21Design Cost-Optimized Architectures

A data pipeline uploads multi-gigabyte objects to an S3 bucket over unreliable network links, and its logs show many uploads that were retried from the beginning. The bucket's versioning status in the S3 console reads Disabled. Finance reports that billed storage far exceeds the total size of the objects shown in listings. Completed objects must be kept for 400 days and then removed. Which TWO lifecycle actions should a solutions architect configure? (Select TWO.)

Choose TWO.

  • a
    An AbortIncompleteMultipartUpload action with DaysAfterInitiation set to 7. Correct

    Uploads that fail and are retried from the start leave their earlier parts behind; those parts are billed but never listed, and this action deletes them 7 days after the upload began.

  • b
    A NoncurrentVersionExpiration action with NoncurrentDays set to 400.

    This deletes only noncurrent versions; a bucket whose status is Disabled has never been versioned, so it has none, and the current objects would be kept forever.

  • c
    An ExpiredObjectDeleteMarker action set to true on the bucket's lifecycle rule.

    Delete markers only exist in buckets that have had versioning enabled, and they take almost no storage, so they cannot explain the gap.

  • d
    A NoncurrentVersionExpiration action with NoncurrentDays set to 1.

    Noncurrent versions are the usual hidden-storage cause in versioned or suspended buckets; Disabled means versioning was never turned on, so there are no noncurrent versions to remove.

  • e
    An Expiration action with Days set to 400. Correct

    Expiration permanently deletes current objects in an unversioned bucket at the set age, which enforces the 400-day removal.

The concept

Incomplete multipart uploads keep their parts, billed as storage, until they are completed or aborted, and those parts never appear in listings. A versioning status of Disabled means the bucket has never been versioned (Suspended means it once was), so it holds no noncurrent versions or delete markers; Expiration is the action that removes current objects.

Why that’s the answer

Two hidden-storage causes fit billed storage exceeding what listings show: noncurrent versions and incomplete multipart upload parts. A Disabled status rules out versions, because only buckets that were once versioned (now Enabled or Suspended) can hold them, and retried multi-gigabyte uploads point at abandoned parts, so AbortIncompleteMultipartUpload is the fix. For the 400-day rule, Expiration deletes current objects; NoncurrentVersionExpiration with the same number of days looks equivalent but touches only noncurrent versions, which this bucket does not have. ExpiredObjectDeleteMarker is likewise a versioned-bucket cleanup.

How to reason it out
  1. List the causes of billed storage that listings do not show: noncurrent versions and incomplete multipart upload parts.
  2. Read the versioning status: Disabled means never versioned, so no noncurrent versions or delete markers exist.
  3. Add AbortIncompleteMultipartUpload for the parts left by failed, retried uploads.
  4. Use Expiration, not NoncurrentVersionExpiration, to delete current objects at 400 days.

Exam tip: Disabled means never versioned: hidden storage there is abandoned multipart parts, and only Expiration removes current objects.

Cost-Optimized Storage: S3 Classes, Lifecycle Policies, and EBS Economics — the lesson that teaches this.

Question 22Design Cost-Optimized Architectures

A photo-sharing application keeps original images in one S3 bucket and generated thumbnails in another. Thumbnails are viewed infrequently after the first month but must display in milliseconds, and the application can regenerate any thumbnail from its original on demand. Which class for the aged thumbnails is MOST cost-effective?

Choose one.

  • a
    S3 Standard-IA

    It works but pays for multi-AZ resilience the data does not need, since any lost thumbnail can be regenerated from its original.

  • b
    S3 Glacier Flexible Retrieval

    Asynchronous restores in minutes to hours violate the millisecond display requirement.

  • c
    S3 Standard

    It is the most expensive class per GB and infrequently viewed thumbnails do not need its zero-retrieval-fee economics.

  • d
    S3 One Zone-IA Correct

    Thumbnails are re-creatable from the originals, so single-AZ durability is acceptable, and One Zone-IA is cheaper than Standard-IA while keeping millisecond access.

The concept

S3 One Zone-IA prices below Standard-IA by storing data in a single Availability Zone; it is only correct when the data is re-creatable or a secondary copy, because it does not survive the loss of that AZ.

Why that’s the answer

The scenario grants the exact license One Zone-IA requires: thumbnails can be regenerated from originals stored elsewhere, so losing an AZ costs regeneration compute, not data. With infrequent access and a millisecond display requirement, One Zone-IA is the cheapest class that satisfies both. Standard-IA over-delivers multi-AZ durability for data that is disposable by design, so a cheaper sufficient option beats it. Glacier Flexible Retrieval fails the millisecond requirement outright. Standard meets everything but is the priciest per GB, and at infrequent access its lack of retrieval fees does not compensate.

How to reason it out
  1. Confirm the data is re-creatable: thumbnails regenerate from originals in another bucket.
  2. Confirm the access pattern: infrequent views that must still be millisecond-fast.
  3. Eliminate asynchronous Glacier tiers on the latency requirement.
  4. Choose One Zone-IA over Standard-IA because single-AZ durability is acceptable for disposable data and it costs less.

Exam tip: One Zone-IA is only for re-creatable or secondary-copy data, and for exactly that data it beats Standard-IA.

Cost-Optimized Storage: S3 Classes, Lifecycle Policies, and EBS Economics — the lesson that teaches this.

Question 23Design Cost-Optimized Architectures

A company runs databases on Amazon EC2 with dozens of 1 TB gp2 volumes. Each volume stores less than 250 GB, but the volumes were sized at 1 TB because each database needs a sustained 3,000 IOPS. A short maintenance window per database is acceptable. Which change reduces EBS costs the MOST while keeping the required performance?

Choose one.

  • a
    Move each database to a new 300 GB io2 volume provisioned with 3,000 IOPS.

    io2 meets the performance, but it charges for every provisioned IOPS on top of a higher per-GB price, so it costs more than gp3, which includes 3,000 IOPS at no extra charge.

  • b
    Move each database to a new 300 GB gp3 volume with its default IOPS setting. Correct

    Every gp3 volume includes a 3,000 IOPS and 125 MiB/s baseline regardless of size, so a right-sized volume keeps the performance at a lower per-GB price on less than a third of the capacity.

  • c
    Move each database to a new 300 GB gp2 volume with its default IOPS setting.

    gp2 gives a baseline of 3 IOPS per GB, so a 300 GB volume sustains only 900 IOPS; it can burst above that only while burst credits last.

  • d
    Change each 1 TB volume to gp3 in place with Elastic Volumes, keeping its size.

    This lowers the per-GB price with no downtime, but keeps paying for 1 TB per volume; Elastic Volumes can increase size but never shrink it, so right-sizing needs a new, smaller volume.

The concept

gp2 performance scales with size (3 IOPS per GB), which led teams to oversize volumes to buy IOPS. gp3 includes 3,000 IOPS and 125 MiB/s at any size, so the data size alone sets the volume size. Elastic Volumes can change type and grow a volume online but cannot shrink it.

Why that’s the answer

Two facts combine. First, gp3 gives 3,000 IOPS at any size, so the 1 TB sizing existed only because of gp2, and a gp3 volume sized to the data meets the requirement. Second, EBS volumes cannot be shrunk, so reaching the smaller size means copying the data to a new volume, which the maintenance window allows. Converting in place to gp3 is the tempting answer because it is online and cheaper, but it keeps paying for about 700 GB per volume that holds nothing. A small gp2 volume drops to 900 IOPS baseline. io2 meets performance but adds a per-IOPS charge that gp3 does not have.

How to reason it out
  1. Find why the volumes are oversized: gp2 ties IOPS to size, so 1 TB was bought to get 3,000 IOPS.
  2. Recall that gp3 includes 3,000 IOPS at any size, so the data size sets the volume size.
  3. Recall that Elastic Volumes cannot shrink a volume, so a smaller size needs a new volume and a data copy.
  4. Use the maintenance window for the copy, and reject io2, which pays extra for IOPS that gp3 includes.

Exam tip: gp3 decouples IOPS from size; EBS volumes only grow, so right-sizing down means a new, smaller volume.

Cost-Optimized Storage: S3 Classes, Lifecycle Policies, and EBS Economics — the lesson that teaches this.

Question 24Design Cost-Optimized Architectures

A cost audit finds dozens of Amazon EBS volumes in the available state, left behind by EC2 instances that were terminated over the past year. Nobody is certain whether any of the volumes still holds data the business needs. What is the MOST cost-effective way to handle these volumes?

Choose one.

  • a
    Delete the volumes now, because their instances have already been terminated.

    This is the cheapest action but it breaks the stated uncertainty: if a volume did hold needed data, it would be lost with no way to recover it.

  • b
    Keep the volumes and add a Data Lifecycle Manager policy that snapshots them daily.

    The volumes keep billing for their full provisioned size, and the daily snapshots add storage cost on top; nothing is saved.

  • c
    Attach the volumes to a small utility instance so that they are no longer unattached.

    EBS bills for provisioned capacity whether a volume is attached or not, so attaching them changes nothing except adding an instance to pay for.

  • d
    Create a snapshot of each volume, then delete the volumes. Correct

    Snapshots are billed only for the data actually stored and preserve every volume so it can be restored later, while deleting the volumes stops the provisioned-capacity charges.

The concept

EBS volumes are billed for provisioned capacity whether or not they are attached. Snapshots are billed only for the data they hold and can be restored to a new volume at any time.

Why that’s the answer

Available-state volumes keep billing for their full provisioned size. When nobody knows whether the data matters, deleting outright is too risky, and keeping or attaching the volumes saves nothing. Snapshotting first keeps a recoverable copy at the lower snapshot rate on only the used data, and deleting the volumes then stops the provisioned-capacity charge.

How to reason it out
  1. Recall that EBS bills provisioned capacity, attached or not.
  2. Keep a recoverable copy because the data might still be needed.
  3. Use snapshots, which bill only for stored data, as that copy.
  4. Delete the volumes to stop the provisioned-capacity charge.

Exam tip: Unattached EBS volumes still bill in full; snapshot them and delete the volumes when the data might still matter.

Cost-Optimized Storage: S3 Classes, Lifecycle Policies, and EBS Economics — the lesson that teaches this.

Question 25Design Cost-Optimized Architectures

A company has accumulated thousands of manual Amazon EBS snapshots over several years: daily snapshots plus one snapshot taken at each month-end. Compliance requires only the month-end snapshots to be retained, for 5 years, and they are almost never restored. Daily snapshots are needed for 14 days. Which TWO actions reduce snapshot storage costs while meeting the compliance requirement? (Select TWO.)

Choose TWO.

  • a
    Delete the daily snapshots older than 14 days, and use Amazon Data Lifecycle Manager to manage retention of new snapshots. Correct

    Deleting an older incremental snapshot is safe because AWS keeps any blocks that newer snapshots still reference, and DLM then applies the retention automatically to the snapshots it creates.

  • b
    Move the month-end snapshots that are older than 90 days to the EBS Snapshots Archive tier. Correct

    The archive tier stores rarely restored, long-retention snapshots at a much lower price, accepting restores that take up to 72 hours and a 90-day minimum.

  • c
    Keep the daily snapshots older than 14 days in place, because newer incremental snapshots reference their blocks.

    This is the misconception: when an older snapshot is deleted, AWS preserves any blocks a newer snapshot needs, so the remaining snapshots still restore correctly.

  • d
    Copy the month-end snapshots to a second Amazon Web Services Region, then delete the originals.

    The copies cost the same to store in the other Region, and the copy adds data transfer charges; nothing in the requirement calls for another Region.

  • e
    Move the daily and month-end snapshots alike to the Amazon EBS Snapshots Archive tier as soon as they are created.

    Archived snapshots are stored in full rather than incrementally, carry a 90-day minimum and take hours to restore, so short-lived daily snapshots would cost more and could not be restored quickly.

The concept

EBS snapshots are incremental, but deleting an older one is safe because AWS preserves the blocks newer snapshots reference. Data Lifecycle Manager automates retention only for the snapshots it creates. The EBS Snapshots Archive tier stores full snapshots at a much lower price, with a 90-day minimum and restores that take up to 72 hours.

Why that’s the answer

Two changes capture the savings. The daily snapshots beyond 14 days are not required, and deleting them is safe because AWS keeps any blocks newer snapshots depend on; DLM then enforces the policy going forward (it cannot manage the existing manual snapshots, which is why the backlog is deleted directly). The month-end snapshots match the archive tier exactly: kept for years and almost never restored. Archiving everything is the tempting near-twin, but the archive stores each snapshot in full with a 90-day minimum, which makes short-lived daily snapshots more expensive, not less. Keeping old snapshots because they are incremental is the misconception, and a cross-Region copy only adds cost.

How to reason it out
  1. Separate the snapshots by requirement: daily ones for 14 days, month-end ones for 5 years.
  2. Delete the unneeded daily snapshots, which is safe because AWS preserves blocks that newer snapshots reference.
  3. Automate retention for new snapshots with Data Lifecycle Manager.
  4. Archive only the long-retention, rarely restored month-end snapshots, because the archive tier stores full snapshots with a 90-day minimum.

Exam tip: Prune old incremental snapshots safely, automate retention with DLM, and archive only snapshots kept for months and rarely restored.

Cost-Optimized Storage: S3 Classes, Lifecycle Policies, and EBS Economics — the lesson that teaches this.

Keep going with SAA-C03

SAA-C03 practice by domain

SAA-C03 sample questions: your questions

No. Real exam questions are confidential. These are original questions written to the skills in the official SAA-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 SAA-C03 exam guide.