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

DVA-C03 sample questions — 25 answered and explained

25 DVA-C03 sample questions written to the official AWS Certified Developer – Associate (DVA-C03) 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 DVA-C03 practice pages.

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

Domain 1: Development with AWS Services

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

Question 1Development with AWS Services

A payment worker reads orders from an Amazon SQS standard queue and charges each customer through a third-party API. A few customers are charged twice. Logs show the same message processed twice: sometimes after a slow payment call exceeded the visibility timeout, and occasionally when processing was fast. Which change prevents duplicate charges in both cases?

Choose one.

  • a
    Raise the queue's visibility timeout to well above the longest payment call, and keep the worker unchanged

    This removes the duplicates caused by slow calls, but a standard queue still delivers some messages more than once, which explains the fast-processing duplicates.

  • b
    Record each order ID in DynamoDB with a conditional write before charging, and skip IDs already recorded Correct

    An idempotency check makes a repeated delivery harmless, whatever caused it: the second attempt finds the order ID and does not charge again.

  • c
    Move the orders to a FIFO queue with content-based deduplication, and keep the worker code unchanged

    FIFO deduplication drops duplicate sends within a five-minute window. A message whose visibility timeout expires is still delivered again to a consumer.

  • d
    Turn on long polling with a 20-second receive wait time, and delete each message as soon as it is read

    Long polling reduces empty receives, and deleting before charging risks losing the order if the worker fails mid-payment.

The concept

At-least-once delivery means consumers that cause side effects must be idempotent.

Why that’s the answer

There are two causes of duplicates. A visibility timeout shorter than processing makes the message reappear, and SQS standard queues deliver at least once, so a message can occasionally arrive twice anyway. Only an idempotency check on a business key covers both causes. A longer visibility timeout fixes only the first cause. FIFO deduplication works on sends, not on redelivery after a timeout. Deleting first trades duplicates for lost orders.

How to reason it out
  1. List each cause of duplicates the logs reveal.
  2. Recall that standard queues guarantee at-least-once, not exactly-once, delivery.
  3. Check whether each option removes both causes or only one.
  4. Prefer a check on a business key (the order ID) before the side effect.

Exam tip: With at-least-once delivery, make the side effect idempotent; queue settings alone cannot prevent every duplicate.

DVA-C03 Application Development: Decoupling, APIs, SDKs, Events, Streams and AI — the lesson that teaches this.

Question 2Development with AWS Services

A product page calls a recommendation service while it renders. When the recommendation service is slow or failing, the whole page waits and then returns HTTP 500, even though the product details are available. The business wants the page to load quickly in that situation and show a generic best-sellers list instead of personalised recommendations. Which TWO changes should the developer make? (Select TWO.)

Choose TWO.

  • a
    Retry the recommendation service call with backoff until the call succeeds

    Retrying until success makes the page wait even longer during an outage, the opposite of loading quickly.

  • b
    Return HTTP 503 with a Retry-After header when the recommendation service fails

    This tells the client to come back later and still fails the page, although product details are available.

  • c
    Raise the page's server timeout so the slow recommendation service call can complete

    Waiting longer for a failing dependency increases latency and does not provide a result when the service is down.

  • d
    Set a short client timeout on the call to the recommendation service Correct

    A short timeout stops a slow dependency from holding the whole page hostage, so the page can move on quickly.

  • e
    Serve cached default recommendations when the recommendation call fails Correct

    A fallback keeps the page useful while one non-essential feature is unavailable, which is graceful degradation.

The concept

Graceful degradation: bound the wait on a non-critical dependency and fall back to a reduced result.

Why that’s the answer

The core feature (product details) works; only an optional feature fails. Graceful degradation means the core feature keeps working with reduced functionality. Two pieces are needed: a short timeout so the page does not wait, and a fallback (a cached generic list) so the page still shows something useful. Retrying until success and raising timeouts both lengthen the wait, and returning 503 fails a page that could have been served.

How to reason it out
  1. Decide which dependency is essential and which is optional.
  2. Bound the time spent on the optional dependency.
  3. Provide a reduced but useful result when it fails.
  4. Reject options that wait longer or fail the whole page.

Exam tip: When an optional dependency fails, time out quickly and serve a fallback.

DVA-C03 Application Development: Decoupling, APIs, SDKs, Events, Streams and AI — the lesson that teaches this.

Question 3Development with AWS Services

A REST API in Amazon API Gateway has a POST /orders method backed by a Lambda function. Clients sometimes send bodies that are missing required fields, and the function spends time rejecting them. The team wants API Gateway to reject these requests with HTTP 400 before the function is invoked, without writing code. What should the developer configure on the method?

Choose one.

  • a
    A model written in JSON Schema and a request validator that validates the body Correct

    API Gateway checks the body against the model and returns 400 for invalid requests without invoking the integration.

  • b
    A mapping template in the integration request that drops the missing fields

    Mapping templates transform requests that are passed to the backend; they do not reject a request as invalid.

  • c
    A Lambda authorizer of the REQUEST type that inspects the body for the fields

    A REQUEST authorizer receives headers, query strings, path and stage variables, not the body, and it is code to write.

  • d
    An AWS WAF rule on the stage that blocks bodies that lack the required fields

    WAF can match strings in a body but cannot validate it against a schema of required fields, and a blocked request returns 403 by default.

The concept

API Gateway REST API request validation with JSON Schema models.

Why that’s the answer

API Gateway REST APIs can validate the request body against a model (a JSON Schema) and required parameters before calling the backend. Invalid requests are rejected with 400, and the backend never runs. Mapping templates transform, authorizers decide on identity and do not see the body, and WAF inspects patterns rather than schemas.

How to reason it out
  1. Identify the requirement: reject malformed bodies in API Gateway, no code.
  2. Recall that a request validator plus a model validates bodies against JSON Schema.
  3. Rule out features built for transformation, authorization or traffic filtering.

Exam tip: Reject bad request bodies at the edge with a model plus a request validator.

DVA-C03 Application Development: Decoupling, APIs, SDKs, Events, Streams and AI — the lesson that teaches this.

Question 4Development with AWS Services

A team is evaluating moving a public API from an Amazon API Gateway REST API to an HTTP API to cut costs. The current API relies on request validators and JSON Schema models to reject invalid bodies before the Lambda backend runs. The team must keep rejecting invalid bodies before the backend runs, and does not want to add validation code. What should the team do?

