☰ All modules Tier 2 · Other services (Step Functions and smaller services) GuideCheat sheet ‹ sqs-sns-kinesismonitoring ›
Contents
  1. How Other services (Step Functions and smaller services) appears on DVA-C02
  2. 1. Step Functions state machines and state types
  3. 2. Step Functions task states and service integrations
  4. 3. Step Functions error handling with Retry and Catch
  5. 4. Step Functions input and output processing
  6. 5. Step Functions callbacks with task tokens and activities
  7. 6. Step Functions Standard vs Express workflows
  8. 7. AppSync GraphQL APIs and resolvers
  9. 8. AppSync authorization modes
  10. 9. Amplify hosting and end to end tests
  11. 10. AppConfig feature flags validators and deployment strategies
  12. 11. SES for application email
  13. 12. OpenSearch and Athena for search and analytics
  14. 13. MSK vs Kinesis Data Streams
  15. 14. ACM Private CA and Macie
  16. Quick decision rules
  17. Changed vs older material

Other services (Step Functions and smaller services) — DVA-C02 Mastery Guide

  • Sources: course chapters 21 (other serverless services: Step Functions, AppSync, Amplify) and 24 (other services: SES, OpenSearch, Athena, MSK, ACM and Private CA, Macie, AppConfig). The course serves as the syllabus only; all wording, examples and questions here are original.
  • Written 2026-10-12; values checked against AWS docs on 2026-10-12 (Step Functions Developer Guide and API Reference, AppSync Developer Guide and API Reference, Amplify Hosting and Amplify docs, AppConfig User Guide and quotas, SES Developer Guide, OpenSearch Service, Athena, MSK, ACM, AWS Private CA and Macie guides, AWS pricing and What's New pages). The marker ⚠️ Changed: <current>. Older material may say <old>. flags a value or behaviour that differs from the course or older practice tests: learn the current value. ⚠️ unverified marks a value that could not be confirmed; (volatile) marks a value AWS changes often (quotas, prices). Every change is listed in Changed vs older material; rows you confirm are added to notes/current-facts.md.
  • Tier 2 (deployment and messaging), bank target 35 questions. Domains: Development with AWS Services (primary), Deployment, Security.
  • How to use it: /explain <topic> teaches from these sections (concept → exam facts → developer angle → traps → 3 check questions); /quiz other-services asks bank questions whose source_note links point at the ## N. headings below; /drill other-services fires short recall prompts from notes/other-services-cheat-sheet.md. Suggested loop: read a section and answer its practice questions before opening the answers → /explain what is still unclear → /quiz other-services → /drill other-services.

How Other services (Step Functions and smaller services) appears on DVA-C02

This module pairs one service that DVA-C02 tests in depth, AWS Step Functions, with a set of services that mostly appear as the right answer, or as a tempting distractor, in "which service or setting" questions:

Typical question shapes: a scenario with one deciding constraint (LEAST operational overhead, no code changes, exactly-once, lowest cost); an ASL snippet or error name to diagnose (States.DataLimitExceeded, ExecutionAlreadyExists, TaskTimedOut, UnauthorizedException); "Which TWO…" with five options; the exact Resource suffix, API action, header or directive that does the job.

Domain map: Development with AWS Services → §1–§8, §10–§13 · Deployment → §6 (versions, aliases, testing), §9 (Amplify CI/CD and tests), §10 (AppConfig rollouts) · Security → §8 (AppSync authorization), §11 (SES IAM conditions), §13 (MSK authentication and encryption), §14 (ACM, Private CA, Macie).

Out of scope here (owned by other modules): Lambda invocation types, destinations and limits → see notes/lambda-guide.md; API Gateway integrations, custom domains and WebSocket APIs → see notes/api-gateway-guide.md; Kinesis Data Streams shards, the KCL and Amazon Data Firehose → see notes/sqs-sns-kinesis-guide.md; SAM AWS::Serverless::StateMachine → see notes/sam-guide.md §3; Cognito user and identity pools → see notes/advanced-identity-guide.md; KMS, Parameter Store and Secrets Manager → see notes/security-encryption-guide.md; ACM certificates on load balancers and SNI → see notes/ec2-mastery-guide.md §9; DynamoDB Streams → see notes/dynamodb-guide.md §11; EventBridge, X-Ray, CloudWatch Logs subscription filters and CloudWatch Evidently → see notes/monitoring-guide.md; CloudFront → see notes/cloudfront-guide.md; S3 → see notes/s3-guide.md; CodePipeline and CodeBuild → see notes/cicd-guide.md. No OS administration or network design.

# Topic Why it is on the exam
1 Step Functions state machines and state types ASL structure, Choice/Map/Parallel behaviour, idempotent starts, versions, aliases and redrive
2 Step Functions task states and service integrations The Resource URI decides what runs and how long the task waits; direct integrations replace glue code
3 Step Functions error handling with Retry and Catch Retry fields and defaults, backoff math, States.* error names and what States.ALL misses
4 Step Functions input and output processing ResultPath and friends, JSONata, variables and the 256 KiB payload limit
5 Step Functions callbacks with task tokens and activities Pausing for humans or external systems, heartbeats, activity workers and their timeouts
6 Step Functions Standard vs Express workflows Duration, semantics, history, pricing and supported patterns decide the type
7 AppSync GraphQL APIs and resolvers GraphQL over many data sources, JavaScript resolvers, subscriptions, caching
8 AppSync authorization modes Five modes, directives, Lambda authorizer responses, custom domains
9 Amplify hosting and end to end tests Git-based hosting with previews, amplify.yml, Cypress tests, Amplify Gen 2
10 AppConfig feature flags validators and deployment strategies Config changes without redeploying, safe rollouts, how code reads configuration
11 SES for application email Sandbox, identities, SMTP vs API, IAM conditions, event publishing
12 OpenSearch and Athena for search and analytics Search next to a database; serverless SQL on S3 and how to cut its cost
13 MSK vs Kinesis Data Streams Kafka compatibility vs AWS-native streams; KRaft, Express brokers, Serverless, IAM auth
14 ACM Private CA and Macie Where certificates must live, renewal, exportable and private certificates; PII discovery in S3

1. Step Functions state machines and state types

Concept

Exam facts

Developer angle

orders.asl.json: large orders wait for review, then a notification and a database write run in parallel through direct integrations (§2):

{
  "StartAt": "CheckAmount",
  "States": {
    "CheckAmount": { "Type": "Choice", "Default": "Fulfil",
      "Choices": [{ "Variable": "$.total", "NumericGreaterThan": 1000, "Next": "HoldForReview" }] },
    "HoldForReview": { "Type": "Wait", "Seconds": 3600, "Next": "Fulfil" },
    "Fulfil": { "Type": "Parallel", "End": true, "Branches": [
      { "StartAt": "Notify", "States": { "Notify": { "Type": "Task", "End": true,
          "Resource": "arn:aws:states:::sns:publish",
          "Parameters": { "TopicArn": "arn:aws:sns:eu-west-1:111122223333:order-events",
                          "Message.$": "States.Format('Order {} accepted', $.orderId)" } } } },
      { "StartAt": "Record", "States": { "Record": { "Type": "Task", "End": true,
          "Resource": "arn:aws:states:::dynamodb:putItem",
          "Parameters": { "TableName": "Orders",
                          "Item": { "pk": { "S.$": "$.orderId" }, "status": { "S": "ACCEPTED" } } } } } }
    ] }
  }
}

Traps

Practice questions

  1. A payments team starts a Standard workflow from an API each time a customer submits an order. Client network retries sometimes repeat the same request, and the payment steps must never run twice for one order. Which solution meets this requirement with the LEAST custom code?

    • A. Switch to an Express workflow and pass the order ID in the execution input.
    • B. Use the order ID as the execution name when calling StartExecution.
    • C. Add a Retry field with MaxAttempts set to 0 on the payment Task state.
    • D. Write each order ID to a DynamoDB table from the client and check it before starting the execution.
  2. A data team must process 3 million JSON objects stored under one S3 prefix with high parallelism. A few malformed objects are expected and must not fail the whole job. Which TWO configurations meet these requirements? (Select TWO.)

    • A. A Map state in Distributed mode with an ItemReader that lists the S3 prefix.
    • B. A Map state in Inline mode with MaxConcurrency set to 0.
    • C. A Parallel state with one branch for each object.
    • D. A ToleratedFailurePercentage on the Map state that allows a small share of failed items.
    • E. An Express workflow as the parent so that the job runs at a higher rate.
Answers
  1. B. Standard StartExecution is idempotent by name: a repeat with the same name and input returns the original execution instead of starting another. A fails because Express starts are not idempotent and run at least once; C only stops retries inside one execution, not duplicate executions; D adds custom code and still races between the write and the start.
  2. A, D. Distributed Map reads the objects from S3 and runs up to 10,000 child executions, and a tolerated failure threshold keeps a few bad items from failing the run. B is limited to 40 concurrent iterations and the 25,000-event history; C needs a static branch per object; E fails because a Distributed Map parent must be a Standard workflow and Express runs stop at 5 minutes.

2. Step Functions task states and service integrations

Concept

Exam facts

Developer angle

Optimized Lambda call, an SDK integration with no Lambda in between, and a container job that the workflow waits for:

{
  "StartAt": "ScoreOrder",
  "States": {
    "ScoreOrder": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": { "FunctionName": "score-order:live", "Payload.$": "$" },
      "OutputPath": "$.Payload", "TimeoutSeconds": 30, "Next": "TagInvoice" },
    "TagInvoice": { "Type": "Task", "Resource": "arn:aws:states:::aws-sdk:s3:putObjectTagging",
      "Parameters": { "Bucket": "invoices-111122223333", "Key.$": "$.invoiceKey",
                      "Tagging": { "TagSet": [{ "Key": "scored", "Value": "true" }] } },
      "ResultPath": null, "TimeoutSeconds": 30, "Next": "RunReport" },
    "RunReport": { "Type": "Task", "Resource": "arn:aws:states:::ecs:runTask.sync",
      "Parameters": { "Cluster": "reports", "TaskDefinition": "monthly-report:7", "LaunchType": "FARGATE",
                      "NetworkConfiguration": { "AwsvpcConfiguration": { "Subnets": ["subnet-0abc1234def567890"] } } },
      "TimeoutSeconds": 3600, "End": true }
  }
}

