dojo.md 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/courses/GENERATION_LOG.md +45 -0
- package/courses/aws-lambda-debugging/course.yaml +11 -0
- package/courses/aws-lambda-debugging/scenarios/level-1/api-gateway-integration.yaml +71 -0
- package/courses/aws-lambda-debugging/scenarios/level-1/cloudwatch-logs-basics.yaml +64 -0
- package/courses/aws-lambda-debugging/scenarios/level-1/cold-start-basics.yaml +70 -0
- package/courses/aws-lambda-debugging/scenarios/level-1/environment-variable-issues.yaml +72 -0
- package/courses/aws-lambda-debugging/scenarios/level-1/first-debugging-shift.yaml +73 -0
- package/courses/aws-lambda-debugging/scenarios/level-1/handler-import-errors.yaml +71 -0
- package/courses/aws-lambda-debugging/scenarios/level-1/iam-permission-errors.yaml +68 -0
- package/courses/aws-lambda-debugging/scenarios/level-1/invocation-errors.yaml +72 -0
- package/courses/aws-lambda-debugging/scenarios/level-1/lambda-timeout-errors.yaml +65 -0
- package/courses/aws-lambda-debugging/scenarios/level-1/memory-and-oom.yaml +70 -0
- package/courses/aws-lambda-debugging/scenarios/level-2/async-invocation-failures.yaml +72 -0
- package/courses/aws-lambda-debugging/scenarios/level-2/cold-start-optimization.yaml +76 -0
- package/courses/aws-lambda-debugging/scenarios/level-2/dynamodb-streams-debugging.yaml +70 -0
- package/courses/aws-lambda-debugging/scenarios/level-2/intermediate-debugging-shift.yaml +71 -0
- package/courses/aws-lambda-debugging/scenarios/level-2/lambda-concurrency-management.yaml +70 -0
- package/courses/aws-lambda-debugging/scenarios/level-2/lambda-layers-debugging.yaml +76 -0
- package/courses/aws-lambda-debugging/scenarios/level-2/sam-local-debugging.yaml +74 -0
- package/courses/aws-lambda-debugging/scenarios/level-2/sqs-event-source.yaml +72 -0
- package/courses/aws-lambda-debugging/scenarios/level-2/vpc-networking-issues.yaml +71 -0
- package/courses/aws-lambda-debugging/scenarios/level-2/xray-tracing.yaml +62 -0
- package/courses/aws-lambda-debugging/scenarios/level-3/advanced-debugging-shift.yaml +72 -0
- package/courses/aws-lambda-debugging/scenarios/level-3/container-image-lambda.yaml +79 -0
- package/courses/aws-lambda-debugging/scenarios/level-3/cross-account-invocation.yaml +72 -0
- package/courses/aws-lambda-debugging/scenarios/level-3/eventbridge-patterns.yaml +79 -0
- package/courses/aws-lambda-debugging/scenarios/level-3/iac-deployment-debugging.yaml +68 -0
- package/courses/aws-lambda-debugging/scenarios/level-3/kinesis-stream-processing.yaml +64 -0
- package/courses/aws-lambda-debugging/scenarios/level-3/lambda-at-edge.yaml +64 -0
- package/courses/aws-lambda-debugging/scenarios/level-3/lambda-extensions-debugging.yaml +67 -0
- package/courses/aws-lambda-debugging/scenarios/level-3/powertools-observability.yaml +79 -0
- package/courses/aws-lambda-debugging/scenarios/level-3/step-functions-debugging.yaml +80 -0
- package/courses/aws-lambda-debugging/scenarios/level-4/cost-optimization-strategy.yaml +67 -0
- package/courses/aws-lambda-debugging/scenarios/level-4/expert-debugging-shift.yaml +62 -0
- package/courses/aws-lambda-debugging/scenarios/level-4/incident-management-serverless.yaml +61 -0
- package/courses/aws-lambda-debugging/scenarios/level-4/multi-region-serverless.yaml +67 -0
- package/courses/aws-lambda-debugging/scenarios/level-4/observability-platform-design.yaml +71 -0
- package/courses/aws-lambda-debugging/scenarios/level-4/serverless-architecture-design.yaml +64 -0
- package/courses/aws-lambda-debugging/scenarios/level-4/serverless-data-architecture.yaml +66 -0
- package/courses/aws-lambda-debugging/scenarios/level-4/serverless-migration-strategy.yaml +65 -0
- package/courses/aws-lambda-debugging/scenarios/level-4/serverless-security-design.yaml +60 -0
- package/courses/aws-lambda-debugging/scenarios/level-4/serverless-testing-strategy.yaml +62 -0
- package/courses/aws-lambda-debugging/scenarios/level-5/board-serverless-strategy.yaml +63 -0
- package/courses/aws-lambda-debugging/scenarios/level-5/consulting-serverless-adoption.yaml +57 -0
- package/courses/aws-lambda-debugging/scenarios/level-5/industry-serverless-patterns.yaml +62 -0
- package/courses/aws-lambda-debugging/scenarios/level-5/ma-serverless-integration.yaml +75 -0
- package/courses/aws-lambda-debugging/scenarios/level-5/master-debugging-shift.yaml +61 -0
- package/courses/aws-lambda-debugging/scenarios/level-5/organizational-serverless-transformation.yaml +65 -0
- package/courses/aws-lambda-debugging/scenarios/level-5/regulatory-serverless.yaml +61 -0
- package/courses/aws-lambda-debugging/scenarios/level-5/serverless-economics.yaml +65 -0
- package/courses/aws-lambda-debugging/scenarios/level-5/serverless-future-technology.yaml +66 -0
- package/courses/aws-lambda-debugging/scenarios/level-5/serverless-platform-design.yaml +71 -0
- package/courses/docker-container-debugging/course.yaml +11 -0
- package/courses/docker-container-debugging/scenarios/level-1/container-exit-codes.yaml +59 -0
- package/courses/docker-container-debugging/scenarios/level-1/container-networking-basics.yaml +69 -0
- package/courses/docker-container-debugging/scenarios/level-1/docker-logs-debugging.yaml +67 -0
- package/courses/docker-container-debugging/scenarios/level-1/dockerfile-build-failures.yaml +71 -0
- package/courses/docker-container-debugging/scenarios/level-1/environment-variable-issues.yaml +74 -0
- package/courses/docker-container-debugging/scenarios/level-1/first-debugging-shift.yaml +70 -0
- package/courses/docker-container-debugging/scenarios/level-1/image-pull-failures.yaml +68 -0
- package/courses/docker-container-debugging/scenarios/level-1/port-mapping-issues.yaml +67 -0
- package/courses/docker-container-debugging/scenarios/level-1/resource-limits-oom.yaml +70 -0
- package/courses/docker-container-debugging/scenarios/level-1/volume-mount-problems.yaml +66 -0
- package/courses/docker-container-debugging/scenarios/level-2/container-health-checks.yaml +73 -0
- package/courses/docker-container-debugging/scenarios/level-2/docker-compose-debugging.yaml +66 -0
- package/courses/docker-container-debugging/scenarios/level-2/docker-exec-debugging.yaml +71 -0
- package/courses/docker-container-debugging/scenarios/level-2/image-layer-optimization.yaml +81 -0
- package/courses/docker-container-debugging/scenarios/level-2/intermediate-debugging-shift.yaml +73 -0
- package/courses/docker-container-debugging/scenarios/level-2/logging-and-log-rotation.yaml +76 -0
- package/courses/docker-container-debugging/scenarios/level-2/multi-stage-build-debugging.yaml +76 -0
- package/courses/docker-container-debugging/scenarios/level-2/network-debugging-tools.yaml +67 -0
- package/courses/docker-container-debugging/scenarios/level-2/pid1-signal-handling.yaml +71 -0
- package/courses/docker-container-debugging/scenarios/level-2/security-scanning-basics.yaml +67 -0
- package/courses/docker-container-debugging/scenarios/level-3/advanced-debugging-shift.yaml +77 -0
- package/courses/docker-container-debugging/scenarios/level-3/buildkit-optimization.yaml +67 -0
- package/courses/docker-container-debugging/scenarios/level-3/container-filesystem-debugging.yaml +70 -0
- package/courses/docker-container-debugging/scenarios/level-3/container-security-hardening.yaml +74 -0
- package/courses/docker-container-debugging/scenarios/level-3/disk-space-management.yaml +74 -0
- package/courses/docker-container-debugging/scenarios/level-3/docker-api-automation.yaml +72 -0
- package/courses/docker-container-debugging/scenarios/level-3/docker-daemon-issues.yaml +73 -0
- package/courses/docker-container-debugging/scenarios/level-3/docker-in-docker-ci.yaml +69 -0
- package/courses/docker-container-debugging/scenarios/level-3/overlay-network-debugging.yaml +70 -0
- package/courses/docker-container-debugging/scenarios/level-3/production-container-ops.yaml +71 -0
- package/courses/docker-container-debugging/scenarios/level-4/cicd-pipeline-design.yaml +66 -0
- package/courses/docker-container-debugging/scenarios/level-4/container-monitoring-observability.yaml +63 -0
- package/courses/docker-container-debugging/scenarios/level-4/container-orchestration-strategy.yaml +62 -0
- package/courses/docker-container-debugging/scenarios/level-4/container-performance-engineering.yaml +64 -0
- package/courses/docker-container-debugging/scenarios/level-4/container-security-architecture.yaml +66 -0
- package/courses/docker-container-debugging/scenarios/level-4/enterprise-image-management.yaml +58 -0
- package/courses/docker-container-debugging/scenarios/level-4/expert-debugging-shift.yaml +63 -0
- package/courses/docker-container-debugging/scenarios/level-4/incident-response-containers.yaml +70 -0
- package/courses/docker-container-debugging/scenarios/level-4/multi-environment-management.yaml +65 -0
- package/courses/docker-container-debugging/scenarios/level-4/stateful-service-containers.yaml +65 -0
- package/courses/docker-container-debugging/scenarios/level-5/board-infrastructure-strategy.yaml +58 -0
- package/courses/docker-container-debugging/scenarios/level-5/consulting-container-strategy.yaml +61 -0
- package/courses/docker-container-debugging/scenarios/level-5/container-platform-architecture.yaml +67 -0
- package/courses/docker-container-debugging/scenarios/level-5/container-platform-economics.yaml +67 -0
- package/courses/docker-container-debugging/scenarios/level-5/container-technology-evolution.yaml +67 -0
- package/courses/docker-container-debugging/scenarios/level-5/disaster-recovery-containers.yaml +66 -0
- package/courses/docker-container-debugging/scenarios/level-5/industry-container-patterns.yaml +71 -0
- package/courses/docker-container-debugging/scenarios/level-5/master-debugging-shift.yaml +62 -0
- package/courses/docker-container-debugging/scenarios/level-5/organizational-transformation.yaml +67 -0
- package/courses/docker-container-debugging/scenarios/level-5/regulatory-compliance-containers.yaml +61 -0
- package/courses/kubernetes-deployment-troubleshooting/course.yaml +12 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/configmap-secret-issues.yaml +69 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/crashloopbackoff.yaml +68 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/deployment-rollout.yaml +56 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/first-troubleshooting-shift.yaml +65 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/health-probe-failures.yaml +70 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/imagepullbackoff.yaml +57 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/kubectl-debugging-basics.yaml +56 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/oomkilled.yaml +70 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/pending-pods.yaml +68 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/service-not-reachable.yaml +66 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/dns-resolution-failures.yaml +63 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/helm-deployment-failures.yaml +63 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/hpa-scaling-issues.yaml +62 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/ingress-routing-issues.yaml +63 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/init-container-failures.yaml +63 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/intermediate-troubleshooting-shift.yaml +66 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/network-policy-blocking.yaml +67 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/persistent-volume-issues.yaml +69 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/rbac-permission-denied.yaml +57 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/resource-quota-limits.yaml +64 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/advanced-troubleshooting-shift.yaml +69 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/cluster-upgrade-failures.yaml +71 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/gitops-drift-detection.yaml +62 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/job-cronjob-failures.yaml +67 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/monitoring-alerting-gaps.yaml +64 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/multi-container-debugging.yaml +68 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/node-pressure-evictions.yaml +70 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/pod-disruption-budgets.yaml +59 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/service-mesh-debugging.yaml +64 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/statefulset-troubleshooting.yaml +69 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/capacity-planning.yaml +65 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/cost-optimization.yaml +57 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/disaster-recovery-design.yaml +56 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/executive-communication.yaml +62 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/expert-troubleshooting-shift.yaml +65 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/incident-management-process.yaml +59 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/multi-cluster-operations.yaml +62 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/multi-tenancy-design.yaml +55 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/platform-engineering.yaml +59 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/security-hardening.yaml +58 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/behavioral-science.yaml +62 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/board-strategy.yaml +61 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/cloud-native-future.yaml +65 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/comprehensive-platform.yaml +57 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/consulting-engagement.yaml +62 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/industry-benchmarks.yaml +58 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/ma-integration.yaml +62 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/master-troubleshooting-shift.yaml +73 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/product-development.yaml +65 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/regulatory-compliance.yaml +76 -0
- package/courses/mysql-query-optimization/course.yaml +11 -0
- package/courses/mysql-query-optimization/scenarios/level-1/buffer-pool-basics.yaml +65 -0
- package/courses/mysql-query-optimization/scenarios/level-1/explain-basics.yaml +66 -0
- package/courses/mysql-query-optimization/scenarios/level-1/first-optimization-shift.yaml +78 -0
- package/courses/mysql-query-optimization/scenarios/level-1/innodb-index-fundamentals.yaml +68 -0
- package/courses/mysql-query-optimization/scenarios/level-1/join-basics.yaml +66 -0
- package/courses/mysql-query-optimization/scenarios/level-1/n-plus-one-queries.yaml +67 -0
- package/courses/mysql-query-optimization/scenarios/level-1/query-rewriting-basics.yaml +66 -0
- package/courses/mysql-query-optimization/scenarios/level-1/select-star-problems.yaml +68 -0
- package/courses/mysql-query-optimization/scenarios/level-1/slow-query-diagnosis.yaml +65 -0
- package/courses/mysql-query-optimization/scenarios/level-1/where-clause-optimization.yaml +65 -0
- package/courses/mysql-query-optimization/scenarios/level-2/buffer-pool-tuning.yaml +64 -0
- package/courses/mysql-query-optimization/scenarios/level-2/composite-index-design.yaml +71 -0
- package/courses/mysql-query-optimization/scenarios/level-2/covering-and-invisible-indexes.yaml +69 -0
- package/courses/mysql-query-optimization/scenarios/level-2/cte-and-window-functions.yaml +78 -0
- package/courses/mysql-query-optimization/scenarios/level-2/intermediate-optimization-shift.yaml +68 -0
- package/courses/mysql-query-optimization/scenarios/level-2/join-optimization.yaml +67 -0
- package/courses/mysql-query-optimization/scenarios/level-2/performance-schema-analysis.yaml +69 -0
- package/courses/mysql-query-optimization/scenarios/level-2/query-optimizer-hints.yaml +74 -0
- package/courses/mysql-query-optimization/scenarios/level-2/subquery-optimization.yaml +70 -0
- package/courses/mysql-query-optimization/scenarios/level-2/write-optimization.yaml +63 -0
- package/courses/mysql-query-optimization/scenarios/level-3/advanced-optimization-shift.yaml +71 -0
- package/courses/mysql-query-optimization/scenarios/level-3/connection-management.yaml +67 -0
- package/courses/mysql-query-optimization/scenarios/level-3/full-text-search.yaml +77 -0
- package/courses/mysql-query-optimization/scenarios/level-3/json-optimization.yaml +87 -0
- package/courses/mysql-query-optimization/scenarios/level-3/lock-contention-analysis.yaml +68 -0
- package/courses/mysql-query-optimization/scenarios/level-3/monitoring-alerting.yaml +63 -0
- package/courses/mysql-query-optimization/scenarios/level-3/online-schema-changes.yaml +79 -0
- package/courses/mysql-query-optimization/scenarios/level-3/partitioning-strategies.yaml +83 -0
- package/courses/mysql-query-optimization/scenarios/level-3/query-profiling-deep-dive.yaml +84 -0
- package/courses/mysql-query-optimization/scenarios/level-3/replication-optimization.yaml +66 -0
- package/courses/mysql-query-optimization/scenarios/level-4/aurora-vs-rds-evaluation.yaml +61 -0
- package/courses/mysql-query-optimization/scenarios/level-4/data-architecture.yaml +62 -0
- package/courses/mysql-query-optimization/scenarios/level-4/database-migration-planning.yaml +59 -0
- package/courses/mysql-query-optimization/scenarios/level-4/enterprise-governance.yaml +50 -0
- package/courses/mysql-query-optimization/scenarios/level-4/executive-communication.yaml +54 -0
- package/courses/mysql-query-optimization/scenarios/level-4/expert-optimization-shift.yaml +67 -0
- package/courses/mysql-query-optimization/scenarios/level-4/high-availability-architecture.yaml +60 -0
- package/courses/mysql-query-optimization/scenarios/level-4/optimizer-internals.yaml +62 -0
- package/courses/mysql-query-optimization/scenarios/level-4/performance-sla-design.yaml +52 -0
- package/courses/mysql-query-optimization/scenarios/level-4/read-replica-scaling.yaml +51 -0
- package/courses/mysql-query-optimization/scenarios/level-5/ai-database-future.yaml +45 -0
- package/courses/mysql-query-optimization/scenarios/level-5/behavioral-science.yaml +44 -0
- package/courses/mysql-query-optimization/scenarios/level-5/benchmark-design.yaml +47 -0
- package/courses/mysql-query-optimization/scenarios/level-5/board-strategy.yaml +48 -0
- package/courses/mysql-query-optimization/scenarios/level-5/comprehensive-platform.yaml +49 -0
- package/courses/mysql-query-optimization/scenarios/level-5/consulting-engagement.yaml +52 -0
- package/courses/mysql-query-optimization/scenarios/level-5/ma-database-integration.yaml +47 -0
- package/courses/mysql-query-optimization/scenarios/level-5/master-optimization-shift.yaml +56 -0
- package/courses/mysql-query-optimization/scenarios/level-5/product-development.yaml +48 -0
- package/courses/mysql-query-optimization/scenarios/level-5/regulatory-compliance.yaml +48 -0
- package/courses/postgresql-query-optimization/scenarios/level-5/comprehensive-database-system.yaml +70 -0
- package/courses/postgresql-query-optimization/scenarios/level-5/database-ai-future.yaml +81 -0
- package/courses/postgresql-query-optimization/scenarios/level-5/database-behavioral-science.yaml +63 -0
- package/courses/postgresql-query-optimization/scenarios/level-5/database-board-strategy.yaml +77 -0
- package/courses/postgresql-query-optimization/scenarios/level-5/database-consulting-engagement.yaml +61 -0
- package/courses/postgresql-query-optimization/scenarios/level-5/database-industry-benchmarks.yaml +64 -0
- package/courses/postgresql-query-optimization/scenarios/level-5/database-ma-integration.yaml +71 -0
- package/courses/postgresql-query-optimization/scenarios/level-5/database-product-development.yaml +72 -0
- package/courses/postgresql-query-optimization/scenarios/level-5/database-regulatory-landscape.yaml +76 -0
- package/courses/postgresql-query-optimization/scenarios/level-5/master-optimization-shift.yaml +66 -0
- package/courses/terraform-infrastructure-setup/course.yaml +11 -0
- package/courses/terraform-infrastructure-setup/scenarios/level-1/terraform-init-errors.yaml +72 -0
- package/dist/mcp/session-manager.d.ts +7 -4
- package/dist/mcp/session-manager.d.ts.map +1 -1
- package/dist/mcp/session-manager.js +23 -8
- package/dist/mcp/session-manager.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
meta:
|
|
2
|
+
id: invocation-errors
|
|
3
|
+
level: 1
|
|
4
|
+
course: aws-lambda-debugging
|
|
5
|
+
type: output
|
|
6
|
+
description: "Debug Lambda invocation errors — diagnose throttling, concurrency limits, and invocation type differences (sync vs async)"
|
|
7
|
+
tags: [AWS, Lambda, invocation, throttling, concurrency, sync-async, beginner]
|
|
8
|
+
|
|
9
|
+
state: {}
|
|
10
|
+
|
|
11
|
+
trigger: |
|
|
12
|
+
Your Lambda function starts returning errors during a traffic spike:
|
|
13
|
+
|
|
14
|
+
$ aws lambda invoke --function-name process-order output.json
|
|
15
|
+
{
|
|
16
|
+
"StatusCode": 429,
|
|
17
|
+
"FunctionError": "Unhandled"
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
$ cat output.json
|
|
21
|
+
{
|
|
22
|
+
"errorType": "TooManyRequestsException",
|
|
23
|
+
"errorMessage": "Rate exceeded"
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
CloudWatch metrics show:
|
|
27
|
+
- Throttles: 1,500 (these are rejected requests!)
|
|
28
|
+
- ConcurrentExecutions: 1,000 (account limit)
|
|
29
|
+
- Errors: 200 (actual function errors)
|
|
30
|
+
- Invocations: 8,300
|
|
31
|
+
|
|
32
|
+
The account has a default concurrency limit of 1,000 across ALL
|
|
33
|
+
Lambda functions. Your function is consuming 800 concurrent
|
|
34
|
+
executions, starving other functions.
|
|
35
|
+
|
|
36
|
+
Important: Throttles are NOT counted in Invocations or Errors
|
|
37
|
+
metrics! You must monitor the Throttles metric separately.
|
|
38
|
+
|
|
39
|
+
Understanding invocation types:
|
|
40
|
+
|
|
41
|
+
Synchronous (RequestResponse):
|
|
42
|
+
- API Gateway, CLI invoke, SDK invoke
|
|
43
|
+
- Caller waits for response
|
|
44
|
+
- Throttled: returns 429 immediately
|
|
45
|
+
- Errors: returned to caller
|
|
46
|
+
|
|
47
|
+
Asynchronous (Event):
|
|
48
|
+
- S3 events, SNS, EventBridge
|
|
49
|
+
- Caller gets 202 Accepted immediately
|
|
50
|
+
- Lambda retries twice on failure
|
|
51
|
+
- Throttled: Lambda retries with backoff for up to 6 hours
|
|
52
|
+
- Failed after retries: sent to DLQ or destination
|
|
53
|
+
|
|
54
|
+
Task: Explain Lambda invocation debugging. Write: synchronous vs
|
|
55
|
+
asynchronous invocation differences, throttling (what it is, how
|
|
56
|
+
to detect, how to fix), concurrency limits (account vs function
|
|
57
|
+
reserved), the retry behavior for each invocation type, and how
|
|
58
|
+
to monitor invocation health.
|
|
59
|
+
|
|
60
|
+
assertions:
|
|
61
|
+
- type: llm_judge
|
|
62
|
+
criteria: "Invocation types are explained — synchronous: caller waits, gets response or error. Used by API Gateway, CLI, SDK. Asynchronous: caller gets 202 immediately, Lambda processes in background. Used by S3, SNS, EventBridge. Lambda retries async failures twice (3 total attempts). Poll-based: Lambda polls event source (SQS, Kinesis, DynamoDB Streams) — behaves differently for each. Understanding invocation type is critical because error handling, retry behavior, and throttling behavior differ for each"
|
|
63
|
+
weight: 0.35
|
|
64
|
+
description: "Invocation types"
|
|
65
|
+
- type: llm_judge
|
|
66
|
+
criteria: "Throttling and concurrency are covered — default account limit: 1,000 concurrent executions (can be increased via support). Throttling = requests rejected when concurrency limit reached. Throttles metric: must monitor separately (not counted in Invocations or Errors!). Reserved concurrency: guarantee capacity for a function (but limits it too). Provisioned concurrency: pre-warm environments for consistent latency. Fix throttling: request limit increase, use reserved concurrency to protect critical functions, implement backoff in callers, use SQS to buffer requests"
|
|
67
|
+
weight: 0.35
|
|
68
|
+
description: "Throttling and concurrency"
|
|
69
|
+
- type: llm_judge
|
|
70
|
+
criteria: "Monitoring and retry behavior are practical — monitor: Invocations, Errors, Throttles, Duration, ConcurrentExecutions. Set alarms on: Throttles > 0, Error rate > 5%, Duration approaching timeout. Retry behavior: sync — no automatic retry (caller must retry), async — 2 retries with exponential backoff, then DLQ/destination. SQS: retries based on visibility timeout, then DLQ. Kinesis/DynamoDB Streams: retries until record expires or succeeds (can block shard). Configure maxRetryAttempts and DLQ for each invocation pattern"
|
|
71
|
+
weight: 0.30
|
|
72
|
+
description: "Monitoring and retry"
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
meta:
|
|
2
|
+
id: lambda-timeout-errors
|
|
3
|
+
level: 1
|
|
4
|
+
course: aws-lambda-debugging
|
|
5
|
+
type: output
|
|
6
|
+
description: "Debug Lambda timeout errors — diagnose why functions exceed their configured timeout and how to fix common timeout causes"
|
|
7
|
+
tags: [AWS, Lambda, timeout, duration, configuration, beginner]
|
|
8
|
+
|
|
9
|
+
state: {}
|
|
10
|
+
|
|
11
|
+
trigger: |
|
|
12
|
+
Your Lambda function fails with a timeout error:
|
|
13
|
+
|
|
14
|
+
$ aws lambda invoke --function-name process-order output.json
|
|
15
|
+
{
|
|
16
|
+
"StatusCode": 200,
|
|
17
|
+
"FunctionError": "Unhandled",
|
|
18
|
+
"ExecutedVersion": "$LATEST"
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
$ cat output.json
|
|
22
|
+
{
|
|
23
|
+
"errorMessage": "2024-12-01T10:00:00.000Z abc-123 Task timed out after 3.00 seconds"
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
CloudWatch Logs:
|
|
27
|
+
START RequestId: abc-123 Version: $LATEST
|
|
28
|
+
2024-12-01T10:00:00.000Z abc-123 Connecting to database...
|
|
29
|
+
2024-12-01T10:00:03.000Z abc-123 Task timed out after 3.00 seconds
|
|
30
|
+
END RequestId: abc-123
|
|
31
|
+
REPORT RequestId: abc-123 Duration: 3001.45 ms
|
|
32
|
+
Billed Duration: 3000 ms Memory Size: 128 MB Max Memory Used: 65 MB
|
|
33
|
+
|
|
34
|
+
The function has a 3-second timeout (default) but the database
|
|
35
|
+
connection takes 4+ seconds on cold start. The function never
|
|
36
|
+
reaches the actual business logic.
|
|
37
|
+
|
|
38
|
+
Fix options:
|
|
39
|
+
1. Increase timeout: aws lambda update-function-configuration \
|
|
40
|
+
--function-name process-order --timeout 30
|
|
41
|
+
2. Optimize: connection pooling, move DB connection outside handler
|
|
42
|
+
3. Use RDS Proxy for faster connection establishment
|
|
43
|
+
|
|
44
|
+
But setting timeout too high is also a problem — if the function
|
|
45
|
+
hangs, you pay for the full duration (max 15 minutes).
|
|
46
|
+
|
|
47
|
+
Task: Explain Lambda timeout debugging. Write: what the timeout
|
|
48
|
+
error means, how to read the REPORT line (Duration, Billed Duration,
|
|
49
|
+
Memory), common timeout causes (DB connections, API calls, large
|
|
50
|
+
payloads), how to set appropriate timeouts, and the relationship
|
|
51
|
+
between Lambda timeout and API Gateway timeout (29 seconds max).
|
|
52
|
+
|
|
53
|
+
assertions:
|
|
54
|
+
- type: llm_judge
|
|
55
|
+
criteria: "Timeout mechanics are explained — Lambda timeout is configurable (default 3 seconds, max 15 minutes). When exceeded, Lambda kills the execution and returns a Task timed out error. The REPORT line shows: Duration (actual execution time), Billed Duration (rounded up to nearest ms or 1ms minimum), Memory Size (configured), Max Memory Used (peak). Billed for full timeout duration if it times out. CloudWatch Logs show what happened before timeout"
|
|
56
|
+
weight: 0.35
|
|
57
|
+
description: "Timeout mechanics"
|
|
58
|
+
- type: llm_judge
|
|
59
|
+
criteria: "Common causes and fixes are covered — database connections on cold start (use connection pooling, RDS Proxy, initialize outside handler for reuse), external API calls without timeout (always set HTTP timeout shorter than Lambda timeout), large S3 file processing (stream instead of loading entirely into memory), cold start initialization (heavy imports, large packages). Set Lambda timeout slightly higher than expected max duration. API Gateway has a hard 29-second limit — Lambda behind API GW must complete within 29s"
|
|
60
|
+
weight: 0.35
|
|
61
|
+
description: "Causes and fixes"
|
|
62
|
+
- type: llm_judge
|
|
63
|
+
criteria: "Best practices are practical — set timeout based on p99 duration + buffer (not arbitrary large values). Monitor with CloudWatch Duration metric. Alert when duration approaches timeout. Use X-Ray to identify slow segments. Move initialization code outside handler (runs once per cold start, reused on warm invocations). Set HTTP client timeouts shorter than Lambda timeout to get a proper error instead of Lambda timeout. For long-running tasks: use Step Functions, SQS, or async invocation instead of increasing Lambda timeout"
|
|
64
|
+
weight: 0.30
|
|
65
|
+
description: "Best practices"
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
meta:
|
|
2
|
+
id: memory-and-oom
|
|
3
|
+
level: 1
|
|
4
|
+
course: aws-lambda-debugging
|
|
5
|
+
type: output
|
|
6
|
+
description: "Debug Lambda memory issues — diagnose out-of-memory errors, understand memory-CPU relationship, and right-size Lambda functions"
|
|
7
|
+
tags: [AWS, Lambda, memory, OOM, right-sizing, configuration, beginner]
|
|
8
|
+
|
|
9
|
+
state: {}
|
|
10
|
+
|
|
11
|
+
trigger: |
|
|
12
|
+
Your Lambda function fails intermittently with large payloads:
|
|
13
|
+
|
|
14
|
+
{
|
|
15
|
+
"errorType": "Runtime.ExitError",
|
|
16
|
+
"errorMessage": "RequestId: abc-123 Error: Runtime exited with
|
|
17
|
+
error: signal: killed"
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
CloudWatch REPORT line:
|
|
21
|
+
REPORT RequestId: abc-123 Duration: 4521.00 ms
|
|
22
|
+
Billed Duration: 4521 ms Memory Size: 128 MB
|
|
23
|
+
Max Memory Used: 128 MB
|
|
24
|
+
|
|
25
|
+
Max Memory Used equals Memory Size — the function ran out of memory
|
|
26
|
+
and was killed by the OOM killer. "signal: killed" = SIGKILL from
|
|
27
|
+
the system.
|
|
28
|
+
|
|
29
|
+
The function processes CSV files from S3. Small files work (< 5MB),
|
|
30
|
+
large files fail because loading the entire file into memory exceeds
|
|
31
|
+
128MB.
|
|
32
|
+
|
|
33
|
+
Fix options:
|
|
34
|
+
1. Increase memory:
|
|
35
|
+
aws lambda update-function-configuration \
|
|
36
|
+
--function-name process-csv --memory-size 512
|
|
37
|
+
|
|
38
|
+
2. Stream processing — read the file in chunks instead of loading
|
|
39
|
+
it entirely into memory.
|
|
40
|
+
|
|
41
|
+
Important: Lambda memory also controls CPU allocation!
|
|
42
|
+
- 128 MB = ~0.08 vCPU (very slow)
|
|
43
|
+
- 512 MB = ~0.3 vCPU
|
|
44
|
+
- 1769 MB = 1 vCPU
|
|
45
|
+
- 3538 MB = 2 vCPU
|
|
46
|
+
- 10240 MB = 6 vCPU (maximum)
|
|
47
|
+
|
|
48
|
+
A function at 128MB runs on a fraction of a CPU. Increasing memory
|
|
49
|
+
to 256MB might actually DECREASE total cost because the function
|
|
50
|
+
runs 3x faster (more CPU) even though per-ms cost doubles.
|
|
51
|
+
|
|
52
|
+
Task: Explain Lambda memory debugging. Write: how to identify OOM
|
|
53
|
+
errors (signal: killed, Max Memory Used = Memory Size), the
|
|
54
|
+
memory-CPU relationship, how to right-size memory (AWS Lambda
|
|
55
|
+
Power Tuning), common memory-hungry operations (loading files,
|
|
56
|
+
large JSON parsing), and cost optimization through memory tuning.
|
|
57
|
+
|
|
58
|
+
assertions:
|
|
59
|
+
- type: llm_judge
|
|
60
|
+
criteria: "OOM identification is explained — signal: killed or Runtime.ExitError with killed means OOM. Check REPORT line: if Max Memory Used equals or is very close to Memory Size, function ran out of memory. Memory includes: your code, runtime, libraries, and all variables/data in memory. /tmp directory has separate 512MB-10GB allocation (configurable). Lambda memory range: 128MB to 10,240MB in 1MB increments"
|
|
61
|
+
weight: 0.35
|
|
62
|
+
description: "OOM identification"
|
|
63
|
+
- type: llm_judge
|
|
64
|
+
criteria: "Memory-CPU relationship is covered — Lambda allocates CPU proportional to memory. 1,769MB = 1 full vCPU. At 128MB you get ~7% of a vCPU — CPU-bound tasks are extremely slow. This means: increasing memory for a CPU-bound function makes it faster AND can make it cheaper (shorter duration offsets higher per-ms cost). Use AWS Lambda Power Tuning tool to find optimal memory: tests your function at different memory sizes and plots cost vs duration. Memory is the ONLY performance lever for Lambda — no separate CPU setting"
|
|
65
|
+
weight: 0.35
|
|
66
|
+
description: "Memory-CPU relationship"
|
|
67
|
+
- type: llm_judge
|
|
68
|
+
criteria: "Right-sizing is practical — use Lambda Power Tuning (open-source Step Functions tool): runs your function at multiple memory configs, shows cost and duration at each. Look for the 'sweet spot' where increasing memory stops improving duration. Common memory-hungry operations: loading entire files into memory (stream instead), parsing large JSON (use streaming JSON parser), image processing (needs 512MB+). Monitor Max Memory Used metric over time. Set memory to ~1.5x the typical Max Memory Used for headroom. /tmp for large file processing (up to 10GB ephemeral storage)"
|
|
69
|
+
weight: 0.30
|
|
70
|
+
description: "Right-sizing"
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
meta:
|
|
2
|
+
id: async-invocation-failures
|
|
3
|
+
level: 2
|
|
4
|
+
course: aws-lambda-debugging
|
|
5
|
+
type: output
|
|
6
|
+
description: "Debug Lambda async invocation failures — diagnose retry behavior, dead-letter queue issues, and Lambda Destination configuration"
|
|
7
|
+
tags: [AWS, Lambda, async, DLQ, destinations, retry, intermediate]
|
|
8
|
+
|
|
9
|
+
state: {}
|
|
10
|
+
|
|
11
|
+
trigger: |
|
|
12
|
+
Your S3-triggered Lambda function processes uploaded images. Some
|
|
13
|
+
images fail processing but you have no idea which ones or why:
|
|
14
|
+
|
|
15
|
+
$ aws cloudwatch get-metric-statistics --namespace AWS/Lambda \
|
|
16
|
+
--metric-name Errors --dimensions Name=FunctionName,Value=process-image
|
|
17
|
+
Errors: 45 in the last hour
|
|
18
|
+
|
|
19
|
+
45 errors but no visibility into which uploads failed. The function
|
|
20
|
+
is invoked asynchronously (S3 event) — errors don't go back to a
|
|
21
|
+
caller. Where do they go?
|
|
22
|
+
|
|
23
|
+
Async invocation error flow:
|
|
24
|
+
1. First attempt: function fails
|
|
25
|
+
2. Lambda waits 1 minute, retries (attempt 2)
|
|
26
|
+
3. Lambda waits 2 minutes, retries (attempt 3)
|
|
27
|
+
4. All 3 attempts failed → event is discarded (lost!)
|
|
28
|
+
|
|
29
|
+
Without a DLQ or destination, failed events simply disappear.
|
|
30
|
+
|
|
31
|
+
Fix 1 — Dead Letter Queue:
|
|
32
|
+
$ aws lambda update-function-configuration \
|
|
33
|
+
--function-name process-image \
|
|
34
|
+
--dead-letter-config TargetArn=arn:aws:sqs:...:image-dlq
|
|
35
|
+
|
|
36
|
+
Now failed events go to SQS after all retries exhausted. But the
|
|
37
|
+
DLQ only contains the original event, not the error details.
|
|
38
|
+
|
|
39
|
+
Fix 2 — Lambda Destinations (better):
|
|
40
|
+
$ aws lambda put-function-event-invoke-config \
|
|
41
|
+
--function-name process-image \
|
|
42
|
+
--destination-config '{
|
|
43
|
+
"OnSuccess": {"Destination": "arn:aws:sqs:...:success-queue"},
|
|
44
|
+
"OnFailure": {"Destination": "arn:aws:sqs:...:failure-queue"}
|
|
45
|
+
}'
|
|
46
|
+
|
|
47
|
+
Destinations include: the original event, the function response or
|
|
48
|
+
error, request/response metadata. Much more useful than DLQ.
|
|
49
|
+
|
|
50
|
+
Additional issue: MaximumRetryAttempts set to 0 means no retries.
|
|
51
|
+
But this also means transient errors (temporary network glitch)
|
|
52
|
+
are not retried. Tradeoff: retries help with transient failures
|
|
53
|
+
but tripling processing for permanent errors wastes compute.
|
|
54
|
+
|
|
55
|
+
Task: Explain async invocation debugging. Write: the retry behavior
|
|
56
|
+
(timing, attempt count), DLQ vs Lambda Destinations (comparison),
|
|
57
|
+
configuring retry limits and maximum event age, monitoring async
|
|
58
|
+
failures, and designing robust async processing pipelines.
|
|
59
|
+
|
|
60
|
+
assertions:
|
|
61
|
+
- type: llm_judge
|
|
62
|
+
criteria: "Async retry behavior is explained — async invocation: Lambda queues event internally, returns 202 immediately. On failure: retries 2 more times (3 total). Delay: ~1 minute between first and second, ~2 minutes between second and third. After all retries: event sent to DLQ/destination or discarded. MaximumRetryAttempts: configure 0-2 retries. MaximumEventAgeInSeconds: discard events older than X seconds (60-21600). Important: retries mean the function must be idempotent — same event may be processed multiple times"
|
|
63
|
+
weight: 0.35
|
|
64
|
+
description: "Retry behavior"
|
|
65
|
+
- type: llm_judge
|
|
66
|
+
criteria: "DLQ vs Destinations are compared — DLQ: only captures original event on failure, configured on function, supports SQS and SNS only. Lambda Destinations: captures original event + function response/error + metadata, supports SQS/SNS/Lambda/EventBridge, can handle both success and failure. Destinations are preferred (more information, more flexible). DLQ limitation: doesn't tell you WHY it failed. Destination OnFailure: includes error message, stack trace, request context. Use destinations for new functions, DLQ still works for existing setups"
|
|
67
|
+
weight: 0.35
|
|
68
|
+
description: "DLQ vs Destinations"
|
|
69
|
+
- type: llm_judge
|
|
70
|
+
criteria: "Monitoring and design are practical — monitor: AsyncEventsDropped metric (events lost without DLQ/destination), DeadLetterErrors (failed to send to DLQ). Alert on both! Design pattern: S3 event → Lambda → on failure: SQS DLQ → monitoring Lambda that alerts and logs details. Make functions idempotent: use a deduplication table to prevent reprocessing. For critical events: record event in DynamoDB before processing, mark as processed when done, sweep unprocessed events periodically as backup. Test failure scenarios: deliberately throw errors to verify DLQ/destination works"
|
|
71
|
+
weight: 0.30
|
|
72
|
+
description: "Monitoring and design"
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
meta:
|
|
2
|
+
id: cold-start-optimization
|
|
3
|
+
level: 2
|
|
4
|
+
course: aws-lambda-debugging
|
|
5
|
+
type: output
|
|
6
|
+
description: "Optimize Lambda cold starts — implement provisioned concurrency, SnapStart, and package optimization to reduce initialization latency"
|
|
7
|
+
tags: [AWS, Lambda, cold-start, provisioned-concurrency, SnapStart, optimization, intermediate]
|
|
8
|
+
|
|
9
|
+
state: {}
|
|
10
|
+
|
|
11
|
+
trigger: |
|
|
12
|
+
Your Java Lambda function has cold starts of 8-12 seconds. Users
|
|
13
|
+
hitting the API after an idle period wait 10+ seconds for the first
|
|
14
|
+
response. This is unacceptable for a user-facing API.
|
|
15
|
+
|
|
16
|
+
CloudWatch REPORT for cold start:
|
|
17
|
+
REPORT RequestId: abc-123 Duration: 450.00 ms
|
|
18
|
+
Billed Duration: 8950 ms Memory Size: 1024 MB
|
|
19
|
+
Max Memory Used: 256 MB Init Duration: 8500.00 ms
|
|
20
|
+
|
|
21
|
+
Init Duration: 8.5 seconds! The handler only takes 450ms.
|
|
22
|
+
|
|
23
|
+
Breakdown of cold start time:
|
|
24
|
+
- Download code package: 500ms (50MB jar)
|
|
25
|
+
- Start JVM: 3,000ms
|
|
26
|
+
- Class loading & dependency injection: 4,500ms
|
|
27
|
+
- First database connection: 500ms
|
|
28
|
+
|
|
29
|
+
Optimization approaches:
|
|
30
|
+
|
|
31
|
+
1. SnapStart (Java 11+, .NET 8):
|
|
32
|
+
Lambda snapshots the initialized function after the first init.
|
|
33
|
+
Subsequent cold starts restore from snapshot instead of
|
|
34
|
+
re-initializing. Reduces cold start from 8.5s to ~200ms.
|
|
35
|
+
$ aws lambda update-function-configuration \
|
|
36
|
+
--function-name my-func \
|
|
37
|
+
--snap-start ApplyOn=PublishedVersions
|
|
38
|
+
Caveat: must use published versions (not $LATEST).
|
|
39
|
+
|
|
40
|
+
2. Provisioned Concurrency:
|
|
41
|
+
Pre-initialize N execution environments. Zero cold starts
|
|
42
|
+
for up to N concurrent requests.
|
|
43
|
+
$ aws lambda put-provisioned-concurrency-config \
|
|
44
|
+
--function-name my-func --qualifier prod \
|
|
45
|
+
--provisioned-concurrent-executions 10
|
|
46
|
+
Cost: ~$15/month per provisioned environment (always running).
|
|
47
|
+
|
|
48
|
+
3. Package optimization:
|
|
49
|
+
Reduce jar from 50MB to 15MB (remove unused dependencies).
|
|
50
|
+
Use GraalVM native image for sub-second JVM start.
|
|
51
|
+
Use lighter frameworks (Micronaut/Quarkus instead of Spring).
|
|
52
|
+
|
|
53
|
+
4. Warm-up pings:
|
|
54
|
+
CloudWatch Events rule invokes function every 5 minutes.
|
|
55
|
+
Keeps one environment warm but doesn't prevent cold starts
|
|
56
|
+
during scaling.
|
|
57
|
+
|
|
58
|
+
Task: Explain cold start optimization. Write: SnapStart (how it
|
|
59
|
+
works, requirements, limitations), provisioned concurrency (cost,
|
|
60
|
+
auto-scaling, when to use), package optimization techniques,
|
|
61
|
+
runtime-specific advice (Java vs Node.js vs Python), and how to
|
|
62
|
+
measure cold start impact on users.
|
|
63
|
+
|
|
64
|
+
assertions:
|
|
65
|
+
- type: llm_judge
|
|
66
|
+
criteria: "SnapStart and provisioned concurrency are explained — SnapStart: snapshots initialized function at publish time, restores on cold start (~200ms instead of seconds). Works with Java 11+ (Corretto), .NET 8. Must publish versions. Cannot combine with provisioned concurrency. Limitations: uniqueness (random/UUID generated during init may be duplicated). Provisioned concurrency: pre-initializes environments, eliminates cold starts entirely for configured capacity. Cost: hourly charge per provisioned unit. Auto-scaling provisioned concurrency via Application Auto Scaling for variable traffic"
|
|
67
|
+
weight: 0.35
|
|
68
|
+
description: "SnapStart and provisioned"
|
|
69
|
+
- type: llm_judge
|
|
70
|
+
criteria: "Package and runtime optimization are covered — reduce package size: remove unused dependencies, use tree shaking/bundlers. Java: use Micronaut/Quarkus (designed for Lambda), GraalVM native image (sub-100ms starts), avoid Spring Boot (heavy reflection/classpath scanning). Node.js: bundle with esbuild, lazy-load heavy modules. Python: avoid large packages (pandas, numpy) unless needed, use Lambda-optimized versions. General: initialize SDK clients and DB connections outside handler (reused on warm starts). Measure Init Duration in REPORT line"
|
|
71
|
+
weight: 0.35
|
|
72
|
+
description: "Package and runtime"
|
|
73
|
+
- type: llm_judge
|
|
74
|
+
criteria: "Measurement and decision-making are practical — measure cold start impact: percentage of invocations that are cold starts (check Init Duration presence in CloudWatch Logs Insights). Query: filter @type = 'REPORT' | stats count() as total, sum(@initDuration > 0) as coldStarts. Calculate: if 5% of requests are cold starts with 5s delay, average latency impact is 250ms. Decision: if cold starts affect p99 latency for user-facing APIs → use SnapStart or provisioned concurrency. If async processing (SQS, events) → cold starts usually don't matter. Cost-benefit: provisioned concurrency costs $15/month per unit — compare to user impact of cold starts"
|
|
75
|
+
weight: 0.30
|
|
76
|
+
description: "Measurement"
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
meta:
|
|
2
|
+
id: dynamodb-streams-debugging
|
|
3
|
+
level: 2
|
|
4
|
+
course: aws-lambda-debugging
|
|
5
|
+
type: output
|
|
6
|
+
description: "Debug Lambda DynamoDB Streams integration — diagnose stream processing failures, iterator exhaustion, and event ordering issues"
|
|
7
|
+
tags: [AWS, Lambda, DynamoDB, Streams, event-source, iterator, intermediate]
|
|
8
|
+
|
|
9
|
+
state: {}
|
|
10
|
+
|
|
11
|
+
trigger: |
|
|
12
|
+
Your Lambda function processes DynamoDB Streams events (change data
|
|
13
|
+
capture) to sync order data to Elasticsearch. It stopped processing:
|
|
14
|
+
|
|
15
|
+
$ aws lambda list-event-source-mappings \
|
|
16
|
+
--function-name sync-to-es --query "EventSourceMappings[].State"
|
|
17
|
+
["Enabled"]
|
|
18
|
+
|
|
19
|
+
The mapping is enabled but CloudWatch shows no invocations. Checking
|
|
20
|
+
the event source mapping details:
|
|
21
|
+
|
|
22
|
+
$ aws lambda get-event-source-mapping --uuid abc-123
|
|
23
|
+
{
|
|
24
|
+
"State": "Enabled",
|
|
25
|
+
"StateTransitionReason": "USER_INITIATED",
|
|
26
|
+
"LastProcessingResult": "PROBLEM: Function call failed"
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
LastProcessingResult: "Function call failed" — the function threw
|
|
30
|
+
an unhandled error. For DynamoDB Streams (and Kinesis), Lambda
|
|
31
|
+
retries the SAME batch until it succeeds or the record expires
|
|
32
|
+
(24 hours by default). One bad record blocks the entire shard!
|
|
33
|
+
|
|
34
|
+
CloudWatch Logs (from the failing invocation):
|
|
35
|
+
Processing INSERT event for order ORD-999
|
|
36
|
+
Error: Cannot read property 'S' of undefined
|
|
37
|
+
— A DynamoDB record had an unexpected schema (missing field)
|
|
38
|
+
|
|
39
|
+
The function was stuck retrying the same bad record for 6 hours,
|
|
40
|
+
blocking all subsequent stream records.
|
|
41
|
+
|
|
42
|
+
Fix — configure error handling:
|
|
43
|
+
$ aws lambda update-event-source-mapping --uuid abc-123 \
|
|
44
|
+
--maximum-retry-attempts 3 \
|
|
45
|
+
--bisect-batch-on-function-error \
|
|
46
|
+
--destination-config '{"OnFailure":{"Destination":"arn:aws:sqs:..."}}'
|
|
47
|
+
|
|
48
|
+
- maximum-retry-attempts: stop retrying after 3 attempts
|
|
49
|
+
- bisect-batch-on-function-error: split batch to isolate bad record
|
|
50
|
+
- destination on failure: send failed records to SQS for investigation
|
|
51
|
+
|
|
52
|
+
Task: Explain DynamoDB Streams + Lambda debugging. Write: how
|
|
53
|
+
stream processing works (shards, iterators, ordering), the blocking
|
|
54
|
+
behavior on errors (entire shard stops), error handling configuration
|
|
55
|
+
(retry limits, bisect, on-failure destination), common stream
|
|
56
|
+
processing patterns, and monitoring stream consumer lag.
|
|
57
|
+
|
|
58
|
+
assertions:
|
|
59
|
+
- type: llm_judge
|
|
60
|
+
criteria: "Stream processing mechanics are explained — DynamoDB Streams capture INSERT, MODIFY, DELETE events in order per partition key. Lambda polls stream shards via event source mapping. Records include OldImage and/or NewImage (depending on StreamViewType). Processing is ordered within a shard — one batch at a time. If Lambda fails, it retries the SAME batch (blocks shard). Different from SQS: stream records must be processed in order, so failed records block subsequent records"
|
|
61
|
+
weight: 0.35
|
|
62
|
+
description: "Stream mechanics"
|
|
63
|
+
- type: llm_judge
|
|
64
|
+
criteria: "Error handling and blocking are covered — default behavior: retry forever until record expires (24h) — blocks shard processing. Configure: MaximumRetryAttempts (limit retries), BisectBatchOnFunctionError (split batch to isolate bad record), MaximumRecordAgeInSeconds (skip old records), DestinationConfig OnFailure (send failed records to SQS/SNS for investigation). Without these settings, one bad record stops ALL processing on that shard. Always configure error handling for stream consumers"
|
|
65
|
+
weight: 0.35
|
|
66
|
+
description: "Error handling"
|
|
67
|
+
- type: llm_judge
|
|
68
|
+
criteria: "Monitoring and patterns are practical — monitor: IteratorAge metric (time between record written and processed — high value means lag). Alert when IteratorAge exceeds acceptable threshold (e.g., 5 minutes). Check: LastProcessingResult in event source mapping for error state. Common patterns: use DynamoDB Streams for CDC (change data capture), search index sync, cross-region replication, audit logging. Design Lambda for idempotency (records may be delivered more than once). Handle schema evolution gracefully (new/missing fields shouldn't crash the function)"
|
|
69
|
+
weight: 0.30
|
|
70
|
+
description: "Monitoring and patterns"
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
meta:
|
|
2
|
+
id: intermediate-debugging-shift
|
|
3
|
+
level: 2
|
|
4
|
+
course: aws-lambda-debugging
|
|
5
|
+
type: output
|
|
6
|
+
description: "Combined intermediate debugging shift — diagnose a serverless application with event source, VPC, layer, and concurrency issues simultaneously"
|
|
7
|
+
tags: [AWS, Lambda, troubleshooting, combined, shift-simulation, intermediate]
|
|
8
|
+
|
|
9
|
+
state: {}
|
|
10
|
+
|
|
11
|
+
trigger: |
|
|
12
|
+
You're troubleshooting a serverless order processing system with
|
|
13
|
+
5 Lambda functions. The system "partially works":
|
|
14
|
+
|
|
15
|
+
Architecture:
|
|
16
|
+
API Gateway → order-api (Lambda)
|
|
17
|
+
order-api → SQS queue → process-order (Lambda)
|
|
18
|
+
process-order → DynamoDB + payment-service (Lambda)
|
|
19
|
+
payment-service → Stripe API (external)
|
|
20
|
+
DynamoDB Stream → sync-to-search (Lambda) → OpenSearch
|
|
21
|
+
|
|
22
|
+
Current issues:
|
|
23
|
+
|
|
24
|
+
1. order-api: intermittent 504 errors from API Gateway.
|
|
25
|
+
REPORT shows Init Duration: 4200ms for cold starts.
|
|
26
|
+
The function is in a VPC (for RDS access) and uses a heavy
|
|
27
|
+
Python layer with pandas (unnecessary for this API).
|
|
28
|
+
Fix: remove pandas layer, add VPC endpoint for DynamoDB,
|
|
29
|
+
consider provisioned concurrency.
|
|
30
|
+
|
|
31
|
+
2. process-order: messages accumulate in SQS, not being processed.
|
|
32
|
+
Event source mapping shows LastProcessingResult: "OK" but
|
|
33
|
+
BatchSize is 1 and function processes one message per second.
|
|
34
|
+
With 500 messages/minute incoming, it can't keep up.
|
|
35
|
+
Fix: increase batch size to 10, enable batch window of 5s.
|
|
36
|
+
|
|
37
|
+
3. payment-service: throws errors but retries succeed.
|
|
38
|
+
The function calls Stripe API with no timeout configured.
|
|
39
|
+
Occasionally Stripe takes 15+ seconds, exceeding the Lambda's
|
|
40
|
+
10-second timeout. On retry (async), it succeeds → duplicate
|
|
41
|
+
payment! No idempotency key used.
|
|
42
|
+
Fix: set HTTP timeout < Lambda timeout, use idempotency key.
|
|
43
|
+
|
|
44
|
+
4. sync-to-search: completely stuck, IteratorAge growing.
|
|
45
|
+
One malformed DynamoDB record causes the function to crash,
|
|
46
|
+
blocking the entire shard. No error handling configured.
|
|
47
|
+
Fix: configure MaximumRetryAttempts, BisectBatchOnFunctionError,
|
|
48
|
+
OnFailure destination.
|
|
49
|
+
|
|
50
|
+
5. Account-wide: ConcurrentExecutions at 850/1000. No reserved
|
|
51
|
+
concurrency configured. A batch job running at the same time
|
|
52
|
+
could push the account to the limit.
|
|
53
|
+
Fix: set reserved concurrency for critical functions.
|
|
54
|
+
|
|
55
|
+
Task: Walk through diagnosing all issues. Write: the triage
|
|
56
|
+
approach for serverless architectures, the fix for each issue,
|
|
57
|
+
idempotency patterns, and operational best practices.
|
|
58
|
+
|
|
59
|
+
assertions:
|
|
60
|
+
- type: llm_judge
|
|
61
|
+
criteria: "All five issues are diagnosed and fixed — (1) cold start: remove unnecessary layer, add VPC endpoints, use provisioned concurrency for API-facing function. (2) SQS throughput: increase batch size and batch window for higher processing rate. (3) duplicate payments: set HTTP client timeout < Lambda timeout, use idempotency keys in Stripe API calls. (4) stream blocking: configure retry limits, bisect on error, failure destination for DynamoDB Streams event source. (5) concurrency: set reserved concurrency for critical functions to prevent resource starvation"
|
|
62
|
+
weight: 0.35
|
|
63
|
+
description: "All issues fixed"
|
|
64
|
+
- type: llm_judge
|
|
65
|
+
criteria: "Idempotency and error handling are covered — idempotency: use unique transaction IDs for payment operations (Stripe supports Idempotency-Key header). Store processing status in DynamoDB before and after processing. Design all Lambda functions to be safely re-invokable. Error handling: different for each invocation pattern — sync (return error to caller), async (retry + DLQ), stream (retry + bisect + destination). Always configure error handling for event sources — defaults are not production-ready"
|
|
66
|
+
weight: 0.35
|
|
67
|
+
description: "Idempotency and errors"
|
|
68
|
+
- type: llm_judge
|
|
69
|
+
criteria: "Serverless triage approach is systematic — check CloudWatch metrics first: Errors, Throttles, Duration, ConcurrentExecutions. For event sources: check event source mapping state and LastProcessingResult. For streams: check IteratorAge (growing = falling behind). For SQS: check ApproximateAgeOfOldestMessage (lag indicator). Work through the data flow: API → queue → processing → database → stream → search. Fix upstream issues first (they cascade). Test each fix independently. Monitor for 30+ minutes after fixes to confirm stability"
|
|
70
|
+
weight: 0.30
|
|
71
|
+
description: "Triage approach"
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
meta:
|
|
2
|
+
id: lambda-concurrency-management
|
|
3
|
+
level: 2
|
|
4
|
+
course: aws-lambda-debugging
|
|
5
|
+
type: output
|
|
6
|
+
description: "Debug Lambda concurrency issues — diagnose throttling, configure reserved and provisioned concurrency, and protect downstream services"
|
|
7
|
+
tags: [AWS, Lambda, concurrency, throttling, reserved, scaling, intermediate]
|
|
8
|
+
|
|
9
|
+
state: {}
|
|
10
|
+
|
|
11
|
+
trigger: |
|
|
12
|
+
A marketing campaign sends a blast email with a link to your API.
|
|
13
|
+
Traffic spikes 10x. Multiple functions start throttling:
|
|
14
|
+
|
|
15
|
+
CloudWatch Metrics (account-wide):
|
|
16
|
+
ConcurrentExecutions: 1,000 (at limit!)
|
|
17
|
+
Throttles (order-api): 5,200
|
|
18
|
+
Throttles (user-api): 1,800
|
|
19
|
+
Throttles (analytics): 450
|
|
20
|
+
|
|
21
|
+
All functions compete for the same 1,000 account concurrency pool.
|
|
22
|
+
The analytics function (low priority) consumed 600 concurrent
|
|
23
|
+
executions processing a backlog, leaving only 400 for critical
|
|
24
|
+
order and user APIs.
|
|
25
|
+
|
|
26
|
+
Fix 1 — Reserved concurrency (free):
|
|
27
|
+
$ aws lambda put-function-concurrency \
|
|
28
|
+
--function-name order-api \
|
|
29
|
+
--reserved-concurrent-executions 300
|
|
30
|
+
$ aws lambda put-function-concurrency \
|
|
31
|
+
--function-name user-api \
|
|
32
|
+
--reserved-concurrent-executions 200
|
|
33
|
+
$ aws lambda put-function-concurrency \
|
|
34
|
+
--function-name analytics \
|
|
35
|
+
--reserved-concurrent-executions 50
|
|
36
|
+
|
|
37
|
+
Now order-api is guaranteed 300 concurrent executions. But:
|
|
38
|
+
reserved concurrency is also a MAXIMUM — order-api can never
|
|
39
|
+
exceed 300 even if capacity is available.
|
|
40
|
+
|
|
41
|
+
Unreserved pool: 1000 - 300 - 200 - 50 = 450 for all other functions.
|
|
42
|
+
|
|
43
|
+
Fix 2 — Downstream protection:
|
|
44
|
+
Your RDS database has a max_connections of 100. If 300 Lambda
|
|
45
|
+
instances each open a connection, the database is overwhelmed:
|
|
46
|
+
"too many connections" error.
|
|
47
|
+
|
|
48
|
+
Solution: RDS Proxy pools database connections. Lambda instances
|
|
49
|
+
connect to RDS Proxy, which maintains a connection pool to the
|
|
50
|
+
database.
|
|
51
|
+
|
|
52
|
+
Task: Explain Lambda concurrency management. Write: account vs
|
|
53
|
+
function concurrency limits, reserved concurrency (guarantees AND
|
|
54
|
+
limits), provisioned concurrency (pre-warmed), protecting downstream
|
|
55
|
+
services (RDS Proxy, SQS buffering), scaling behavior, and how to
|
|
56
|
+
request limit increases.
|
|
57
|
+
|
|
58
|
+
assertions:
|
|
59
|
+
- type: llm_judge
|
|
60
|
+
criteria: "Concurrency model is explained — account default: 1,000 concurrent executions (soft limit, can increase). All functions share the pool unless reserved concurrency is set. Reserved concurrency: guarantees AND limits a function's concurrent executions (free, no additional cost). Unreserved pool: total limit minus all reserved concurrency — must leave at least 100 unreserved. Provisioned concurrency: pre-initialized environments for instant response (charged per provisioned unit per hour). Scaling: Lambda scales at 500-3000 instances per minute depending on region"
|
|
61
|
+
weight: 0.35
|
|
62
|
+
description: "Concurrency model"
|
|
63
|
+
- type: llm_judge
|
|
64
|
+
criteria: "Downstream protection is covered — Lambda can scale faster than downstream services. Database: max_connections limit — use RDS Proxy (connection pooling), or limit Lambda concurrency. APIs: use reserved concurrency to match API rate limits. SQS: use as buffer between Lambda and slow services. Pattern: high-concurrency Lambda → SQS → low-concurrency Lambda → database. ElastiCache: use as cache to reduce database load. Always consider downstream capacity when setting Lambda concurrency"
|
|
65
|
+
weight: 0.35
|
|
66
|
+
description: "Downstream protection"
|
|
67
|
+
- type: llm_judge
|
|
68
|
+
criteria: "Scaling and limits are practical — request limit increase via AWS Support (usually approved within days). Monitor: ConcurrentExecutions, Throttles, UnreservedAccountConcurrency metrics. Alert on throttles (any throttle = degraded service). Scaling behavior: burst (3000 in us-east-1, 1000 in other regions for first minute), then 500 additional per minute. Event source specific: SQS scales up to 1000 batches/minute, Kinesis limited by shard count. Plan capacity: expected peak concurrent executions = (invocations per second) × (average duration in seconds)"
|
|
69
|
+
weight: 0.30
|
|
70
|
+
description: "Scaling and limits"
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
meta:
|
|
2
|
+
id: lambda-layers-debugging
|
|
3
|
+
level: 2
|
|
4
|
+
course: aws-lambda-debugging
|
|
5
|
+
type: output
|
|
6
|
+
description: "Debug Lambda Layer issues — diagnose layer version conflicts, incorrect directory structure, and dependency resolution problems"
|
|
7
|
+
tags: [AWS, Lambda, layers, dependencies, version-conflicts, intermediate]
|
|
8
|
+
|
|
9
|
+
state: {}
|
|
10
|
+
|
|
11
|
+
trigger: |
|
|
12
|
+
Your Lambda function fails after adding a new layer:
|
|
13
|
+
|
|
14
|
+
{
|
|
15
|
+
"errorType": "Runtime.ImportModuleError",
|
|
16
|
+
"errorMessage": "Unable to import module 'handler': No module
|
|
17
|
+
named 'pandas'"
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
But pandas IS in your layer! Checking the layer:
|
|
21
|
+
|
|
22
|
+
$ aws lambda get-layer-version --layer-name data-layer --version 3 \
|
|
23
|
+
--query "Content.Location" --output text | xargs curl -o layer.zip
|
|
24
|
+
$ unzip -l layer.zip
|
|
25
|
+
Archive: layer.zip
|
|
26
|
+
Length Name
|
|
27
|
+
------ ----
|
|
28
|
+
pandas/
|
|
29
|
+
pandas/__init__.py
|
|
30
|
+
...
|
|
31
|
+
|
|
32
|
+
Problem: wrong directory structure! Lambda expects Python
|
|
33
|
+
dependencies in specific paths:
|
|
34
|
+
- python/
|
|
35
|
+
- python/lib/python3.x/site-packages/
|
|
36
|
+
|
|
37
|
+
The layer has pandas/ at the root instead of python/pandas/.
|
|
38
|
+
Lambda can't find it.
|
|
39
|
+
|
|
40
|
+
Correct structure:
|
|
41
|
+
$ mkdir -p python/lib/python3.12/site-packages/
|
|
42
|
+
$ pip install pandas -t python/lib/python3.12/site-packages/
|
|
43
|
+
$ zip -r layer.zip python/
|
|
44
|
+
|
|
45
|
+
After fixing, a new error:
|
|
46
|
+
"numpy.core._multiarray_umath: undefined symbol: PyFloat_Type"
|
|
47
|
+
|
|
48
|
+
The numpy in the layer was compiled for Python 3.11 but the
|
|
49
|
+
function uses Python 3.12. Native extensions must match the
|
|
50
|
+
exact Python version.
|
|
51
|
+
|
|
52
|
+
Another issue — layer order matters:
|
|
53
|
+
Function has layers: [common-utils:v2, data-layer:v3]
|
|
54
|
+
Both layers have a different version of the 'requests' library.
|
|
55
|
+
Layer 2 (data-layer) overrides layer 1 (common-utils) because
|
|
56
|
+
layers are merged in order, with later layers taking precedence.
|
|
57
|
+
|
|
58
|
+
Task: Explain Lambda Layer debugging. Write: correct layer
|
|
59
|
+
directory structure for each runtime, version compatibility
|
|
60
|
+
(runtime, architecture), layer merge order and conflicts, the
|
|
61
|
+
250MB unzipped limit (function + all layers), and when to use
|
|
62
|
+
layers vs bundled dependencies.
|
|
63
|
+
|
|
64
|
+
assertions:
|
|
65
|
+
- type: llm_judge
|
|
66
|
+
criteria: "Layer structure is explained — Python: python/ or python/lib/python3.x/site-packages/. Node.js: nodejs/node_modules/. Both: lib/ or bin/ for shared libraries/executables. Wrong directory structure is the #1 layer issue. Lambda adds layer paths to the runtime's module search path. Must match exactly or imports fail. Check with: unzip -l layer.zip to verify structure before publishing"
|
|
67
|
+
weight: 0.35
|
|
68
|
+
description: "Layer structure"
|
|
69
|
+
- type: llm_judge
|
|
70
|
+
criteria: "Compatibility and conflicts are covered — runtime version: native extensions (numpy, pandas, Pillow) must match the exact Python version. Build on matching Amazon Linux environment or use Docker. Architecture: layers must match function architecture (x86_64 vs arm64). Layer order: layers merged in order, later layers override earlier ones if they have the same file. Up to 5 layers per function. Total size: function code + all layers ≤ 250MB unzipped. Debugging: print sys.path (Python) or module.paths (Node.js) to see layer paths"
|
|
71
|
+
weight: 0.35
|
|
72
|
+
description: "Compatibility"
|
|
73
|
+
- type: llm_judge
|
|
74
|
+
criteria: "Usage guidance is practical — use layers for: shared code across multiple functions (utility libraries, SDK wrappers), large dependencies that don't change often (pandas, numpy), custom runtimes. Don't use layers for: function-specific code (bundle with function), frequently updated dependencies (layer versioning adds complexity). Alternative: use esbuild/webpack bundling for smaller packages. Container images eliminate layer complexity entirely. Layer versions are immutable — publish new version for updates, update all functions referencing the old version"
|
|
75
|
+
weight: 0.30
|
|
76
|
+
description: "Usage guidance"
|