Choose one.

  • a
    Stay on the REST API and keep its request validators and its models Correct

    Request body validation against models is a REST API feature. HTTP APIs do not offer it, so staying on REST keeps the behavior without code.

  • b
    Move to an HTTP API and attach the REST API's models and validators to its routes

    HTTP APIs do not support models or request validation, so there is nothing to attach the schemas to.

  • c
    Move to an HTTP API and use parameter mapping to keep the request fields required

    Parameter mapping changes headers, query strings and paths sent to the backend; it does not validate a request body.

  • d
    Move to an HTTP API and add a JWT authorizer that checks each request's body fields

    A JWT authorizer validates a token's signature and claims. It has nothing to do with the contents of the request body.

The concept

REST APIs vs HTTP APIs: request validation is available only on REST APIs.

Why that’s the answer

HTTP APIs are cheaper and simpler, but they leave out several REST API features, including request validation with models. Because the team must keep pre-backend validation without writing code, the REST API is the only option that meets the constraint. Parameter mapping and JWT authorizers are real HTTP API features, but neither validates a body.

How to reason it out
  1. List the feature the team depends on: request body validation.
  2. Recall which API type supports it: REST APIs only.
  3. Check whether any HTTP API feature can replace it without code: none does.
  4. Let the no-code constraint decide.

Exam tip: Need request validation in API Gateway with no code? That is a REST API feature.

DVA-C03 Application Development: Decoupling, APIs, SDKs, Events, Streams and AI — the lesson that teaches this.

Question 5Development with AWS Services

A REST API in Amazon API Gateway fronts a legacy HTTP backend. Clients send {"customerId": "..."}, but the backend expects {"customer_id": "..."} and returns internal fields that clients must not see. Neither the clients nor the backend can be changed, and the team wants no extra compute. How should the developer configure the integration?

Choose one.

  • a
    An HTTP custom (non-proxy) integration with request and response mapping templates Correct

    In a non-proxy integration, mapping templates rewrite the request before it reaches the backend and reshape the response before it reaches the client.

  • b
    An HTTP proxy integration with request and response mapping templates on the method

    Proxy integrations pass the request and response through as they are; integration mapping templates do not apply to them.

  • c
    An HTTP custom (non-proxy) integration with a request validator and a response model

    Validators and models check that data matches a schema; they do not rename fields or remove them.

  • d
    A Lambda proxy integration with a function that renames and filters the fields

    This works but adds a function to build and run, which the team wants to avoid.

The concept

API Gateway data transformation: mapping templates in non-proxy integrations.

Why that’s the answer

Renaming request fields and removing response fields is data transformation, which API Gateway does with VTL mapping templates in the integration request and integration response. Those templates exist only for non-proxy (custom) integrations; proxy integrations deliberately pass everything through. A Lambda function could transform the data, but it adds compute.

How to reason it out
  1. Recognise the task as transformation in both directions.
  2. Recall that mapping templates transform requests and responses.
  3. Recall that mapping templates apply only to non-proxy integrations.
  4. Use the no-extra-compute constraint to rule out the Lambda option.

Exam tip: Transform in API Gateway with mapping templates, and only on a non-proxy integration.

DVA-C03 Application Development: Decoupling, APIs, SDKs, Events, Streams and AI — the lesson that teaches this.

Question 6Development with AWS Services

A developer wants a POST /events method on an Amazon API Gateway REST API to place each request's raw JSON body on an Amazon SQS queue as one message. The design must not use Lambda. The developer creates an AWS service integration for SQS that calls the SendMessage action. Which TWO additional items are required? (Select TWO.)

Choose TWO.

  • a
    An IAM role that API Gateway assumes, allowing sqs:SendMessage on the queue Correct

    An AWS service integration calls SQS with credentials. The integration's execution role must allow sqs:SendMessage on that queue.

  • b
    An integration request mapping template that builds the SendMessage request from the body Correct

    SendMessage needs a MessageBody parameter (form-encoded Action=SendMessage&MessageBody=..., or the AWS JSON protocol), so a template must map the raw body into it.

  • c
    A queue policy that allows the API Gateway execute-api ARN to call sqs:SendMessage

    The execute-api ARN identifies the API for callers invoking it. SQS authorizes the integration's credentials, which come from the role it is configured with.

  • d
    A request validator on the integration that converts the JSON body into SendMessage parameters

    Request validators only check requests against models or required parameters; they never transform a request.

  • e
    A VPC link from API Gateway to an interface VPC endpoint for Amazon SQS

    VPC links reach private resources in a VPC. API Gateway calls the public SQS API directly in an AWS service integration.

The concept

API Gateway AWS service integrations: credentials plus request mapping.

Why that’s the answer

A direct service integration needs two things that a Lambda proxy integration would otherwise hide. First, credentials: API Gateway assumes the integration's IAM role, which must allow sqs:SendMessage. Second, a request in the shape the service expects: SendMessage takes a MessageBody parameter, so an integration request mapping template wraps the raw JSON body into it, for example as form-encoded Action=SendMessage&MessageBody=... with Content-Type application/x-www-form-urlencoded (SQS also accepts the AWS JSON protocol, which still needs the body mapped into MessageBody). Validators cannot transform, and no VPC link is needed for a public AWS endpoint.

How to reason it out
  1. Ask how API Gateway gets permission to call SQS: an IAM role on the integration.
  2. Ask whether SQS accepts the raw JSON body as is: no, the body must be mapped into the MessageBody parameter.
  3. Recall that mapping templates, not validators, transform the request.
  4. Reject network components that the public SQS endpoint does not need.

Exam tip: API Gateway to an AWS service needs a role to call it and a mapping template to speak its API.

DVA-C03 Application Development: Decoupling, APIs, SDKs, Events, Streams and AI — the lesson that teaches this.

Question 7Development with AWS Services

A clickstream application writes to an Amazon Kinesis data stream that has 10 shards. Producers use the event type as the partition key, and there are only three event types. Producers receive ProvisionedThroughputExceededException errors, although the total write rate is well below the capacity of 10 shards. What should the developer do?