Traps

Practice questions

  1. A workflow must start a container job on Amazon ECS with Fargate and continue to the next state only after the container exits. Which Resource value meets this requirement with the LEAST code?

    • A. arn:aws:states:::ecs:runTask
    • B. arn:aws:states:::lambda:invoke calling a function that polls DescribeTasks until the task stops
    • C. arn:aws:states:::ecs:runTask.sync
    • D. arn:aws:states:::aws-sdk:ecs:runTask followed by a Wait and Choice loop that checks the task status
  2. A state machine uses one Lambda function whose only job is to write an item to a DynamoDB table and another whose only job is to publish a message to an SNS topic. The team wants to remove both functions without changing workflow behaviour. Which TWO changes meet this requirement? (Select TWO.)

    • A. Replace the first function with an activity whose worker writes the item.
    • B. Replace the first function with a Task state that uses arn:aws:states:::dynamodb:putItem.
    • C. Replace the second function with an HTTP Task that calls the SNS API endpoint.
    • D. Append .waitForTaskToken to both Lambda Task states.
    • E. Replace the second function with a Task state that uses arn:aws:states:::sns:publish.
Answers
  1. C. The .sync pattern makes Step Functions wait until the ECS task stops. A returns as soon as ECS accepts the request; B and D work but add a polling function or loop that .sync makes unnecessary.
  2. B, E. The optimized DynamoDB and SNS integrations call PutItem and Publish directly from the workflow. A replaces a function with a worker you must host; C is meant for third-party HTTPS APIs authenticated through EventBridge connections, not SigV4-signed AWS APIs; D keeps both functions and adds callbacks nobody sends.

3. Step Functions error handling with Retry and Catch

Concept

Exam facts

Name Meaning
States.ALL Wildcard for any known error, except States.DataLimitExceeded and States.Runtime
States.TaskFailed Wildcard in Retry/Catch for any task error except States.Timeout
States.Timeout The task exceeded TimeoutSeconds or went silent past HeartbeatSeconds; also raised when a whole execution exceeds its timeout. A timed-out nested state machine reaches the parent as States.TaskFailed. States.HeartbeatTimeout (usable in Retry and Catch) names the missed-heartbeat case
States.Permissions Task lacked privileges to run the specified code
States.DataLimitExceeded Input or output over the payload quota; terminal for States.ALL, so name it explicitly to catch or retry it
States.Runtime Unprocessable exception (for example InputPath on a null payload); never retried or caught
States.ExceedToleratedFailureThreshold, States.ItemReaderFailed, States.ResultWriterFailed Distributed Map failures
States.Http.Socket HTTP Task exceeded 60 seconds
States.QueryEvaluationError A JSONata expression failed (§4)

Developer angle

Retry transient Lambda failures with capped, jittered backoff; route the business error and everything else to different fallbacks while keeping the order data:

