AWS gives you several ways to talk to services: the AWS SDKs (Boto3 for Python, SDK for JavaScript, Java, .NET etc), the AWS CLI, and the AWS CloudShell. For DVA-C02 you need to know how the SDKs authenticate, retry, and handle errors - not just how to call an API.
SDKs look for credentials in this order: environment variables, then the shared credentials/config file (~/.aws/credentials), then container credentials (ECS task role), then the EC2 instance metadata service (IMDS) for an instance profile role. Always prefer IAM roles over hard-coded access keys - never bake secrets into code or AMIs.
AWS SDKs retry throttled or failed requests automatically using exponential backoff with jitter. This spreads out retries so many clients do not all hammer the service at the same instant. You can tune max retry attempts and backoff strategy in the SDK config (for example retryMode 'standard' or 'adaptive' in newer SDKs). Adaptive mode also throttles the client side send rate when it detects the service is struggling.
Many write APIs (like EC2 RunInstances or SQS SendMessage with a deduplication ID) accept a client token so a retried request does not create duplicate resources. Always pass an idempotency token for any operation you might retry.
Waiters poll an API until a resource reaches a desired state (e.g. waiting for an EC2 instance to reach 'running'), saving you from writing your own polling loops. Paginators automatically handle APIs that return results in pages (using NextToken/Marker), looping through all pages for you.
The X-Ray SDK instruments your code to trace requests across microservices, showing latency and errors per segment/subsegment. Install the X-Ray daemon (or use the CloudWatch agent) to forward trace data; on Lambda, just enable Active Tracing - no daemon needed.
SDK calls throw service-specific exceptions (e.g. ThrottlingException, ProvisionedThroughputExceededException for DynamoDB). Catch these and apply backoff rather than failing immediately. HTTP 400s are client errors (fix the request), 500s are server errors (safe to retry).
Lambda runs your code without servers, billed per millisecond of execution (rounded up) plus memory allocated. You pick memory from 128 MB to 10,240 MB, and CPU scales proportionally with memory - more memory means more CPU. Default timeout is 3 seconds, maximum is 15 minutes. Deployment package (zip) limit is 50 MB zipped / 250 MB unzipped including layers; container images can go up to 10 GB.
A 'cold start' happens when Lambda provisions a fresh execution environment - this adds latency, worse for languages like Java or .NET. Provisioned concurrency keeps environments warm for predictable latency, at extra cost. Reserved concurrency caps how many concurrent executions a function can use, protecting downstream systems and other functions from being starved. Default account concurrency limit is 1,000 (soft limit, raisable).
Use environment variables for config; encrypt sensitive ones with KMS. Lambda is stateless between invocations but the execution environment can be reused, so anything initialised outside the handler (like a DB connection) persists across warm invocations - a common exam trap.
Supports REST APIs (more features, usage plans, API keys) and HTTP APIs (cheaper, faster, simpler, no usage plans). Integrates with Lambda via Lambda proxy integration, passing the full request and expecting a specific JSON response shape (statusCode, headers, body). Throttling defaults to 10,000 requests/second steady-state with a 5,000 burst, account-wide - configurable per method. Caching is REST-API only, not HTTP API.
A NoSQL key-value/document store. Partition key alone, or partition key + sort key, forms the primary key. Read/write capacity modes: on-demand (pay per request, scales automatically) or provisioned (set RCU/WCU, can use auto scaling). One RCU = one strongly consistent read of up to 4 KB/second (or two eventually consistent reads). One WCU = one write of up to 1 KB/second. Item size limit is 400 KB.
DAX is an in-memory cache for DynamoDB, cutting read latency to microseconds - it sits in front, transparent to your app code. Streams capture item-level changes and can trigger Lambda functions. Global Secondary Indexes (GSI) can use different partition/sort keys and have their own capacity; Local Secondary Indexes (LSI) share the base table's partition key and must be created at table creation time.
Don't confuse Lambda timeout (max 15 min) with API Gateway's own 29-second maximum integration timeout - a long Lambda behind API Gateway will still fail after 29 seconds. Don't forget IAM execution roles - Lambda needs a role attached even if it does nothing but write logs. Remember DynamoDB is eventually consistent by default unless you explicitly request strongly consistent reads.
IAM is global, not regional. Every request is evaluated as an explicit DENY beats an explicit ALLOW, which beats the default implicit DENY. New identities have no permissions until a policy grants them.
Cognito has two separate pools and mixing them up is the classic trap.
KMS manages Customer Master Keys (CMKs, now called KMS keys) used to encrypt data, never the data itself directly for large payloads.
Both store config, but the exam tests the differences hard.
CI/CD pipelines automate build, test and release so code ships safely and often. The exam leans on three services working together: CodeCommit (or GitHub) for source, CodeBuild for build/test, CodeDeploy for release, all orchestrated by CodePipeline.
CloudWatch is the default monitoring backbone for AWS. Every service pushes metrics automatically at 5-minute intervals (standard resolution). Enable Detailed Monitoring on EC2 to get 1-minute granularity - this costs extra and is NOT on by default.
Custom metrics are published with PutMetricData. You can go below 1 minute using High-Resolution metrics (down to 1 second), but this needs the StorageResolution parameter set to 1.
CloudWatch automatically 'rolls up' older data to coarser resolution - it does not delete it early.
An alarm watches a single metric (or a metric math expression) over a number of evaluation periods and moves between OK, ALARM and INSUFFICIENT_DATA states. Composite alarms combine multiple alarms with AND/OR logic. Alarms can trigger SNS notifications, Auto Scaling actions, or EC2 actions (stop, terminate, reboot, recover).
CloudWatch Logs organises data into Log Groups then Log Streams. Set retention per log group (default is Never Expire, which quietly costs money forever - a classic gotcha). Use Metric Filters to turn log patterns (like ERROR strings) into numeric CloudWatch metrics you can alarm on. Subscription Filters stream logs in near real time to Lambda, Kinesis or OpenSearch for further processing. CloudWatch Logs Insights lets you query log data with its own query language without building a pipeline first.
EventBridge (the evolution of CloudWatch Events) reacts to AWS service state changes or scheduled rules (cron/rate expressions) and routes them to targets like Lambda or SNS.
X-Ray traces a request as it moves through microservices, showing a service map and latency breakdown per hop (called segments and subsegments). You must install the X-Ray daemon (or use the built-in agent on Lambda) and instrument your code with the X-Ray SDK. Annotations are indexed key-value pairs you can filter traces by; metadata is not indexed and is for extra context only. Sampling defaults to recording the first request each second plus 5% of additional requests - tune this with sampling rules to control cost.
DVA-C02 tests whether you can spot performance and cost problems in code and infrastructure, then fix them using the right AWS feature rather than brute-force scaling. Exam questions usually describe a slow, expensive, or throttled app and ask what change fixes it cheapest/fastest.