Choose one.

  • a
    Use a high-cardinality partition key, such as the session ID, for the records Correct

    Many distinct keys spread records across all shards, so no single shard exceeds its write limit.

  • b
    Double the number of shards in the stream by calling the UpdateShardCount API

    With only three distinct partition keys, records still land on at most three shards, which remain hot.

  • c
    Send records with PutRecord calls instead of using the batched PutRecords API

    The API used does not change which shard a record goes to; per-shard limits are still exceeded.

  • d
    Turn on enhanced fan-out for the consumer applications that read the stream

    Enhanced fan-out raises read throughput for consumers. The errors are on the write side.

The concept

Kinesis partition keys decide shard placement; low-cardinality keys create hot shards.

Why that’s the answer

Kinesis hashes the partition key to choose a shard, and each shard has its own write capacity. Three keys can use at most three shards, so those shards are throttled while the other seven are idle. A key with many distinct values spreads the load. Adding shards is the tempting answer, but extra shards stay unused while the keys do not change.

How to reason it out
  1. Compare the total write rate with stream capacity: well below.
  2. Conclude that the load is concentrated on a few shards.
  3. Trace the cause to a partition key with only three values.
  4. Fix the key, not the shard count.

Exam tip: Throttled below total capacity means hot shards; give the stream a partition key with many distinct values.

DVA-C03 Application Development: Decoupling, APIs, SDKs, Events, Streams and AI — the lesson that teaches this.

Question 8Development with AWS Services

IoT devices write telemetry to an Amazon Kinesis data stream. A Lambda function consumes it through an event source mapping. Records from each device must be processed in the order they were written. During peaks the function falls behind, and the team wants more concurrent processing without adding shards. Which combination of actions meets these requirements? (Select TWO.)

Choose TWO.

  • a
    Use a random UUID as the partition key so each device's records spread evenly

    Records from one device would be spread across shards, so their relative order would be lost.

  • b
    Use the device ID as the partition key when producers write each record Correct

    All records for one device go to the same shard in write order, which is the basis for per-device ordering.

  • c
    Set the event source mapping's batch size to one record to cut processing time

    Smaller batches mean more invocations per record and do not add concurrency per shard, so the function falls further behind.

  • d
    Increase the parallelization factor on the Lambda event source mapping Correct

    Lambda then processes several batches from each shard at once while keeping records with the same partition key in order.

  • e
    Replace the stream with an SQS standard queue that devices write to, with a Lambda trigger

    A standard queue offers best-effort ordering only, so per-device order is not guaranteed.

The concept

Kinesis ordering is per partition key within a shard; parallelization factor adds concurrency without breaking it.

Why that’s the answer

Two facts must be combined. Ordering in Kinesis exists only within a shard, so all of a device's records must share a partition key (the device ID). Lambda's parallelization factor lets one shard be processed by several concurrent batches while still keeping records with the same partition key in order. That increases throughput without adding shards. Random keys and standard queues break ordering, and a batch size of one lowers throughput.

How to reason it out
  1. Secure the ordering requirement: one partition key per device.
  2. Find a way to add concurrency per shard without new shards.
  3. Recall that parallelization factor preserves order per partition key.
  4. Reject options that break ordering or reduce throughput.

Exam tip: Order by partition key; scale a shard's consumer with the parallelization factor.

DVA-C03 Application Development: Decoupling, APIs, SDKs, Events, Streams and AI — the lesson that teaches this.

Domain 2: Security

26% of the DVA-C03 exam, so 7 of the 25 questions on this page.

Question 9Security

A mobile app writes to an Amazon DynamoDB table directly with temporary credentials from an Amazon Cognito identity pool. The table's partition key, userId, holds each user's Cognito identity ID. A security review found that the authenticated role allows dynamodb:PutItem and dynamodb:Query on the whole table. Each user must be able to read and write only their own items. What should the developer add to the role's policy?

Choose one.

  • a
    A dynamodb:LeadingKeys condition that equals ${cognito-identity.amazonaws.com:sub} Correct

    LeadingKeys restricts which partition key values a request may touch, and the policy variable resolves to the caller's identity ID, so each user reaches only their own items.

  • b
    A dynamodb:Attributes condition that lists userId together with the user's other attribute names

    The Attributes condition limits which attributes a request can read or write. It does not limit which items, so users could still reach other users' rows.

  • c
    A dynamodb:LeadingKeys condition that equals ${aws:username} for the signed-in user

    aws:username exists only for IAM users. A Cognito identity uses an assumed-role session, so the variable does not resolve to the identity ID.

  • d
    A dynamodb:Select condition that limits Query results to the user's own projected attributes

    dynamodb:Select controls which attributes a Query or Scan returns. It does not limit items to the caller's partition key.

The concept

DynamoDB fine-grained access control limits items by partition key with dynamodb:LeadingKeys and a policy variable for the caller.

Why that’s the answer

The goal is row-level isolation by partition key. dynamodb:LeadingKeys compares the partition key in each request with a value in the policy, and ${cognito-identity.amazonaws.com:sub} resolves to the calling identity's ID, which is exactly what the table stores. The Attributes and Select keys limit attributes, not items, and aws:username is not defined for federated role sessions.

How to reason it out
  1. Identify that isolation is per item, keyed by the partition key.
  2. Choose the condition key that restricts partition key values.
  3. Choose the policy variable that holds the Cognito identity ID.
  4. Reject keys that only limit attributes.

Exam tip: Per-user DynamoDB rows: LeadingKeys plus ${cognito-identity.amazonaws.com:sub}.

DVA-C03 Authentication and Authorization: IAM, Cognito, STS and Signed URLs — the lesson that teaches this.

Question 10Security

Users sign in through an Amazon Cognito user pool, and the app gets S3 credentials from an identity pool. The app uploads each file to uploads/<sub>/<file>, where <sub> is the sub claim read from the user's ID token. The authenticated role allows s3:PutObject on arn:aws:s3:::app-data/uploads/${cognito-identity.amazonaws.com:sub}/*. Every upload fails with AccessDenied. What should the developer do?

Choose one.

  • a
    Build the key prefix from the identity ID that the identity pool returns instead of the ID token's sub claim Correct

    The policy variable resolves to the caller's identity pool identity ID, which is a different value from the user pool's sub claim, so keys must use the identity ID.

  • b
    Build the key prefix from the user pool username in the ID token instead of the ID token's sub claim

    The username is not the value the policy variable resolves to either, so the resource still does not match.

  • c
    Change the policy resource to use ${aws:userid} so that it resolves to the ID token's sub claim

    For an assumed-role session, aws:userid is the role ID plus the session name. It does not contain the user pool sub claim.

  • d
    Add s3:PutObjectAcl on the same uploads/ prefix to the authenticated role alongside the existing s3:PutObject permission

    The app does not set ACLs, so this permission is irrelevant. The denial comes from the key not matching the policy resource.