{
  "ChargeCard": {
    "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke",
    "Parameters": { "FunctionName": "charge-card", "Payload.$": "$" },
    "OutputPath": "$.Payload", "TimeoutSeconds": 20, "Next": "ShipOrder",
    "Retry": [{ "ErrorEquals": ["Lambda.ServiceException", "Lambda.AWSLambdaException",
                                "Lambda.SdkClientException", "Lambda.TooManyRequestsException"],
                "IntervalSeconds": 2, "MaxAttempts": 4, "BackoffRate": 2.0,
                "MaxDelaySeconds": 20, "JitterStrategy": "FULL" }],
    "Catch": [
      { "ErrorEquals": ["PaymentDeclined"], "ResultPath": "$.error", "Next": "NotifyCustomer" },
      { "ErrorEquals": ["States.DataLimitExceeded"], "ResultPath": null, "Next": "AlertSupport" },
      { "ErrorEquals": ["States.ALL"], "ResultPath": "$.error", "Next": "AlertSupport" }
    ]
  }
}

Traps

Practice questions

  1. A Task state has one retrier with IntervalSeconds 2, BackoffRate 3.0, MaxAttempts 3, MaxDelaySeconds 10 and JitterStrategy NONE. The task fails on every attempt. How long does Step Functions wait before the first, second and third retries?

    • A. 2, 4 and 6 seconds
    • B. 2, 6 and 18 seconds
    • C. 3, 9 and 10 seconds
    • D. 2, 6 and 10 seconds
  2. A workflow passes a growing JSON document between its states. Executions now fail with States.DataLimitExceeded, even though the failing Task state has a catcher for States.ALL. Which TWO changes fix the problem or handle it gracefully? (Select TWO.)

    • A. Store the document in S3 and pass only the bucket name and object key between states.
    • B. Request a Service Quotas increase for the maximum state input and output size.
    • C. Add a catcher whose ErrorEquals names States.DataLimitExceeded explicitly.
    • D. Move the States.ALL catcher to the top of the Catch array.
    • E. Recreate the state machine as an Express workflow.
Answers
  1. D. The waits are 2 × 3⁰ = 2 s, 2 × 3¹ = 6 s and 2 × 3² = 18 s, capped at MaxDelaySeconds 10. A ignores the backoff rate; B ignores the cap; C starts from the wrong interval.
  2. A, C. Passing an S3 pointer keeps payloads under the 256 KiB quota, and States.DataLimitExceeded is only caught when named explicitly. B fails because the payload size is a hard quota; D is invalid (States.ALL must be last) and still wouldn't catch it; E fails because Express has the same 256 KiB limit.

4. Step Functions input and output processing

Concept

Exam facts

Developer angle

JSONPath state: read a DynamoDB item, keep two attributes and add them to the input under customer. With input {"customerId": "c-17", "orderId": "8812"} the output is that input plus "customer": {"email": "…", "tier": "gold"}:

{
  "GetCustomer": {
    "Type": "Task", "Resource": "arn:aws:states:::dynamodb:getItem", "End": true,
    "Parameters": { "TableName": "Customers", "Key": { "pk": { "S.$": "$.customerId" } } },
    "ResultSelector": { "email.$": "$.Item.email.S", "tier.$": "$.Item.tier.S" },
    "ResultPath": "$.customer"
  }
}

The same state in JSONata, also saving the tier in a variable for later states:

{
  "GetCustomer": {
    "Type": "Task", "QueryLanguage": "JSONata", "Resource": "arn:aws:states:::dynamodb:getItem", "End": true,
    "Arguments": { "TableName": "Customers", "Key": { "pk": { "S": "{% $states.input.customerId %}" } } },
    "Assign": { "tier": "{% $states.result.Item.tier.S %}" },
    "Output": "{% $merge([$states.input, {'customer': {'email': $states.result.Item.email.S}}]) %}"
  }
}

Traps

Practice questions

  1. A Task state calls a Lambda function through the optimized integration. The next state needs all of the original input fields and also the function's status value under a payment key. Which configuration meets this requirement?

    • A. "ResultSelector": {"status.$": "$.Payload.status"} and "ResultPath": "$.payment"
    • B. "ResultSelector": {"status.$": "$.Payload.status"} and "OutputPath": "$.payment"
    • C. "InputPath": "$.Payload" and "ResultPath": null to keep the original input
    • D. "ResultPath": "$" with "OutputPath": "$.Payload.status" so only the status moves on
  2. A team migrates a JSONPath state machine to JSONata one state at a time to limit risk. Which TWO statements describe how each converted state must be written? (Select TWO.)

    • A. Each converted state keeps its ResultPath field to place the task result in the input.
    • B. Each converted state appends .$ to every key whose value is an expression.
    • C. Each converted state uses Arguments instead of Parameters to build the service request.
    • D. The whole state machine must switch to JSONata in a single deployment.
    • E. Each converted state sets "QueryLanguage": "JSONata" and wraps expressions in {% %}.
Answers
  1. A. ResultSelector picks status from the wrapped Lambda result and ResultPath adds it under payment without touching the input. B replaces the input with the selected result and then filters on a payment key that doesn't exist; C discards the result; D throws the input away and keeps only the status value.
  2. C, E. JSONata states build requests with Arguments, and the language can be set per state with expressions inside {% %}. A and B describe JSONPath-only features that are invalid in JSONata states; D is wrong because QueryLanguage can be set state by state.

5. Step Functions callbacks with task tokens and activities

Concept

Exam facts

Developer angle

Wait up to three days for a manager's decision delivered through an SQS queue:

{
  "StartAt": "RequestApproval",
  "States": {
    "RequestApproval": { "Type": "Task", "Resource": "arn:aws:states:::sqs:sendMessage.waitForTaskToken",
      "Parameters": { "QueueUrl": "https://sqs.eu-west-1.amazonaws.com/111122223333/approvals",
                      "MessageBody": { "orderId.$": "$.orderId", "taskToken.$": "$$.Task.Token" } },
      "TimeoutSeconds": 259200, "ResultPath": "$.approval", "Next": "Approved",
      "Catch": [{ "ErrorEquals": ["States.Timeout", "Rejected"], "ResultPath": "$.error", "Next": "Expired" }] },
    "Approved": { "Type": "Succeed" },
    "Expired": { "Type": "Fail", "Error": "ApprovalNotGranted", "Cause": "Approval timed out or was rejected" }
  }
}

Traps

Practice questions

  1. An order workflow must pause until a manager clicks an approval link in an email, which can take up to two days. Which solution meets this requirement with the LEAST operational overhead?

    • A. A Wait state of 10 minutes followed by a Choice state that reads an approval flag from DynamoDB, repeated in a loop until the flag is set.
    • B. A .waitForTaskToken task whose emailed link carries the token, an approval endpoint calling SendTaskSuccess, and a 2-day timeout.
    • C. An activity whose worker on an EC2 instance reads the manager's mailbox and calls SendTaskSuccess when a reply arrives.
    • D. An Express workflow started with StartSyncExecution that waits for the approval.
  2. An activity worker runs on premises. Long jobs sometimes fail with a timeout while the job is still running, and idle pollers log client read timeouts. Which TWO changes fix both problems? (Select TWO.)

    • A. Call SendTaskHeartbeat regularly, within HeartbeatSeconds, while a job runs.
    • B. Recreate the state machine as an Express workflow.
    • C. Append .sync to the activity ARN in the Resource field.
    • D. Set the worker's client read timeout to at least 65 seconds.
    • E. Lower the Task state's TimeoutSeconds to 60 seconds.
Answers
  1. B. The callback pattern pauses the execution at no cost until the token comes back, and the timeout ends abandoned requests. A builds a polling loop that adds state transitions; C needs a worker you host and maintain; D fails because Express workflows stop at 5 minutes and don't support callbacks.
  2. A, D. Heartbeats keep a long job's task alive, and a read timeout of at least 65 seconds, 5 seconds above the 60-second long poll, stops idle polls from erroring. B removes activity support entirely; C is not valid for activities; E makes long jobs time out even sooner.

6. Step Functions Standard vs Express workflows

Concept

Exam facts

Standard Express
Maximum duration 1 year 5 minutes
Execution semantics Exactly-once (unless you add Retry) Asynchronous: at-least-once · synchronous: at-most-once
How to start StartExecution (idempotent by name) Async: StartExecution (not idempotent) · sync: StartSyncExecution (API Gateway, Lambda, SDK)
Execution history API and console for 90 days after close (can be reduced to 30 days by a support request); CloudWatch Logs optional CloudWatch Logs only: enable logging
History size 25,000 events Unlimited
Pricing Per state transition (retries count) Per execution, duration and memory
Integration patterns Request Response, .sync, .waitForTaskToken Request Response only
Activities, Distributed Map parent, redrive Supported Not supported
StartExecution throttle (volatile, soft) Bucket 1,300, refill 300 per second in us-east-1, us-west-2 and eu-west-1; 800 and 150 elsewhere Bucket 6,000, refill 6,000 per second
State transitions (volatile, soft) 5,000 per second in the three Regions above, 800 elsewhere No limit

Developer angle

Create an Express workflow with full logging and call it synchronously:

aws stepfunctions create-state-machine --name price-quote --type EXPRESS \
  --definition file://quote.asl.json \
  --role-arn arn:aws:iam::111122223333:role/QuoteStateMachineRole \
  --logging-configuration '{"level":"ALL","includeExecutionData":true,"destinations":[{"cloudWatchLogsLogGroup":{"logGroupArn":"arn:aws:logs:eu-west-1:111122223333:log-group:/aws/vendedlogs/states/price-quote:*"}}]}'

aws stepfunctions start-sync-execution \
  --state-machine-arn arn:aws:states:eu-west-1:111122223333:stateMachine:price-quote \
  --input '{"sku":"A-100","qty":3}' --query '{status:status,output:output}'

Traps

Practice questions

  1. An IoT platform receives 4,000 sensor events per second. Each event is transformed in under 2 seconds and written to DynamoDB with an idempotent put by key. Producers don't wait for a result. Which workflow choice is the MOST cost-effective?

    • A. A Standard workflow execution per event, started by an EventBridge rule.
    • B. A Standard workflow per minute with an Inline Map over that minute's events.
    • C. A synchronous Express workflow started with StartSyncExecution for each event.
    • D. An asynchronous Express workflow started for each event.
  2. A mobile back end must combine the results of three microservice calls and return them to the caller within 3 seconds, with no custom orchestration code. Which TWO components meet these requirements? (Select TWO.)

    • A. A Standard workflow started with StartExecution, with the client polling DescribeExecution.
    • B. An Express workflow that calls the three microservices.
    • C. An API Gateway integration that calls StartSyncExecution and returns the workflow output.
    • D. An activity whose worker calls the three microservices.
    • E. A .waitForTaskToken Task state for each microservice call.
Answers
  1. D. Asynchronous Express suits high-volume, short, idempotent work and is billed per execution and duration instead of per state transition. A pays per state transition and exceeds the default Standard start rate; B packs too many items into one execution's history and also pays per transition; C makes callers wait for results they don't need.
  2. B, C. A synchronous Express workflow returns the combined result in the same request, and API Gateway can start it with StartSyncExecution. A adds polling and latency; D adds a worker you must host; E is unsupported in Express workflows and waits for callbacks no service sends.

7. AppSync GraphQL APIs and resolvers

Concept

Exam facts

Developer angle

Schema with a query, a mutation and a filtered subscription:

type Post { id: ID! title: String! author: String ups: Int }
type Query { getPost(id: ID!): Post }
type Mutation { addPost(id: ID!, title: String!, author: String): Post }
type Subscription {
  onAddPost(author: String): Post @aws_subscribe(mutations: ["addPost"])
}

JavaScript unit resolver for Query.getPost on a DynamoDB data source:

import { util } from '@aws-appsync/utils';
import { get } from '@aws-appsync/utils/dynamodb';

export function request(ctx) {
  return get({ key: { id: ctx.args.id } });
}

export function response(ctx) {
  if (ctx.error) util.error(ctx.error.message, ctx.error.type);
  return ctx.result;
}

Traps

Practice questions

  1. A collaborative to-do app stores items in DynamoDB. When one user edits an item, the other users' web and mobile clients must update in near real time. Which solution requires the LEAST custom infrastructure?

    • A. An API Gateway REST API that clients poll every 2 seconds.
    • B. DynamoDB Streams with a Lambda function that sends every change to the clients through SNS mobile push notifications.
    • C. An AppSync API whose mutations write to DynamoDB and whose subscription uses @aws_subscribe on those mutations.
    • D. An API Gateway WebSocket API with a Lambda function that stores connection IDs in DynamoDB and pushes each change to them.
  2. An AppSync query returns 100 orders, and the Order.customer field is resolved by a Lambda function that is invoked once per order, which causes high latency and cost. Customer records change rarely. Which TWO changes reduce the number of Lambda invocations? (Select TWO.)

    • A. Change the API's default authorization mode to API_KEY.
    • B. Increase the memory configured for the Lambda function.
    • C. Move subscription clients to the pure WebSockets protocol.
    • D. Use the BatchInvoke operation in the Order.customer resolver.
    • E. Enable per-resolver caching on Order.customer with a TTL and a key based on the customer ID.