The concept

${cognito-identity.amazonaws.com:sub} is the identity pool's identity ID, not the user pool user's sub.

Why that’s the answer

Two Cognito identifiers are easy to confuse. The user pool sub claim identifies the user in the directory, while the identity pool assigns its own identity ID (region:GUID) to each federated identity. The IAM policy variable ${cognito-identity.amazonaws.com:sub} resolves to that identity ID. Because the app writes under the user pool sub, no key ever matches the allowed resource. Using the identity ID returned by GetId (or by the credentials call) as the prefix fixes it. Usernames and aws:userid don't resolve to the right value, and ACL permissions are unrelated.

How to reason it out
  1. Read what value the app puts in the key: the user pool sub claim.
  2. Recall what the policy variable resolves to: the identity pool identity ID.
  3. See that the two never match, so every request is denied.
  4. Align the key prefix with the policy variable.

Exam tip: In identity-pool policies, cognito-identity.amazonaws.com:sub is the identity ID; key your data by it.

DVA-C03 Authentication and Authorization: IAM, Cognito, STS and Signed URLs — the lesson that teaches this.

Question 11Security

A developer's IAM user has a policy that denies all actions unless the request was authenticated with MFA. The developer has an MFA device registered and runs AWS CLI commands with the user's access key from the default profile, but every command now returns AccessDenied. The developer must keep using the CLI. What should the developer do?

Choose one.

  • a
    Call aws sts get-session-token without MFA parameters, then use the returned temporary credentials for the commands

    Temporary credentials obtained without MFA carry aws:MultiFactorAuthPresent false, so the deny still applies.

  • b
    Call aws sts get-session-token with the MFA device's serial number and current code, then use the returned credentials Correct

    GetSessionToken with MFA parameters returns temporary credentials whose requests carry MFA context, which satisfies the policy.

  • c
    Add mfa_serial to the default profile that holds the access key and rerun the commands with that key

    In the CLI config, mfa_serial is used when a profile assumes a role. A profile with only an access key keeps signing requests with the long-term key and no MFA.

  • d
    Call aws sts get-caller-identity with the MFA device's serial number and current code, then rerun the commands

    GetCallerIdentity only reports who is calling. It does not take MFA parameters or return credentials.

The concept

To use MFA from the CLI or SDK, exchange the long-term key plus an MFA code for temporary credentials.

Why that’s the answer

Requests signed directly with an access key cannot include MFA. The way to add it is to call GetSessionToken (or AssumeRole) with SerialNumber and TokenCode, which returns temporary credentials whose requests include MFA context. Calling it without MFA produces credentials that still fail the condition. mfa_serial only prompts for a code in a role-assuming profile, and GetCallerIdentity returns no credentials.

How to reason it out
  1. Recognise that long-term access keys alone cannot prove MFA.
  2. Find the STS call that accepts an MFA code and returns credentials.
  3. Use those temporary credentials for the CLI commands.
  4. Reject calls that skip the MFA parameters.

Exam tip: MFA for API calls arrives through STS: GetSessionToken or AssumeRole with SerialNumber and TokenCode.

DVA-C03 Authentication and Authorization: IAM, Cognito, STS and Signed URLs — the lesson that teaches this.

Question 12Security

A developer wrote a policy statement to block API calls made without MFA:{ "Effect": "Deny", "Action": "*", "Resource": "*", "Condition": { "Bool": {"aws:MultiFactorAuthPresent": "false"} } }Testing shows that CLI calls signed with a long-term access key still succeed. Which condition block should replace the existing one?

Choose one.

  • a
    "BoolIfExists": {"aws:MultiFactorAuthPresent": "true"}

    On a Deny statement this matches when the key is true or missing, so it blocks MFA sessions and long-term key calls while letting temporary sessions created without MFA through.

  • b
    "BoolIfExists": {"aws:MultiFactorAuthPresent": "false"} Correct

    Requests signed with a long-term access key carry no aws:MultiFactorAuthPresent key. BoolIfExists also matches when the key is missing, so those calls are denied too.

  • c
    "Null": {"aws:MultiFactorAuthPresent": "true"}

    This matches only when the key is missing, so long-term key calls are denied, but temporary sessions created without MFA carry the key as false and still get through.

  • d
    "NumericLessThan": {"aws:MultiFactorAuthAge": "3600"}

    This denies sessions that used MFA within the last hour. The key is missing on long-term key requests, so those calls still succeed.

The concept

aws:MultiFactorAuthPresent is absent, not false, on requests signed with long-term access keys.

Why that’s the answer

A Bool condition only matches when the key exists and equals the value. Requests made with long-term access keys do not include aws:MultiFactorAuthPresent at all, so the original Deny never matches them. BoolIfExists treats a missing key as a match, so the statement denies both requests without the key and temporary sessions created without MFA, where the key is false. A Null check on the key catches only the long-term key calls, the "true" form denies the MFA users instead, and a MultiFactorAuthAge comparison ignores requests where the key is missing.

How to reason it out
  1. Ask whether the key exists on a long-term access key request: it does not.
  2. Recall that Bool does not match a missing key.
  3. Use the IfExists form so a missing key also triggers the Deny.
  4. Check that MFA sessions (key true) are still allowed.

Exam tip: To require MFA with a Deny, use BoolIfExists on aws:MultiFactorAuthPresent = false.

DVA-C03 Authentication and Authorization: IAM, Cognito, STS and Signed URLs — the lesson that teaches this.

Question 13Security

A developer is deploying a Python application to Amazon EC2 instances. The application uses the AWS SDK for Python (Boto3) to read and write objects in an Amazon S3 bucket. Company policy prohibits storing long-term AWS credentials on servers or in source code. How should the developer give the application access to the bucket?

Choose one.

  • a
    Add a bucket policy that grants the S3 permissions to the EC2 instance IDs as principals

    EC2 instance IDs are not IAM principals, so a bucket policy cannot name them, and the SDK still needs credentials to sign each request.

  • b
    Attach an IAM role with the S3 permissions to the instances through an instance profile Correct

    The SDK's default credential chain fetches the role's temporary credentials from instance metadata and refreshes them automatically. Nothing long-term is stored.

  • c
    Store an IAM user's access key in AWS Secrets Manager and read it when the app starts

    The application still runs with a long-term access key, and the instances need credentials of their own just to read the secret.

  • d
    Put an IAM user's access key in an encrypted application settings file that the code decrypts at startup

    Encryption protects the key at rest, but it is still a long-term credential deployed with the application.