Answers
  1. C. AppSync subscriptions push each mutation's result to connected clients over managed WebSockets. A adds polling load and delay; B and D need custom fan-out code and connection tracking.
  2. D, E. Batching resolves many orders' customers in one invocation, and caching serves repeated customers without calling Lambda. A, B and C don't change how often the resolver invokes the function.

8. AppSync authorization modes

Concept

Exam facts

Developer angle

Default mode Cognito user pools, API_KEY added for the public catalog, admin-only cost data and price changes:

type Product @aws_api_key @aws_cognito_user_pools {
  id: ID!
  name: String!
  price: Float!
  costPrice: Float @aws_cognito_user_pools(cognito_groups: ["Admins"])
}
type Query { listProducts: [Product] @aws_api_key @aws_cognito_user_pools }
type Mutation {
  updatePrice(id: ID!, price: Float!): Product @aws_cognito_user_pools(cognito_groups: ["Admins"])
}

A Lambda authorizer for custom tenant tokens:

def lookup_tenant(token):   # placeholder for a real lookup, e.g. GetItem on a token table
    return {"id": "t-42", "plan": "free"} if token.startswith("tk_") else None

def handler(event, context):
    tenant = lookup_tenant(event.get("authorizationToken", ""))
    if tenant is None:
        return {"isAuthorized": False}
    denied = [] if tenant["plan"] == "pro" else ["Product.costPrice"]
    return {"isAuthorized": True, "resolverContext": {"tenantId": tenant["id"]},
            "deniedFields": denied, "ttlOverride": 300}

Traps

Practice questions

  1. A retail AppSync API uses Cognito user pools as its default authorization mode. The product catalog query must also be readable by anonymous visitors of the public website, while price changes stay limited to the Admins group. Which solution meets these requirements with the LEAST effort?

    • A. Add API_KEY as an additional mode and put @aws_api_key plus @aws_cognito_user_pools on the catalog query and Product.
    • B. Create a second AppSync API that uses only API_KEY authorization, and copy the schema and resolvers to it for the website.
    • C. Change the default mode to AWS_IAM and give the anonymous website visitors IAM user access keys embedded in the page.
    • D. Put an API Gateway REST API with a Lambda proxy integration in front of the catalog query and leave it unauthenticated.
  2. A SaaS team protects an AppSync API with a Lambda authorizer that validates custom tokens. Resolvers must read the caller's tenant ID, and tenants on the free plan must never receive the Invoice.margin field. Which TWO values should the authorizer return? (Select TWO.)

    • A. deniedFields that lists Invoice.margin for free-plan tenants.
    • B. A principalId and an IAM policyDocument that denies the field.
    • C. A ttlOverride of 3600 so that every decision is cached for an hour.
    • D. An @aws_auth directive inside the response.
    • E. resolverContext that contains the tenant ID, read in resolvers as ctx.identity.resolverContext.
Answers
  1. A. An additional API_KEY mode plus directives on both the query and its return type opens the catalog to anonymous callers, while the default Cognito mode and the group directive still protect price changes. B duplicates the API; C hands out long-term credentials, which is insecure; D adds a second API layer to maintain.
  2. A, E. deniedFields nulls the field for free-plan callers and resolverContext passes the tenant ID to resolvers. B is the API Gateway authorizer format; C only changes how long decisions are cached and doesn't meet either requirement; D is a schema directive, not an authorizer response field.

9. Amplify hosting and end to end tests

Concept

Exam facts

Developer angle

amplify.yml for a Vite build with a Cypress test phase:

version: 1
frontend:
  phases:
    preBuild: { commands: ["npm ci"] }
    build: { commands: ["npm run build"] }
  artifacts: { baseDirectory: dist, files: ["**/*"] }
test:
  phases:
    preTest:
      commands:
        - npm ci && npm install -g pm2 wait-on
        - npm install mochawesome mochawesome-merge mochawesome-report-generator
        - pm2 start npm -- run preview && wait-on http://localhost:4173
    test:
      commands:
        - 'npx cypress run --reporter mochawesome --reporter-options "reportDir=cypress/report/parts,overwrite=false,html=false,json=true"'
    postTest:
      commands:
        - npx mochawesome-merge cypress/report/parts/*.json > cypress/report/mochawesome.json
        - pm2 kill
  artifacts: { baseDirectory: cypress, configFilePath: '**/mochawesome.json', files: ['**/*.png', '**/*.mp4'] }

Traps

Practice questions

  1. A front-end team keeps a React single-page app in GitHub. Every pull request must get its own temporary URL for review, and every merge to main must deploy automatically, without the team managing build servers. Which solution meets these requirements with the LEAST operational overhead?

    • A. An S3 static website with a GitHub Actions workflow that runs aws s3 sync for each branch.
    • B. A CodePipeline pipeline with a CodeBuild stage and a CloudFront distribution for each environment.
    • C. An Elastic Beanstalk environment per pull request, created by a Lambda function.
    • D. Amplify Hosting connected to the repository with pull request previews turned on.
  2. A team hosts a Vue app on Amplify Hosting and is adding Cypress end-to-end tests to its builds. On every branch except experiment, the tests must run on each build so that a failing test stops the release. The experiment branch must skip them, and all branches must keep the same amplify.yml. Which TWO actions meet these requirements? (Select TWO.)

    • A. Run the tests from a CloudWatch Synthetics canary after each deployment.
    • B. Add a test section with preTest, test and postTest phases to amplify.yml.
    • C. Remove the test section from amplify.yml in the experiment branch.
    • D. Set USER_DISABLE_TESTS to false for all branches with a true override for experiment.
    • E. Turn on password protection for the experiment branch.
Answers
  1. D. Amplify Hosting builds each branch from Git and creates preview URLs for pull requests with no servers to manage. A and B need you to build and maintain the pipeline and per-branch hosting; C is a heavyweight server platform for a static site.
  2. B, D. The test phase runs Cypress between build and deploy, and USER_DISABLE_TESTS set to false for all branches with a true override for experiment skips it on that branch only, while every branch keeps the same amplify.yml. A tests after the release, too late to stop it; C gives the experiment branch its own build specification; E restricts who can view the branch but still runs the tests.

10. AppConfig feature flags validators and deployment strategies

Concept

Exam facts