The concept

Applications on AWS compute get temporary credentials from the role attached to that compute, and the SDK finds them automatically.

Why that’s the answer

An instance profile delivers a role's temporary credentials through the instance metadata service, and the SDK's default credential provider chain picks them up and refreshes them without any code changes. Keys kept in Secrets Manager or an encrypted file are still long-term IAM user keys, and a bucket policy cannot name an EC2 instance as a principal, so the SDK would have nothing to sign with.

How to reason it out
  1. Note the constraint: no long-term credentials on servers or in code.
  2. Recall how EC2 provides temporary credentials: an instance profile role.
  3. Confirm the SDK finds role credentials without configuration.
  4. Reject options that store an access key or try to grant access to the instance itself.

Exam tip: On EC2, use an instance profile role, never access keys.

DVA-C03 Authentication and Authorization: IAM, Cognito, STS and Signed URLs — the lesson that teaches this.

Question 14Security

An application on an Amazon EC2 instance uses the AWS SDK and an instance profile role that allows s3:GetObject on a bucket. Calls fail with AccessDenied, and the error names arn:aws:iam::111122223333:user/build-bot as the caller instead of the role. The instance's startup script was copied from an old build server. What should the developer do?

Choose one.

  • a
    Add s3:GetObject on the bucket to the instance profile role and restart the application

    The role already has the permission. The requests are not signed with the role, so changing its policy has no effect.

  • b
    Remove the AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY exports from the startup script Correct

    Environment variables come before instance metadata in the SDK's default credential chain, so the copied keys for build-bot are used instead of the role.

  • c
    Detach and reattach the instance profile, then reboot the instance to refresh its credentials

    The metadata credentials are fine. The SDK never reaches them because it finds environment variable credentials first.

  • d
    Export AWS_DEFAULT_REGION in the startup script with the Region where the bucket is located

    A wrong Region causes redirect or endpoint errors, not an AccessDenied that names a different principal.

The concept

The SDK default credential provider chain stops at the first source it finds, and environment variables come before the instance profile.

Why that’s the answer

The error shows the requests are signed as an IAM user, not the role. The SDK checks sources in order (explicit parameters, environment variables, shared files and profiles, then container and instance metadata) and uses the first one that has credentials. The copied startup script exports build-bot's keys, which win over the instance profile. Removing them lets the chain fall through to the role. Changing the role or reattaching the profile doesn't help while the variables are present.

How to reason it out
  1. Read the principal in the error: an IAM user, not the role.
  2. Recall the order of the default credential provider chain.
  3. Find where an IAM user's keys could come from: the copied environment variables.
  4. Remove them so the chain reaches the instance profile.

Exam tip: If AWS calls run as an unexpected principal, look earlier in the credential chain: environment variables beat the instance role.

DVA-C03 Authentication and Authorization: IAM, Cognito, STS and Signed URLs — the lesson that teaches this.

Question 15Security

A web application stores generated invoices as private objects in an Amazon S3 bucket. Customers who are signed in to the application must be able to download their own invoice from a link that works for 15 minutes. Customers have no AWS credentials, and the bucket must remain private. What should the developer implement?

Choose one.

  • a
    Have the backend make the invoice object public and delete the object again after 15 minutes

    This exposes the object to anyone during that window and breaks the requirement that the bucket remain private.

  • b
    Have the backend generate a presigned GET URL for the invoice with a 15-minute expiration Correct

    A presigned URL carries a signature from the backend's credentials and an expiry, so anyone holding it can download that one object until it expires, while the bucket stays private.

  • c
    Have the backend add a bucket policy statement that allows the customer's IP address for 15 minutes

    Editing the bucket policy per download is error-prone, can admit others behind the same IP address, and does not scale.

  • d
    Have the backend generate a presigned PUT URL for the invoice with a 15-minute expiration

    A presigned URL is bound to its HTTP method. A PUT URL allows uploading to that key, not downloading it.

The concept

S3 presigned URLs grant time-limited access to one object for one operation without changing bucket permissions.

Why that’s the answer

The customer has no AWS credentials and the object must stay private. A presigned URL is signed by a principal that has s3:GetObject and includes an expiration, so the customer's browser can download the invoice directly until the URL expires. Making objects public or editing the bucket policy per request weakens the bucket's security, and a PUT URL authorizes uploads, not downloads.

How to reason it out
  1. Note that the downloader has no AWS credentials.
  2. Use a URL signed by the backend for that object and operation.
  3. Match the method to the action: GET for download.
  4. Set the expiration to the required window.

Exam tip: Time-limited download of a private S3 object: presigned GET URL.

DVA-C03 Authentication and Authorization: IAM, Cognito, STS and Signed URLs — the lesson that teaches this.

Domain 3: Testing and Deployment

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

Question 16Testing and Deployment

A Python service is built in CodeBuild with this Dockerfile:FROM public.ecr.aws/docker/library/python:3.12-slim WORKDIR /app COPY . . RUN pip install -r requirements.txt CMD ["python", "app.py"]Every build reinstalls all dependencies, even when only application code changed and requirements.txt did not. What change lets builds reuse the installed dependencies?

Choose one.

  • a
    Turn on local Docker layer caching in the CodeBuild project with no other change

    Caching only helps when a layer's inputs are unchanged. COPY . . changes with every code edit, so the pip install layer after it is still rebuilt.

  • b
    Add the --no-cache-dir flag to the pip install command in the Dockerfile

    This stops pip keeping its download cache inside the image, which saves space. It does not let Docker reuse the install layer.

  • c
    Copy requirements.txt and run pip install before copying the rest of the source Correct

    The install layer then depends only on requirements.txt, so code-only changes leave it cached and only the final COPY layer is rebuilt.

  • d
    Move the pip install command into a separate stage built after the source copy

    If the stage still installs after copying all the source, any code change invalidates it just the same; the ordering, not the stage, is the problem.

The concept

Docker reuses a cached layer only when the instruction and everything before it are unchanged.

Why that’s the answer