Strategy Rollout Bake time (alarm watch) Intended use
AppConfig.Linear20PercentEvery6Minutes +20 % of targets every 6 minutes (30 minutes) 30 minutes Production (AWS recommended)
AppConfig.Canary10Percent20Minutes Exponential, 10 % growth factor, over 20 minutes 10 minutes Production (AWS recommended)
AppConfig.AllAtOnce All targets immediately 10 minutes Quick changes
AppConfig.Linear50PercentEvery30Seconds 50 % every 30 seconds (1 minute) 1 minute Testing and demos only

Developer angle

Create a flags profile, store a version and roll it out with alarm protection:

aws appconfig create-application --name checkout
aws appconfig create-environment --application-id "$APP_ID" --name prod \
  --monitors AlarmArn=arn:aws:cloudwatch:eu-west-1:111122223333:alarm:checkout-5xx,AlarmRoleArn=arn:aws:iam::111122223333:role/AppConfigAlarmRole
aws appconfig create-configuration-profile --application-id "$APP_ID" --name flags \
  --location-uri hosted --type AWS.AppConfig.FeatureFlags
aws appconfig create-hosted-configuration-version --application-id "$APP_ID" \
  --configuration-profile-id "$PROFILE_ID" --content-type application/json \
  --content fileb://flags.json version.json
aws appconfig start-deployment --application-id "$APP_ID" --environment-id "$ENV_ID" \
  --configuration-profile-id "$PROFILE_ID" --configuration-version 3 \
  --deployment-strategy-id AppConfig.Linear20PercentEvery6Minutes

Traps

Practice questions

  1. A developer must turn on a new checkout flow for production users gradually: 20 % more users every 6 minutes, rolled back automatically if the checkout error alarm fires during or shortly after the rollout, and without redeploying code. Which solution meets these requirements?

    • A. Store the flag in Parameter Store and change it from a scheduled Lambda function.
    • B. Use an AppConfig feature flag, a CloudWatch alarm monitor on the environment and AppConfig.Linear20PercentEvery6Minutes.
    • C. Publish a new Lambda version and shift traffic with the CodeDeploy configuration CodeDeployDefault.LambdaLinear10PercentEvery1Minute.
    • D. Deploy an AppConfig freeform profile with the AppConfig.AllAtOnce deployment strategy.
  2. A team keeps JSON configuration in the AppConfig hosted configuration store. A deployment must be rejected when the JSON doesn't have the expected structure, and also when its discountPercent exceeds the maximum stored in a pricing database. Which TWO validators should the configuration profile use? (Select TWO.)

    • A. A Parameter Store parameter policy that expires invalid parameter versions.
    • B. An S3 bucket policy that denies uploads of malformed JSON.
    • C. A JSON Schema validator that defines the required properties and their types.
    • D. A Lambda validator that compares discountPercent with the value in the pricing database.
    • E. A CloudWatch alarm monitor on the environment.
Answers
  1. B. The linear strategy adds 20 % every 6 minutes, the environment's alarm monitor triggers automatic rollback during the rollout and bake time, and the application reads the flag at run time. A has no gradual exposure or rollback; C requires a code deployment; D exposes everyone at once.
  2. C, D. JSON Schema rejects structural errors, and a Lambda validator applies the semantic rule against the database, both before the deployment starts. A and B act on other services, not AppConfig versions; E rolls back after a bad deployment instead of rejecting it beforehand.

11. SES for application email

Concept

Exam facts

Developer angle

Send through the v2 API with a configuration set and tags for event tracking:

import boto3

ses = boto3.client("sesv2")
ses.send_email(
    FromEmailAddress="noreply@example.com",
    Destination={"ToAddresses": ["customer@example.net"]},
    Content={"Simple": {"Subject": {"Data": "Your order 8812 has shipped"},
                        "Body": {"Text": {"Data": "Thanks for your order. It is on its way."}}}},
    ConfigurationSetName="order-mail",
    EmailTags=[{"Name": "campaign", "Value": "shipping-notice"}],
)

Least-privilege policy: send only from one address and only to one domain:

{ "Version": "2012-10-17",
  "Statement": [{ "Effect": "Allow", "Action": ["ses:SendEmail", "ses:SendRawEmail"], "Resource": "*",
    "Condition": { "StringEquals": { "ses:FromAddress": "noreply@example.com" },
                   "ForAllValues:StringLike": { "ses:Recipients": ["*@example.com"] } } }] }

Traps

Practice questions

  1. A developer sends order confirmations from a new AWS account with the SES API v2. Messages to colleagues whose addresses were verified arrive, but messages to customers fail with an error saying the address is not verified. What should the developer do?

    • A. Create SMTP credentials and send through the SMTP interface instead of the API.
    • B. Verify the sending domain with Easy DKIM.
    • C. Request production access to move the account out of the SES sandbox in that Region.
    • D. Add a configuration set with an SNS event destination so that bounce notifications for the failed messages are captured.
  2. A Lambda function sends notifications through SES. Security requires least privilege: the function may send only from noreply@example.com and only to addresses in the example.com domain. Which TWO policy elements meet these requirements? (Select TWO.)

    • A. A condition on ses:FromAddress with StringEquals noreply@example.com.
    • B. A condition on ses:Recipients with ForAllValues:StringLike *@example.com.
    • C. A condition on ses:FeedbackAddress set to noreply@example.com.
    • D. A sending authorization policy on the identity that names the function's role.
    • E. An ses:ApiVersion condition set to 2.
Answers
  1. C. In the sandbox, SES delivers only to verified recipients; production access removes that restriction. A and B don't lift the recipient rule (the sender is already verified); D only reports events.
  2. A, B. ses:FromAddress pins the sender and ses:Recipients with ForAllValues limits every recipient to the domain. C restricts the bounce address, not recipients; D is for delegating an identity to other accounts and adds no recipient limit; E controls the API version only.

12. OpenSearch and Athena for search and analytics

Concept

Exam facts

Developer angle

Run an Athena query from code (asynchronous: start, poll, read):

import time, boto3

athena = boto3.client("athena")
qid = athena.start_query_execution(
    QueryString="SELECT status, count(*) AS hits FROM alb_logs WHERE year = '2026' GROUP BY status",
    QueryExecutionContext={"Database": "weblogs"}, WorkGroup="analytics")["QueryExecutionId"]
state = "QUEUED"
while state in ("QUEUED", "RUNNING"):
    time.sleep(1)
    state = athena.get_query_execution(QueryExecutionId=qid)["QueryExecution"]["Status"]["State"]
rows = athena.get_query_results(QueryExecutionId=qid)["ResultSet"]["Rows"]   # check state first

Convert raw JSON logs to partitioned, compressed Parquet once, so later queries scan far less:

CREATE TABLE weblogs.alb_logs_parquet
WITH (format = 'PARQUET', parquet_compression = 'SNAPPY',
      external_location = 's3://analytics-111122223333/alb-parquet/',
      partitioned_by = ARRAY['year', 'month'])