Docker builds layer by layer and reuses a cached layer until an instruction's inputs change; after that, every later layer is rebuilt. COPY . . changes whenever any file changes, so pip install after it always reruns. Copying only requirements.txt, installing, and then copying the rest puts the slow step behind an input that rarely changes. CodeBuild's local Docker layer cache helps only once the Dockerfile is ordered this way.

How to reason it out
  1. Find the slow step: pip install.
  2. Find its inputs: everything copied before it, currently the whole source tree.
  3. Narrow the input to requirements.txt and move the full copy after the install.
  4. Optionally add build caching so the reused layer survives between builds.

Exam tip: Order Dockerfile steps from least to most frequently changing: dependencies before source.

DVA-C03 Deployment Artifacts: Dependencies, ECR Images, AppConfig and API Gateway Stages — the lesson that teaches this.

Question 17Testing and Deployment

Builds in several accounts pull base images from Docker Hub and now fail intermittently because of Docker Hub rate limits. A developer wants the images to be fetched from Docker Hub once, kept in Amazon ECR and refreshed automatically, and wants builds to change only the image URI prefix. Which solution meets these requirements with the least operational effort?

Choose one.

  • a
    Create an ECR pull through cache rule for Docker Hub with credentials in Secrets Manager Correct

    A pull through cache rule fetches an upstream image on first pull, stores it in ECR and keeps it in sync, and builds only switch to the ECR prefix for that rule.

  • b
    Create an ECR replication rule that copies the Docker Hub repositories into the registry

    Replication copies images between ECR private registries (Regions or accounts). It cannot use Docker Hub as a source.

  • c
    Create a CodeArtifact repository with an external connection to Docker Hub

    CodeArtifact external connections are for package formats such as npm, PyPI and Maven. It does not proxy container images.

  • d
    Schedule a Lambda function that pulls each base image from Docker Hub and pushes it into ECR

    This could work, but you write, run and maintain the copy job and its image list, which is more effort than a managed cache rule.

The concept

ECR pull through cache keeps copies of upstream registry images in your private registry.

Why that’s the answer

A pull through cache rule maps a repository prefix in your ECR registry to an upstream registry. The first pull through the ECR URI fetches the image from upstream and stores it; ECR then serves later pulls and checks upstream for updates. Docker Hub as an upstream needs its credentials in an AWS Secrets Manager secret. Replication only copies between ECR registries, CodeArtifact handles language packages, and a custom copy job adds code to maintain.

How to reason it out
  1. Identify the need: cache third-party images in ECR and keep them current.
  2. Rule out replication, which only works between ECR registries.
  3. Rule out CodeArtifact, which does not store container images.
  4. Create a pull through cache rule and point builds at its prefix.

Exam tip: Upstream images throttling your builds? Use an ECR pull through cache rule.

DVA-C03 Deployment Artifacts: Dependencies, ECR Images, AppConfig and API Gateway Stages — the lesson that teaches this.

Question 18Testing and Deployment

A developer on an Apple silicon Mac packages a Python Lambda function as a .zip file with its dependencies installed locally by pip. One dependency includes compiled C extensions. The function works in local unit tests, but in Lambda it fails at import with an "invalid ELF header" error. Which change fixes the package with the least effort?

Choose one.

  • a
    Move the dependencies into a Lambda layer built on the same Mac

    A layer is just another place to put the files. Built on the Mac, the extensions are still compiled for the wrong platform and fail the same way.

  • b
    Build the dependencies with sam build --use-container before packaging Correct

    The build runs in a container that matches the Lambda runtime's Amazon Linux environment, so compiled extensions are built for the right OS and architecture.

  • c
    Set the PYTHONPATH environment variable on the function to its package path

    The module is found, which is why the error comes from loading it. The binary itself is for the wrong platform, so a path change does not help.

  • d
    Raise the function's memory and timeout so the dependencies can load fully

    "invalid ELF header" is a binary format mismatch, not a resource limit, so more memory or time does not change the result.

The concept

Native dependencies in a Lambda package must be compiled for the Lambda runtime's operating system and architecture.

Why that’s the answer

Packages with compiled extensions ship platform-specific binaries. Installing them on macOS produces Mach-O binaries that the Linux-based Lambda runtime cannot load, which shows up as invalid ELF header. sam build --use-container installs dependencies inside a container image that matches the Lambda runtime, so the package contains Linux binaries for the function's architecture. A layer, an environment variable or more memory does not change how the binaries were built.

How to reason it out
  1. Read the error: invalid ELF header means a binary built for another platform.
  2. Note the dependency has compiled C extensions.
  3. Rebuild the dependencies in a Lambda-compatible Linux environment.
  4. Repackage and redeploy the function.

Exam tip: Compiled dependencies for Lambda must be built on a Lambda-like Linux image, for example with sam build --use-container.

DVA-C03 Deployment Artifacts: Dependencies, ECR Images, AppConfig and API Gateway Stages — the lesson that teaches this.

Question 19Testing and Deployment

A team builds a Lambda function separately for dev, test and prod because each build bundles that environment's config.json with endpoints and feature settings. Auditors now require that the exact artifact tested in test is the one released to prod, and that prod values never appear in artifacts deployed to other environments. Which approach meets both requirements?

Choose one.

  • a
    Build one package that holds the three config files and choose one by an environment variable

    The artifact is the same everywhere, but it carries prod values into dev and test, which breaks the second requirement.

  • b
    Keep separate builds per environment and compare their dependency lock files before each release

    Matching lock files do not make two builds the same artifact; prod would still run a package that was never itself tested.

  • c
    Build one package with no environment values; each stack sets them as environment variables Correct

    One artifact moves unchanged through every environment, and each deployment supplies only its own values, so prod values never sit in dev or test artifacts.

  • d
    Build each environment from its own Git branch holding its config.json

    Branch-per-environment still produces a different artifact for each environment, so the tested package is not the one released.

The concept

Build once, deploy many: keep environment-specific values out of the artifact and inject them at deployment or run time.

Why that’s the answer

To promote the same artifact, the package must not contain anything that differs per environment. The deployment for each environment then supplies its values, for example as Lambda environment variables set from template parameters, or as parameter names the code reads from Parameter Store or AppConfig. Bundling every environment's file keeps one artifact but leaks prod values; per-environment builds or branches satisfy isolation but break the tested-equals-released rule. Only externalised configuration satisfies both.

How to reason it out
  1. Requirement one: the tested artifact is the released artifact, so build once.
  2. Requirement two: prod values must not ship to other environments, so do not bundle them.
  3. Reject options that rebuild per environment or bundle every environment's values.
  4. Supply values per environment at deployment through the stack's configuration.

Exam tip: Same artifact everywhere, different configuration per environment, supplied outside the package.

DVA-C03 Deployment Artifacts: Dependencies, ECR Images, AppConfig and API Gateway Stages — the lesson that teaches this.

Question 20Testing and Deployment

A company's developers publish internal npm and Python libraries that several services depend on. Builds also need packages from the public npm and PyPI registries. The team wants a managed AWS service that stores the internal packages privately and serves public packages through the same repository. Which service should the team use?

Choose one.

  • a
    Amazon ECR private repositories with pull through cache rules for each registry

    ECR stores container images and OCI artifacts. Its pull through cache targets container registries, not npm or PyPI.

  • b
    AWS CodeArtifact repositories with upstreams that connect to npmjs and PyPI Correct

    CodeArtifact hosts private npm, PyPI, Maven and other packages; upstream repositories that each hold one external connection let the team's repository fetch and keep public packages too.

  • c
    AWS Systems Manager Distributor with packages for each internal library

    Distributor installs software packages on managed instances. It is not a registry that npm or pip can resolve dependencies from.

  • d
    Amazon S3 buckets with static website hosting per package format

    A bucket can hold files, but it does not speak the npm or PyPI protocols or proxy public registries without you building that yourself.

The concept

AWS CodeArtifact is the managed package repository for language package managers.

Why that’s the answer

CodeArtifact repositories work with npm, pip/twine, Maven, Gradle, NuGet and other clients. Teams publish private packages to a repository and give it upstream repositories; each upstream can hold one external connection to a public registry (for example an npm-store connected to npmjs and a pypi-store connected to PyPI), so the team's repository serves private and public packages, and fetched public versions are kept. Each package format still uses its own repository endpoint URL. ECR is for container images, Distributor is for installing software on instances, and S3 would need a custom registry layer.

How to reason it out
  1. Identify the artifacts: language packages (npm, Python), not container images.
  2. Identify the needs: private publishing plus public packages through the same repository.
  3. Match them to a CodeArtifact repository whose upstreams connect to the public registries.

Exam tip: Language packages go in CodeArtifact; container images go in ECR.

DVA-C03 Deployment Artifacts: Dependencies, ECR Images, AppConfig and API Gateway Stages — the lesson that teaches this.

Domain 4: Troubleshooting and Optimization

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

Question 21Troubleshooting and Optimization

A developer reviews the AWS X-Ray trace map for a checkout application. On the edge from the orders service to the inventory service, most failed calls are classified as Error. Very few are classified as Fault or Throttle. What do these traces most likely show?

Choose one.

  • a
    The inventory service is failing internally while it handles valid requests

    Internal server failures return 5xx responses, which X-Ray classifies as Fault, not Error.

  • b
    The inventory service is rate limiting calls from the orders service

    429 Too Many Requests is classified as Throttle, and few calls fall in that category.

  • c
    The orders service is sending requests that the inventory service rejects Correct

    X-Ray classifies 4xx client errors as Error, so the inventory service is rejecting requests it considers invalid.

  • d
    The orders service is giving up before the inventory service responds

    A client-side timeout would show as a long call with an exception on the caller's side, not as a 4xx Error on the downstream service.

The concept

X-Ray groups failures into three categories by HTTP status class.

Why that’s the answer

X-Ray records 400-series responses as Error, 500-series as Fault and 429 as Throttle. Mostly Errors on the orders-to-inventory edge means the inventory service is answering with client errors such as 400 or 404. That points at the caller's request, for example a changed payload or a wrong ID, rather than a failure inside the inventory service.

How to reason it out
  1. Recall Error = 4xx, Fault = 5xx, Throttle = 429.
  2. Note which category dominates on the edge.
  3. Map 4xx to a defect in the caller's request.
  4. Inspect the failing subsegment's request and response for the details.

Exam tip: In X-Ray, Error means 4xx (caller's problem), Fault means 5xx (server's problem) and Throttle means 429.

DVA-C03 Root Cause Analysis: Lambda and API Errors, Logs Insights, X-Ray, Deployment Logs and AI Troubleshooting — the lesson that teaches this.

Question 22Troubleshooting and Optimization

A Lambda function behind Amazon API Gateway has a p95 latency of 3 seconds, and active tracing is on. In the timeline of a slow trace, the function's Invocation subsegment lasts 2.9 seconds. Inside it, a DynamoDB Query subsegment takes 60 ms and an HTTP subsegment calling a partner's tax endpoint takes 2.7 seconds. The trace has no Initialization subsegment. What is the root cause of the latency in this trace?

Choose one.

  • a
    Initializing a new execution environment before the partner call

    A cold start appears as an Initialization subsegment, and this trace has none.

  • b
    Waiting on the partner's tax endpoint during the invocation Correct

    The HTTP subsegment accounts for 2.7 of the 2.9 seconds, so the slow partner call explains nearly all of the latency.

  • c
    Running a DynamoDB Query with a poor partition key during the invocation

    The Query took 60 ms, which is a small part of the total time.

  • d
    API Gateway endpoint processing before the invocation starts

    Almost all of the 3 seconds is inside the function's Invocation subsegment, so gateway overhead is small.

The concept

Subsegments break a trace's time into the downstream calls made during the request.

Why that’s the answer

In a Lambda trace, the function segment contains an Initialization subsegment (only on cold starts) and an Invocation subsegment. Inside it, instrumented SDK and HTTP clients add one subsegment per call. Here the HTTP call takes 2.7 s of the 2.9 s Invocation, so the partner endpoint is the bottleneck. There is no Initialization subsegment, so this was not a cold start, and the DynamoDB call is negligible.

How to reason it out
  1. Open the slow trace's timeline.
  2. Check for an Initialization subsegment to rule cold starts in or out.
  3. Compare the downstream subsegments' durations within Invocation.
  4. Attribute the latency to the longest subsegment: the partner HTTP call.

Exam tip: In a trace timeline, the longest downstream subsegment inside Invocation is usually the bottleneck.

DVA-C03 Root Cause Analysis: Lambda and API Errors, Logs Insights, X-Ray, Deployment Logs and AI Troubleshooting — the lesson that teaches this.