AS SELECT request_url, status, elb_status_code, year, month FROM weblogs.alb_logs_json;

Traps

Practice questions

  1. An e-commerce app stores its products in DynamoDB keyed by product ID. Customers must be able to search by any word in a product's name or description, including partial matches, and search results must reflect changes within seconds. Which solution meets these requirements with the LEAST custom code?

    • A. Stream the table into OpenSearch Service with the DynamoDB zero-ETL integration (OpenSearch Ingestion).
    • B. Run a DynamoDB Scan with a contains() filter expression on the name and description for each search.
    • C. Add a global secondary index on the product name and query it with begins_with.
    • D. Export the table to S3 every night and run Athena queries with LIKE filters against the exported files.
  2. An analytics team uses Athena to query 5 TB of gzip-compressed JSON access logs in S3. Most queries filter on a single day, and query costs are high. Which TWO changes reduce the amount of data scanned? (Select TWO.)

    • A. Add LIMIT 100 to every query.
    • B. Convert the logs to Parquet with a CTAS query or an AWS Glue job.
    • C. Raise the per-query data usage limit in the workgroup.
    • D. Move the log objects to the S3 Intelligent-Tiering storage class.
    • E. Partition the data by date in S3 and filter on the partition column.
Answers
  1. A. The zero-ETL integration keeps an OpenSearch index in sync from the table without custom code, and OpenSearch handles full-text and partial matches. B scans the whole table on every search; C only matches prefixes of one attribute; D is batch and hours out of date.
  2. B, E. Columnar Parquet lets Athena read only the needed columns, and date partitions let it skip other days entirely. A still scans the files; C only changes a cost guardrail; D changes storage pricing, not the bytes Athena reads.

13. MSK vs Kinesis Data Streams

Concept

Exam facts

Kinesis Data Streams Amazon MSK
Unit of scale Shard: 1 MB/s or 1,000 records/s in, 2 MB/s out Partition of a topic, spread over brokers
Scaling Split and merge shards, or on-demand capacity Add partitions (never remove them), add brokers; Express brokers scale up to 20 times faster
Record or message size 1 MiB by default, up to 10 MiB when raised per stream About 1 MB by default (Kafka message.max.bytes); raise it in a custom configuration; MSK Serverless up to 8 MiB
Retention 24 hours by default, up to 365 days As long as configured (unlimited with tiered storage or MSK Serverless)
Encryption in transit TLS (HTTPS APIs) TLS-only between clients and brokers by default (TLS plus plaintext, or plaintext only, can be chosen); TLS between brokers by default
Encryption at rest KMS (optional server-side encryption) Always on, with an AWS managed or customer managed KMS key
Client authentication IAM IAM access control, SASL/SCRAM (credentials in Secrets Manager), mutual TLS (AWS Private CA) or unauthenticated; MSK Serverless: IAM only
Consumers KCL, Lambda, Firehose, Managed Service for Apache Flink Kafka clients on EC2, ECS or EKS, Lambda, Managed Service for Apache Flink, Glue streaming ETL, MSK Connect

Developer angle

Least-privilege producer policy for one topic:

{ "Version": "2012-10-17",
  "Statement": [
    { "Effect": "Allow", "Action": "kafka-cluster:Connect",
      "Resource": "arn:aws:kafka:eu-west-1:111122223333:cluster/orders-cluster/*" },
    { "Effect": "Allow", "Action": ["kafka-cluster:DescribeTopic", "kafka-cluster:WriteData"],
      "Resource": "arn:aws:kafka:eu-west-1:111122223333:topic/orders-cluster/*/orders" } ] }

Traps

Practice questions

  1. A company runs Kafka producers and consumers on premises, using the Kafka client libraries and several Kafka Connect connectors. It wants a managed AWS streaming service and the fewest code changes. Which service should it choose?

    • A. Amazon Kinesis Data Streams with the Kinesis Producer Library
    • B. Amazon SQS FIFO queues
    • C. Amazon Data Firehose
    • D. Amazon MSK
  2. A team is choosing between Kinesis Data Streams and Amazon MSK for a new event stream. Which TWO requirements point to MSK? (Select TWO.)

    • A. Existing consumers use Kafka consumer groups and must keep using the Kafka client API.
    • B. The stream must scale by splitting and merging shards.
    • C. Topic data must be retained for three years.
    • D. Consumers must use the Kinesis Client Library.
    • E. Producers must send batches with PutRecords.
Answers
  1. D. MSK is managed Apache Kafka, so the existing clients and connectors (through MSK Connect) work as they are. A and B require rewriting producers and consumers for other APIs; C delivers data to destinations and can't replace Kafka topics and consumer groups.
  2. A, C. Kafka client compatibility and multi-year retention favour MSK; KDS keeps data for at most 365 days. B, D and E are Kinesis Data Streams features.

14. ACM Private CA and Macie

Concept

Exam facts

Developer angle

# Certificate for a CloudFront distribution: request it in us-east-1, validated through DNS
aws acm request-certificate --region us-east-1 --domain-name shop.example.com \
  --subject-alternative-names www.shop.example.com --validation-method DNS
aws acm describe-certificate --region us-east-1 --certificate-arn "$CERT_ARN" \
  --query 'Certificate.DomainValidationOptions[].ResourceRecord'
# Macie: enable it, turn on automated discovery, then run a one-time job on one bucket
aws macie2 enable-macie
aws macie2 update-automated-discovery-configuration --status ENABLED
aws macie2 create-classification-job --job-type ONE_TIME --name pii-scan-uploads \
  --s3-job-definition '{"bucketDefinitions":[{"accountId":"111122223333","buckets":["customer-uploads"]}]}'

EventBridge rule pattern that sends Macie sensitive data findings to an SNS topic or a Lambda remediation function:

{ "source": ["aws.macie"], "detail-type": ["Macie Finding"], "detail": { "category": ["CLASSIFICATION"] } }

Traps

Practice questions

  1. A company serves a web application through CloudFront with an Application Load Balancer origin in eu-west-1. It needs a free public certificate for shop.example.com on the distribution that renews automatically. What should the developer do?

    • A. Request the certificate from ACM in eu-west-1 with DNS validation and attach it to the distribution.
    • B. Request the certificate from ACM in us-east-1 with DNS validation and attach it to the distribution.
    • C. Request an exportable public certificate and upload it with aws iam upload-server-certificate.
    • D. Create a private CA in AWS Private CA and issue the certificate from it.
  2. A security team must find S3 objects that contain credit card numbers across all buckets in an account and alert an on-call channel automatically for each new finding. Which TWO actions meet these requirements with the LEAST operational overhead? (Select TWO.)

    • A. Enable Amazon GuardDuty S3 Protection for the account.
    • B. Run Amazon Inspector scans against the buckets.
    • C. Generate S3 Inventory reports and scan the objects with a Lambda function that uses regular expressions.
    • D. Enable Amazon Macie with automated sensitive data discovery, or a discovery job, for the buckets.
    • E. Create an EventBridge rule for Macie findings that targets an SNS topic.
Answers
  1. B. CloudFront only uses ACM certificates from us-east-1, and DNS validation lets ACM renew automatically at no cost. A puts the certificate in a Region CloudFront can't use; C costs money and needs manual redeployment at each renewal; D issues a certificate browsers don't trust.
  2. D, E. Macie finds sensitive data in S3 and publishes each finding to EventBridge, where a rule can notify SNS. A detects threats rather than data content; B scans compute for software vulnerabilities; C is custom code to build and run.

Quick decision rules

Changed vs older material

Learn the Current column; older practice material may still show the Older material may say value. Rows you confirm are added to notes/current-facts.md (rows that already exist there for other modules are only referenced).

Topic Older material may say Current (verified 2026-10-12) Source
§1 · Map state fields Iterator and Parameters inside a Map state ItemProcessor and ItemSelector replace them (the old fields still work but are deprecated) AWS docs
§1 · Restarting failed executions A failed execution can only be started again from the beginning Redrive restarts failed, aborted or timed-out Standard executions from the failed step within 14 days (executions started on or after 15 Nov 2023) AWS docs
§4 · Data transformation language JSONPath (InputPath, Parameters, ResultSelector, ResultPath, OutputPath) is the only option Since 22 Nov 2024 JSONata (Arguments, Output, {% %}) and variables (Assign) are available; JSONPath remains the default AWS blog
§4 · State payload size 32,768 characters Unchanged since 3 Sep 2020: 256 KiB (UTF-8) per task, state or execution input or output, Standard and Express, hard quota AWS docs
§6 · Execution start and transition rates Standard: over 2,000 executions per second; Express: over 100,000 per second Documented as soft quotas: Standard StartExecution bucket 1,300 / refill 300 per second (us-east-1, us-west-2, eu-west-1; 800 / 150 elsewhere) and 5,000 or 800 state transitions per second; Express StartExecution 6,000 / 6,000 per second and unlimited transitions AWS docs
§6 · Local testing Test state machines with Step Functions Local Step Functions Local is unsupported; use the TestState API, which can mock service integrations since November 2025 AWS docs
§7 · AppSync subscription protocol WebSockets or MQTT over WebSockets Pure WebSockets only since 1 Jan 2022 AWS docs
§8 · AppSync authorization types Four: API key, IAM, OIDC, Cognito user pools Five: API_KEY, AWS_LAMBDA, AWS_IAM, OPENID_CONNECT, AMAZON_COGNITO_USER_POOLS AWS docs
§8 · AppSync custom domains Put your own CloudFront distribution in front of AppSync for a custom domain and HTTPS Native custom domain names: ACM certificate in us-east-1, AppSync-managed CloudFront distribution, /graphql and /graphql/realtime endpoints AWS docs
§9 · Building Amplify backends Amplify CLI wizard, Amplify Studio visual builder and DataStore Amplify Gen 2 (GA 6 May 2024) for new apps: TypeScript code-first backend, npx ampx sandbox, npx ampx pipeline-deploy; no Studio data modeling or DataStore in Gen 2 AWS docs · AWS blog
§10 · AppConfig configuration sources Parameter Store, SSM documents and S3 Six: hosted configuration store (recommended), S3, Parameter Store, SSM documents, Secrets Manager, CodePipeline AWS docs
§10 · Reading AppConfig data from code GetConfiguration with a client ID GetConfiguration is deprecated; use StartConfigurationSession + GetLatestConfiguration, or the AppConfig Agent (recommended) AWS docs
§10 · Feature experiments CloudWatch Evidently runs launches and A/B tests Evidently discontinued 17 Oct 2025; AppConfig feature flags, and AppConfig experimentation GA since 1 Jul 2026 (rows owned by the monitoring module) What's New
§12 · SQL on OpenSearch OpenSearch doesn't support SQL unless a plugin is enabled SQL (and PPL) through the built-in SQL plugin on domains running OpenSearch or Elasticsearch 6.5+, endpoint _plugins/_sql; the native query language is still the JSON DSL AWS docs
§12 · Firehose name Amazon Kinesis Data Firehose Amazon Data Firehose since 9 Feb 2024 (name only; row owned by the sqs-sns-kinesis module) What's New
§12 · Athena engine Built on Presto Engine version 3 tracks both Trino and Presto AWS docs
§12 · Athena query results Results must be written to an S3 bucket you provide An S3 output location, or Athena managed query results (no bucket; kept 24 hours) AWS docs
§12 · Athena federated connectors Every data source connector runs as a Lambda function in your account Since 21 Apr 2026 some newly created AWS Glue Data Catalog federated connectors register automatically and don't use a Lambda function in your account AWS docs
§12 · Dashboard service name Amazon QuickSight Amazon Quick Sight, a capability of Amazon Quick; existing QuickSight APIs and SDKs unchanged AWS docs
§13 · MSK cluster metadata MSK runs and manages ZooKeeper nodes for every cluster KRaft mode from Kafka 3.7.x; 3.9 is the last version with both modes; Kafka 4.x is KRaft-only; ZooKeeper clusters can migrate AWS docs
§13 · MSK broker storage Data always sits on EBS volumes you size Standard brokers: EBS 1–16,384 GiB per broker plus optional tiered storage; Express brokers: pay-as-you-go storage with no sizing, 3 AZs only AWS docs
§13 · Kinesis Data Streams record size 1 MB maximum Up to 10 MiB per record, opt-in per stream (default 1 MiB) since 28 Oct 2025 (row owned by the sqs-sns-kinesis module) AWS docs
§13 · Flink service name Kinesis Data Analytics for Apache Flink Amazon Managed Service for Apache Flink since 30 Aug 2023 (row owned by the sqs-sns-kinesis module) AWS blog
§14 · ACM public certificate pricing Public certificates are free and never leave ACM Non-exportable public certificates are free; exportable public certificates cost $7 per FQDN and $79 per wildcard at issuance and each renewal (row owned by the ec2 module) AWS pricing
§14 · ACM public certificate validity 13 months (395 days), renewal from 60 days before expiry 198 days, managed renewal from 45 days before expiry (since February 2026; row owned by the ec2 module) What's New