Question 23Troubleshooting and Optimization

A team instruments a Node.js service with the AWS Distro for OpenTelemetry (ADOT) and sends traces to AWS X-Ray. Each request span sets a `tenant_id` attribute. During an incident, the filter expression `annotation.tenant_id = "t-77"` returns no traces, although the trace details for that tenant's requests list tenant_id under metadata. What should the developer change so that future traces can be found this way?

Choose one.

  • a
    Filter with metadata.tenant_id instead of the span attribute

    Metadata is not indexed, so filter expressions cannot search it. Changing the expression does not help.

  • b
    Add tenant_id to the span's aws.xray.annotations list Correct

    ADOT converts attributes to X-Ray metadata by default. Keys named in aws.xray.annotations become indexed annotations that filter expressions can search.

  • c
    Raise the span sampling rate so more tenant requests are traced

    The tenant's traces already exist. They cannot be found because the field is not indexed, not because they were not sampled.

  • d
    Create an X-Ray group that lists the tenant_id attribute filter

    A group uses the same filter expression, so it fails for the same reason: tenant_id is not an annotation.

The concept

Only annotations are indexed for X-Ray filter expressions, and OpenTelemetry attributes become metadata unless you mark them.

Why that’s the answer

X-Ray annotations are indexed key-value pairs that filter expressions and GetTraceSummaries can search. Metadata is stored but not indexed. When OpenTelemetry spans are exported to X-Ray, attributes become metadata by default. To make one searchable, add its key to the aws.xray.annotations attribute list. Sampling and groups do not change whether a field is indexed. (The X-Ray SDKs entered maintenance mode in February 2026, and AWS recommends OpenTelemetry for new instrumentation.)

How to reason it out
  1. Note that the value is present but under metadata.
  2. Recall that filter expressions search only annotations.
  3. Recall that OTel attributes map to metadata by default.
  4. Mark the key in aws.xray.annotations so new traces are searchable.

Exam tip: To filter traces by a field, record it as an annotation. With OpenTelemetry, list it in aws.xray.annotations.

DVA-C03 Root Cause Analysis: Lambda and API Errors, Logs Insights, X-Ray, Deployment Logs and AI Troubleshooting — the lesson that teaches this.

Question 24Troubleshooting and Optimization

A developer wants to see when a spike of errors began in a Lambda function. Using CloudWatch Logs Insights on the function's log group, the developer needs the number of log events containing ERROR in each 5-minute interval over the last day. Which query returns this?

Choose one.

  • a
    filter @message like /ERROR/ | stats count(*) by bin(5m) Correct

    The filter keeps only ERROR events, and stats count(*) by bin(5m) counts them per 5-minute bucket.

  • b
    filter @message like /ERROR/ | stats count(*) by @logStream

    This counts errors per log stream (per execution environment), not per time interval.

  • c
    stats count(*) by bin(5m) | filter @message like /ERROR/

    After stats, only the aggregated fields remain, so filtering on @message afterwards no longer works on the raw events.

  • d
    filter @message like /ERROR/ | sort @timestamp desc | limit 288

    This lists the most recent 288 error events, but it does not count them per interval.

The concept

Logs Insights commands run as a pipeline: filter the raw events first, then aggregate with stats.

Why that’s the answer

filter @message like /ERROR/ keeps matching events, and stats count(*) by bin(5m) groups them into 5-minute time buckets, which is what shows when a spike started. Grouping by @logStream gives a per-environment count, putting stats before filter leaves only aggregated rows to filter, and sort plus limit lists events without counting them.

How to reason it out
  1. Filter raw events to the ones that matter.
  2. Aggregate with stats count(*).
  3. Group by bin(5m) to bucket by time.
  4. Keep filter before stats, because stats replaces the raw fields.

Exam tip: Time-series counts in Logs Insights: filter, then stats count(*) by bin(interval).

DVA-C03 Root Cause Analysis: Lambda and API Errors, Logs Insights, X-Ray, Deployment Logs and AI Troubleshooting — the lesson that teaches this.

Question 25Troubleshooting and Optimization

A developer suspects some invocations of a Lambda function come close to its memory limit. The function uses the default plain-text log format. In CloudWatch Logs Insights, the developer needs the 20 invocations with the highest memory use, each with its request ID. Which query should the developer run?

Choose one.

  • a
    filter @type = "REPORT" | fields @requestId, @maxMemoryUsed | sort @maxMemoryUsed desc | limit 20 Correct

    REPORT lines carry each invocation's request ID and peak memory, so sorting by @maxMemoryUsed gives the top 20 invocations.

  • b
    filter @type = "START" | fields @requestId, @maxMemoryUsed | sort @maxMemoryUsed desc | limit 20

    START lines mark the beginning of an invocation and have no memory fields. Memory use is only on REPORT lines.

  • c
    filter @type = "REPORT" | fields @requestId, @memorySize | sort @memorySize desc | limit 20

    @memorySize is the configured memory, which is the same for every invocation of this version, so it does not rank usage.

  • d
    filter @type = "REPORT" | stats max(@maxMemoryUsed) by bin(20m) | limit 20

    This gives the peak per 20-minute bucket, with no request IDs, so it does not identify individual invocations.

The concept

Logs Insights automatically discovers fields from Lambda REPORT lines.

Why that’s the answer

For Lambda log groups in plain-text format, Logs Insights finds @type, @requestId, @duration, @billedDuration, @memorySize, @maxMemoryUsed and, on cold starts, @initDuration in the REPORT line that ends each invocation. Filtering to REPORT, selecting @requestId and @maxMemoryUsed, and sorting descending gives the heaviest invocations. START lines have no memory data, @memorySize is the setting rather than the usage, and binned stats lose the request IDs.

How to reason it out
  1. Know that per-invocation memory use is in the REPORT line.
  2. Filter @type = "REPORT".
  3. Select @requestId and @maxMemoryUsed.
  4. Sort by @maxMemoryUsed descending and limit 20.

Exam tip: Lambda REPORT lines give @maxMemoryUsed, @duration and @initDuration per @requestId.

DVA-C03 Root Cause Analysis: Lambda and API Errors, Logs Insights, X-Ray, Deployment Logs and AI Troubleshooting — the lesson that teaches this.

Keep going with DVA-C03

DVA-C03 practice by domain

DVA-C03 sample questions: your questions

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