☰ All modules Tier 1 · Lambda GuideCheat sheet ‹ cli-sdk-policiesapi-gateway ›
Contents
  1. How Lambda appears on DVA-C02
  2. 1. Invocation types and synchronous calls
  3. 2. Asynchronous invocation with retries and destinations
  4. 3. Event source mappings for queues and streams
  5. 4. Execution roles and resource based policies
  6. 5. Concurrency scaling and throttling
  7. 6. Cold starts with provisioned concurrency and SnapStart
  8. 7. Versions and aliases with traffic shifting
  9. 8. Deployment packages with layers and container images
  10. 9. Environment variables and secrets
  11. 10. VPC access and storage options
  12. 11. Function URLs and response streaming
  13. 12. Observability with logs metrics and traces
  14. 13. Performance tuning and limits
  15. Quick decision rules
  16. Changed vs older material

Lambda — DVA-C02 Mastery Guide

  • Sources: course chapter 14 (AWS Lambda), used as the syllabus only; all wording here is original. Written 2026-10-12.
  • Values checked against AWS documentation on 2026-10-12. 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: never rely on it in a question. Every change is listed in Changed vs older material; confirmed rows also live in notes/current-facts.md.
  • Tier 1 (highest exam weight), bank target 40 questions. Domains: Development with AWS Services (primary), Troubleshooting and Optimization, Deployment.
  • How to use it: /explain <topic> teaches from these sections (concept → exam facts → developer angle → traps → 3 check questions); /quiz lambda asks bank questions whose source_note links point at the ## N. headings below; /drill lambda fires short recall prompts from notes/lambda-cheat-sheet.md. Suggested loop: read a section and answer its practice questions before opening the answers → /explain what is still unclear → /quiz lambda → /drill lambda.

How Lambda appears on DVA-C02

Lambda is the default compute service of the exam ("Develop code for AWS Lambda" is a task statement of its own). Questions rarely ask what Lambda is; they ask what a developer must configure so that a function is called the right way, fails safely, scales without hurting other systems and ships without downtime:

Typical question shapes: a scenario with one deciding constraint; an error code or metric to diagnose; "Which TWO actions…" with five options; the exact setting, API action, CLI flag or condition key that does the job. Deciding constraints map to Lambda features: LEAST operational overhead → destinations, partial batch responses, filters and managed retries instead of custom code; LOWEST latency → provisioned concurrency or SnapStart; MOST secure → least-privilege execution role, Secrets Manager instead of environment variables, AWS_IAM function URLs; fewest code changes → a configuration setting such as a batching window, reserved concurrency or an alias weight.

Domain map: Development → §1–§4, §8–§11 · Troubleshooting and Optimization → §5, §6, §12, §13 · Deployment → §7, §8 · Security angles → §4, §9, §11.

Out of scope here (owned by other modules): API Gateway integrations, authorizers and integration timeouts (see notes/api-gateway-guide.md); Lambda@Edge and CloudFront Functions (see notes/cloudfront-guide.md); S3 event notification behaviour (see notes/s3-guide.md); SQS, SNS and Kinesis service settings (see notes/sqs-sns-kinesis-guide.md); DynamoDB Streams design (see notes/dynamodb-guide.md); EventBridge rules, X-Ray sampling rules and CloudWatch Logs Insights (see notes/monitoring-guide.md); SAM templates and CodeDeploy deployment groups (see notes/sam-guide.md and notes/cicd-guide.md); KMS, Secrets Manager and Parameter Store internals (see notes/security-encryption-guide.md); IAM policy evaluation and PassRole depth (see notes/advanced-identity-guide.md); NAT gateways, endpoints and routing (see notes/vpc-guide.md); Step Functions (see notes/other-services-guide.md); RDS Proxy (see notes/rds-guide.md); ALB target groups in depth (see notes/ec2-mastery-guide.md §8); EFS mechanics (see notes/ec2-mastery-guide.md §7). No OS administration or network design.

# Topic Why it is on the exam
1 Invocation types and synchronous calls Who waits for the result decides who handles errors; 200 with FunctionError is still a failure
2 Asynchronous invocation with retries and destinations Built-in retries, event age, destinations vs DLQs: failure handling without code
3 Event source mappings for queues and streams SQS, Kinesis and DynamoDB Streams settings decide duplicates, stalls and scaling
4 Execution roles and resource based policies What the function may call vs who may call the function; the classic "trigger never fires" fix
5 Concurrency scaling and throttling Account pool, reserved concurrency and 429 handling under a stated load
6 Cold starts with provisioned concurrency and SnapStart Picking the latency fix that fits the runtime, traffic shape and budget
7 Versions and aliases with traffic shifting Immutable versions, movable aliases, canary and linear releases with rollback
8 Deployment packages with layers and container images Size limits, layers, images, runtimes and code updates that do (or don't) deploy
9 Environment variables and secrets Configuration without code changes; secrets kept out of plain variables
10 VPC access and storage options Reaching private resources, losing internet access, /tmp vs EFS
11 Function URLs and response streaming The cheapest HTTPS endpoint, its two-permission model, and large or streamed responses
12 Observability with logs metrics and traces Missing logs, misleading metrics, absent X-Ray segments, recursive loops
13 Performance tuning and limits Memory as the CPU dial, timeouts, cost math and the hard limits questions hinge on

1. Invocation types and synchronous calls

Concept

Exam facts

Developer angle

# synchronous call that also returns the tail of the log (AWS CLI v2 needs the binary-format flag for raw JSON)
aws lambda invoke --function-name orders-api:live \
  --cli-binary-format raw-in-base64-out \
  --payload '{"orderId": "o-1001"}' \
  --log-type Tail --query LogResult --output text response.json | base64 --decode

# permission check only: nothing runs, StatusCode 204
aws lambda invoke --function-name orders-api --invocation-type DryRun response.json
import json
import boto3

lambda_client = boto3.client("lambda")

def call_orders(order_id):
    resp = lambda_client.invoke(FunctionName="orders-api:live", InvocationType="RequestResponse",
                                Payload=json.dumps({"orderId": order_id}))
    body = json.loads(resp["Payload"].read())
    if "FunctionError" in resp:            # StatusCode is still 200 here
        raise RuntimeError(f"{body.get('errorType')}: {body.get('errorMessage')}")
    return resp["ExecutedVersion"], body   # which version of the alias answered

def handler(event, context):               # stop cleanly before the timeout
    done = []
    for item in event["items"]:
        if context.get_remaining_time_in_millis() < 10_000:
            break                          # leave time to save progress
        done.append(item)
    return {"processed": len(done), "requestId": context.aws_request_id}

Traps

Practice questions

  1. A developer's batch script invokes a pricing function synchronously with the AWS SDK and treats every response with status code 200 as a success. During testing, several calls returned 200 even though the function's CloudWatch logs show an unhandled exception for those requests. How should the script detect these failures MOST reliably?

    • A. Treat status code 202 as the only successful result for synchronous calls.
    • B. Send each request with InvocationType set to DryRun first so that errors surface early.
    • C. Check the response for the FunctionError field and read the error details from the payload.
    • D. Request LogType Tail and search the decoded log text for the word ERROR.
  2. An Application Load Balancer forwards requests to a Lambda function in a target group. Clients call URLs such as /search?tag=red&tag=blue, but the function only ever receives blue, and responses that set two cookies reach the browser with only one. Which TWO changes fix both problems? (Select TWO.)

    • A. Register a second Lambda function in the same target group to handle repeated keys.
    • B. Enable the lambda.multi_value_headers.enabled attribute on the target group.
    • C. Switch the integration to asynchronous invocation so that the ALB queues complete requests.
    • D. Increase the function's memory so that larger header maps fit into the event.
    • E. Read multiValueQueryStringParameters and return the cookies in multiValueHeaders in the function code.
Answers
  1. C. A function error still returns 200; the FunctionError field (header X-Amz-Function-Error) is the documented signal and the payload holds errorType and errorMessage. A is wrong because 202 belongs to asynchronous calls; B runs no code at all; D is fragile and limited to the last 4 KB of the log.
  2. B, E. With the attribute enabled the ALB sends arrays in multiValueQueryStringParameters and expects multiValueHeaders in the response, so the code must read and write those fields. A fails because a target group holds one function; C is impossible because the ALB always invokes synchronously; D has no effect on how the event is built.

2. Asynchronous invocation with retries and destinations

Concept

Exam facts

Developer angle

# fire-and-forget call: the CLI prints only StatusCode 202
aws lambda invoke --function-name resize-image --invocation-type Event \
  --cli-binary-format raw-in-base64-out \
  --payload '{"bucket": "media-uploads", "key": "cat.jpg"}' response.json

# one retry, at most one hour in the queue, success record to EventBridge, failure record to SQS
aws lambda put-function-event-invoke-config --function-name resize-image \
  --maximum-retry-attempts 1 --maximum-event-age-in-seconds 3600 \
  --destination-config '{"OnSuccess":{"Destination":"arn:aws:events:eu-west-1:111122223333:event-bus/media"},"OnFailure":{"Destination":"arn:aws:sqs:eu-west-1:111122223333:resize-failures"}}'

# change one setting later without wiping the others
aws lambda update-function-event-invoke-config --function-name resize-image \
  --maximum-retry-attempts 0

# legacy dead-letter queue (function level, original event only)
aws lambda update-function-configuration --function-name resize-image \
  --dead-letter-config TargetArn=arn:aws:sns:eu-west-1:111122223333:resize-dlq

The execution role of resize-image needs events:PutEvents on the bus and sqs:SendMessage on the queue for those two destinations. Idempotent handler for duplicate S3 notifications (DynamoDB conditional write):

import boto3
from botocore.exceptions import ClientError

table = boto3.resource("dynamodb").Table("processed-events")

def handler(event, context):
    for record in event["Records"]:
        obj = record["s3"]["object"]
        try:                               # one marker item per object version
            table.put_item(Item={"pk": obj["key"] + "#" + obj.get("versionId", "null")},
                           ConditionExpression="attribute_not_exists(pk)")
        except ClientError as err:
            if err.response["Error"]["Code"] == "ConditionalCheckFailedException":
                continue                   # duplicate delivery: already handled
            raise
        # ... resize the image here

Traps

Practice questions

  1. A photo-processing function is invoked by S3 event notifications. The operations team wants every event that still fails after Lambda's automatic retries to be captured together with the error message and the function's response, without adding code to the handler. Which solution meets these requirements with the LEAST operational overhead?

    • A. Configure an on-failure destination that points to an SQS standard queue.
    • B. Configure a dead-letter queue on the function that points to an SNS topic.
    • C. Wrap the handler in a try/except block that sends failed events to an SQS queue.
    • D. Create a CloudWatch Logs subscription filter that copies error lines to an S3 bucket.
  2. A function invoked asynchronously by an EventBridge rule calls a partner API that is unavailable for up to 20 minutes at a time. Events older than 15 minutes are worthless, and a failed event must not be retried more than once. Which TWO configuration changes meet these requirements? (Select TWO.)

    • A. Set MaximumRetryAttempts to 1 with update-function-event-invoke-config.
    • B. Set the function timeout to 900 seconds so that each attempt can wait out the outage.
    • C. Set reserved concurrency to 1 so that only one event is processed at a time.
    • D. Set MaximumEventAgeInSeconds to 900 with update-function-event-invoke-config.
    • E. Configure an SQS FIFO queue as the on-failure destination to preserve event order.
Answers
  1. A. An on-failure destination receives the full invocation record (request, response, condition) with no code. B keeps only the event and a short error attribute; C adds custom code; D depends on log parsing and loses the structured response.
  2. A, D. One retry and a 900-second maximum event age implement both rules. B wastes duration and still violates the 15-minute freshness rule; C throttles the function without limiting retries; E fails because FIFO destinations are not supported.

3. Event source mappings for queues and streams

Concept

Exam facts

Developer angle

# SQS: batches of up to 100, 5-second window, partial failures, at most 50 concurrent runs for this queue
aws lambda create-event-source-mapping --function-name billing-worker:live \
  --event-source-arn arn:aws:sqs:eu-west-1:111122223333:invoices \
  --batch-size 100 --maximum-batching-window-in-seconds 5 \
  --function-response-types ReportBatchItemFailures \
  --scaling-config MaximumConcurrency=50

# Kinesis: 4 batches per shard, split bad batches, give up after 3 retries or 1 hour, keep failures in SQS
aws lambda create-event-source-mapping --function-name clickstream \
  --event-source-arn arn:aws:kinesis:eu-west-1:111122223333:stream/clicks \
  --starting-position LATEST --batch-size 500 --parallelization-factor 4 \
  --bisect-batch-on-function-error --maximum-retry-attempts 3 \
  --maximum-record-age-in-seconds 3600 \
  --destination-config '{"OnFailure":{"Destination":"arn:aws:sqs:eu-west-1:111122223333:click-failures"}}'

# only refunds reach the function; pause the mapping without deleting it
aws lambda update-event-source-mapping --uuid a1b2c3d4-5678-90ab-cdef-11111EXAMPLE \
  --filter-criteria '{"Filters": [{"Pattern": "{\"body\": {\"type\": [\"refund\"]}}"}]}'
aws lambda update-event-source-mapping --uuid a1b2c3d4-5678-90ab-cdef-11111EXAMPLE --no-enabled
import json

def handler(event, context):              # SQS partial batch response
    failures = []
    for record in event["Records"]:
        try:
            invoice = json.loads(record["body"])
            if invoice.get("amount", 0) <= 0:
                raise ValueError("invalid amount")
        except Exception:
            failures.append({"itemIdentifier": record["messageId"]})
    return {"batchItemFailures": failures}

Traps

Practice questions

  1. A function consumes an SQS standard queue with a batch size of 10. Occasionally one malformed message makes the function throw, and the other nine messages are processed again on every retry, which creates duplicate charges. The developer wants only the failing message to be retried while keeping batches of 10 for throughput. What should the developer do?

    • A. Reduce the batch size to 1 so that each message is retried on its own.
    • B. Move to a FIFO queue and put malformed messages in their own message group.
    • C. Configure an on-failure destination on the event source mapping for malformed messages.
    • D. Enable ReportBatchItemFailures on the mapping and return the failed messageId values in batchItemFailures.
  2. A Kinesis-triggered function stopped making progress on one shard after a producer wrote a corrupt record; IteratorAge keeps rising for that shard while the other shards are healthy. The team wants processing to move past bad records automatically and to keep a copy of whatever is skipped. Which TWO actions meet these requirements? (Select TWO.)

    • A. Increase the function timeout to the maximum of 900 seconds.
    • B. Increase the stream's retention period so that the corrupt record stays available longer.
    • C. Set MaximumRetryAttempts and enable BisectBatchOnFunctionError on the event source mapping.
    • D. Increase ParallelizationFactor to 10 so that more batches from the shard run at the same time.
    • E. Add an on-failure destination, such as an S3 bucket, to the event source mapping.
Answers
  1. D. Partial batch responses return only the failed message to the queue while the batch size stays at 10. A meets the retry goal but gives up the required batching; B doesn't stop the healthy messages from being retried; C fails because SQS mappings don't support on-failure destinations.
  2. C, E. A retry limit with bisecting isolates the bad record and lets the shard continue; the on-failure destination keeps the skipped batch (S3 stores the records themselves). A and B only prolong the stall; D adds concurrency but the failing batch is still retried until it expires.

4. Execution roles and resource based policies

Concept

Exam facts

Developer angle

# lambda-trust.json: Allow, Principal {"Service": "lambda.amazonaws.com"}, Action sts:AssumeRole
aws iam create-role --role-name thumbs-exec \
  --assume-role-policy-document file://lambda-trust.json
aws iam attach-role-policy --role-name thumbs-exec \
  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

# let one bucket in this account invoke the live alias
aws lambda add-permission --function-name thumbs:live --statement-id s3-uploads \
  --action lambda:InvokeFunction --principal s3.amazonaws.com \
  --source-arn arn:aws:s3:::media-uploads --source-account 111122223333

# full-policy workflow: read, edit, write back with the revision check
aws lambda get-resource-policy \
  --resource-arn arn:aws:lambda:eu-west-1:111122223333:function:thumbs
aws lambda put-resource-policy \
  --resource-arn arn:aws:lambda:eu-west-1:111122223333:function:thumbs \
  --policy file://thumbs-policy.json --revision-id "$REVISION_ID"

thumbs-policy.json: allow a role from a member account and deny every caller outside the organization, for the function and all its versions and aliases:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AnalyticsInvoke",
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::444455556666:role/analytics-batch" },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:eu-west-1:111122223333:function:thumbs:live"
    },
    {
      "Sid": "DenyOutsideOrg",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "lambda:InvokeFunction",
      "Resource": ["arn:aws:lambda:eu-west-1:111122223333:function:thumbs",
                   "arn:aws:lambda:eu-west-1:111122223333:function:thumbs:*"],
      "Condition": { "StringNotEquals": { "aws:PrincipalOrgID": "o-a1b2c3d4e5" } }
    }
  ]
}

Traps

Practice questions

  1. A developer defines an S3 bucket notification and a Lambda function in one CloudFormation template. The stack fails while creating the bucket notification, with an error saying that the destination configuration cannot be validated. What is the MOST likely fix?

    • A. Attach AWSLambdaBasicExecutionRole to the function's execution role.
    • B. Add an AWS::Lambda::Permission resource that allows s3.amazonaws.com to invoke the function, scoped with SourceArn and SourceAccount.
    • C. Add s3:GetObject on the bucket to the function's execution role.
    • D. Replace the notification with an event source mapping between the bucket and the function.
  2. An analytics account must invoke a function in the production account. The security team also requires that no principal outside the company's AWS Organization can ever invoke the function, even if someone later adds a broad statement. Which TWO actions meet these requirements? (Select TWO.)

    • A. Write a full JSON resource-based policy with put-resource-policy that allows the analytics role and explicitly denies callers whose aws:PrincipalOrgID differs.
    • B. Run add-permission with --principal '*' and rely on the analytics role's identity policy to limit access.
    • C. Grant lambda:InvokeFunction on the production function ARN in the analytics role's identity policy.
    • D. Attach the AWSLambdaRole managed policy to the production function's execution role.
    • E. Create an event source mapping in the analytics account that targets the production function.
Answers
  1. B. S3 validates that it may invoke the function when the notification is created; the resource-based permission (scoped to the bucket and account) provides that. A and C change what the function can do, not who can call it; D is impossible because S3 notifications are push-based, not an event source mapping.
  2. A, C. Cross-account invocation needs the function's resource policy and the caller's identity policy; the explicit Deny on aws:PrincipalOrgID overrides any later broad Allow. B opens the function to everyone; D changes the function's own permissions; E fails because event source mappings read queues and streams.

5. Concurrency scaling and throttling

Concept

Exam facts

Developer angle

aws lambda get-account-settings                          # AccountLimit and AccountUsage
aws lambda put-function-concurrency --function-name report-builder \
  --reserved-concurrent-executions 50
aws lambda put-function-concurrency --function-name report-builder \
  --reserved-concurrent-executions 0                     # emergency stop
aws lambda delete-function-concurrency --function-name report-builder
aws service-quotas request-service-quota-increase --service-code lambda \
  --quota-code L-B99A9384 --desired-value 3000
# alarm as soon as anything is throttled
aws cloudwatch put-metric-alarm --alarm-name report-builder-throttles \
  --namespace AWS/Lambda --metric-name Throttles --dimensions Name=FunctionName,Value=report-builder \
  --statistic Sum --period 60 --evaluation-periods 1 --threshold 1 \
  --comparison-operator GreaterThanOrEqualToThreshold \
  --alarm-actions arn:aws:sns:eu-west-1:111122223333:ops-alerts
import boto3
from botocore.config import Config
# client side: back off on 429 responses and wait long enough for slow functions
lambda_client = boto3.client("lambda", config=Config(
    retries={"max_attempts": 8, "mode": "adaptive"}, read_timeout=120))

Traps

Practice questions

  1. A nightly report function opens one connection per invocation to a legacy database that accepts at most 40 connections. At month end the function scales out and the database starts rejecting connections, which also breaks other applications. Which solution protects the database with the LEAST operational overhead?

    • A. Set the function's reserved concurrency to a value below 40.
    • B. Configure provisioned concurrency of 40 on the function's alias.
    • C. Increase the function timeout so that each invocation holds its connection longer.
    • D. Ask AWS to lower the account's concurrent executions quota.
  2. An API that invokes a function synchronously returns errors to users during a marketing campaign. CloudWatch shows Throttles rising while Errors stays at zero, the Region's ConcurrentExecutions sits flat at the account quota of 1,000, and the function has no reserved concurrency. Which TWO statements describe the situation and a valid response? (Select TWO.)

    • A. The function code is failing, and these failures are hidden from the Errors metric.
    • B. Callers receive TooManyRequestsException because the account's concurrency pool is exhausted.
    • C. Lambda stores the throttled requests and replays them for up to 6 hours.
    • D. Requesting a higher concurrent executions quota in Service Quotas addresses the cause.
    • E. Adding a dead-letter queue to the function captures the throttled requests.
Answers
  1. A. Reserved concurrency caps how many environments can open connections at once, with one setting and no new infrastructure. B pre-warms environments but doesn't cap scaling; C makes connection pressure worse; D would starve every other function in the account.
  2. B, D. Without reserved concurrency the 429s come from the shared account pool (ConcurrentInvocationLimitExceeded), so raising the quota fixes the cause. A is wrong because throttled requests never ran the code; C and E describe asynchronous behaviour, not synchronous API calls.

6. Cold starts with provisioned concurrency and SnapStart

Concept

Exam facts

Developer angle

import os
import uuid
import boto3
from snapshot_restore_py import register_after_restore   # only needed with SnapStart (Python)

# Init code: runs once per execution environment, reused by every warm invocation
table = boto3.resource("dynamodb").Table(os.environ["TABLE_NAME"])
instance_id = None

@register_after_restore
def refresh_unique_state():               # never reuse an ID captured in the snapshot
    global instance_id
    instance_id = str(uuid.uuid4())

def handler(event, context):
    table.put_item(Item={"pk": event["orderId"], "status": "NEW", "by": instance_id})
    return {"saved": event["orderId"]}
# provisioned concurrency on the live alias, then target-tracking at 70% utilization
aws lambda put-provisioned-concurrency-config --function-name checkout \
  --qualifier live --provisioned-concurrent-executions 20
aws application-autoscaling register-scalable-target --service-namespace lambda \
  --resource-id function:checkout:live \
  --scalable-dimension lambda:function:ProvisionedConcurrency \
  --min-capacity 20 --max-capacity 200
aws application-autoscaling put-scaling-policy --service-namespace lambda \
  --resource-id function:checkout:live \
  --scalable-dimension lambda:function:ProvisionedConcurrency \
  --policy-name pc-70 --policy-type TargetTrackingScaling \
  --target-tracking-scaling-policy-configuration '{"TargetValue": 0.7, "PredefinedMetricSpecification": {"PredefinedMetricType": "LambdaProvisionedConcurrencyUtilization"}}'

# SnapStart: enable, publish, verify on the new version
aws lambda update-function-configuration --function-name quote-engine \
  --snap-start ApplyOn=PublishedVersions
aws lambda publish-version --function-name quote-engine
aws lambda get-function-configuration --function-name quote-engine:7 --query SnapStart

Traps

Practice questions

  1. A Java 21 function behind an API spends about 6 seconds initializing its framework, so users see slow responses after deployments and whenever traffic spikes. Traffic is unpredictable and the team does not want to pay for idle pre-initialized capacity. Which solution meets these requirements?

    • A. Configure provisioned concurrency on the function's live alias.
    • B. Increase the function's memory to 10,240 MB.
    • C. Activate SnapStart, publish a new version, and point the alias at that version.
    • D. Move the framework initialization into the handler.
  2. A team configured provisioned concurrency of 50 on the live alias of a checkout function, yet many REPORT log lines for user requests still include Init Duration, and ProvisionedConcurrencySpilloverInvocations stays at zero. Which TWO statements identify the cause or confirm the fix? (Select TWO.)

    • A. The API integration invokes the unqualified function ARN, so requests run $LATEST on demand; point it at the live alias ARN.
    • B. Provisioned environments are used only after the function's reserved concurrency is removed.
    • C. Provisioned concurrency must be configured on $LATEST for unqualified invocations to use it.
    • D. SnapStart must be enabled before provisioned environments start serving requests.
    • E. The ProvisionedConcurrencyInvocations metric on the alias shows whether requests use the provisioned environments.
Answers
  1. C. SnapStart restores initialized Java environments from a snapshot, cutting cold starts without paying for idle environments. A meets the latency goal but bills for idle capacity; B adds CPU but the framework still initializes from scratch; D moves the cost to every invocation.
  2. A, E. Zero spillover plus constant cold starts means the provisioned alias isn't being invoked; calls to the unqualified ARN use $LATEST. ProvisionedConcurrencyInvocations confirms when the alias is used. B is wrong because PC and reserved concurrency can coexist; C is impossible because PC can't be set on $LATEST; D is wrong because SnapStart and PC can't be combined at all.

7. Versions and aliases with traffic shifting

Concept

Exam facts

Developer angle

aws lambda publish-version --function-name orders --description "invoice rounding fix"
aws lambda create-alias --function-name orders --name live --function-version 6

# canary: 10% of live traffic to version 7
aws lambda update-alias --function-name orders --name live \
  --routing-config 'AdditionalVersionWeights={"7"=0.1}'

# promote: everything to version 7 and clear the weights
aws lambda update-alias --function-name orders --name live \
  --function-version 7 --routing-config 'AdditionalVersionWeights={}'

# roll back instantly
aws lambda update-alias --function-name orders --name live --function-version 6

Traps

Practice questions

  1. A team wants to send 10% of production traffic to a new function version for 30 minutes and roll back automatically if a CloudWatch alarm fires, with as little manual work as possible. Clients already call the prod alias. What should the team do?

    • A. Create a second alias for the new version and update clients to call both aliases.
    • B. Publish the new version and schedule a cron job that calls update-alias after 30 minutes.
    • C. Point the prod alias at $LATEST and deploy the new code during a quiet period.
    • D. Use CodeDeploy with the CodeDeployDefault.LambdaCanary10Percent30Minutes configuration and the alarm on the prod alias.
  2. A developer tries to give the beta alias an AdditionalVersionWeights entry so that 20% of requests go to version 9 while version 8 keeps 80%. The update fails. Which TWO conditions can cause the failure? (Select TWO.)

    • A. Version 8 has more memory configured than version 9.
    • B. Version 9 uses a different execution role than version 8.
    • C. Version 9 has a dead-letter queue configured while version 8 has none.
    • D. The function has reserved concurrency configured.
    • E. Version 9 was published less than an hour after version 8.
Answers
  1. D. CodeDeploy shifts 10% through the alias, waits 30 minutes and rolls back on the alarm with no manual steps. A pushes routing into the clients; B adds a scheduled script and has no automatic rollback; C sends all traffic to unpublished code at once.
  2. B, C. Weighted aliases require the same execution role and the same DLQ configuration on both versions. Different memory (A), reserved concurrency (D) and publish timing (E) don't block weighted routing.

8. Deployment packages with layers and container images

Concept

Exam facts

Developer angle

# .zip with dependencies larger than 50 MB: stage it in S3
pip install -r requirements.txt --target package/ && cp app.py package/
(cd package && zip -r ../function.zip .)
aws s3 cp function.zip s3://deploy-artifacts-eu-west-1/orders/function-42.zip
aws lambda update-function-code --function-name orders \
  --s3-bucket deploy-artifacts-eu-west-1 --s3-key orders/function-42.zip --publish

# shared layer: publish, attach (the list replaces all layers), share with the organization
aws lambda publish-layer-version --layer-name pdf-tools --zip-file fileb://pdf-layer.zip \
  --compatible-runtimes python3.13 python3.14 --compatible-architectures arm64
aws lambda update-function-configuration --function-name invoice-render \
  --layers arn:aws:lambda:eu-west-1:111122223333:layer:pdf-tools:3
aws lambda add-layer-version-permission --layer-name pdf-tools --version-number 3 \
  --statement-id org-read --action lambda:GetLayerVersion --principal '*' \
  --organization-id o-a1b2c3d4e5

Container image from an AWS base image:

FROM public.ecr.aws/lambda/python:3.13
COPY requirements.txt ${LAMBDA_TASK_ROOT}
RUN pip install -r requirements.txt --target "${LAMBDA_TASK_ROOT}"
COPY app.py ${LAMBDA_TASK_ROOT}
CMD [ "app.handler" ]
docker buildx build --platform linux/arm64 --provenance=false -t invoice-api:1.4.0 .
docker run --platform linux/arm64 -p 9000:8080 invoice-api:1.4.0     # terminal 1: local RIE endpoint
curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"id": "inv-7"}'   # terminal 2
aws ecr get-login-password --region eu-west-1 | docker login --username AWS \
  --password-stdin 111122223333.dkr.ecr.eu-west-1.amazonaws.com
docker tag invoice-api:1.4.0 111122223333.dkr.ecr.eu-west-1.amazonaws.com/invoice-api:1.4.0
docker push 111122223333.dkr.ecr.eu-west-1.amazonaws.com/invoice-api:1.4.0
aws lambda update-function-code --function-name invoice-api --publish \
  --image-uri 111122223333.dkr.ecr.eu-west-1.amazonaws.com/invoice-api:1.4.0
OrdersFunction:                     # Runtime, Handler and Role omitted
  Type: AWS::Lambda::Function
  Properties:
    Code:                           # CloudFormation redeploys only when the key or version changes
      S3Bucket: deploy-artifacts-eu-west-1
      S3Key: orders/function-42.zip
      S3ObjectVersion: 3HL4kqtJlcpXroDTDmJ.rmSpXd3dIbrHY

Traps

Practice questions

  1. A data-science team needs a function that loads machine learning libraries totalling about 1.8 GB uncompressed. The team's builds already run in a Docker-based CI pipeline. Which deployment approach meets the requirement with the LEAST effort?

    • A. Split the libraries across five Lambda layers and attach them to a .zip function.
    • B. Package the function as a container image based on an AWS base image and deploy it from Amazon ECR.
    • C. Upload the .zip archive to S3 and reference it with S3Bucket and S3Key.
    • D. Download the libraries from S3 into /tmp at the start of every invocation.
  2. A developer uploads a new app.zip to the same S3 key and runs a CloudFormation stack update, but the function still runs the old code. Separately, a teammate pushes a fixed container image to ECR with the same prod tag, and that function also keeps running the old image. Which TWO actions fix these problems with the least disruption? (Select TWO.)

    • A. Turn on image tag immutability in the ECR repository.
    • B. Increase each function's memory to force new execution environments.
    • C. Delete and recreate both stacks so that the functions pick up the latest artifacts.
    • D. Change S3Key or S3ObjectVersion in the template so that CloudFormation detects new code.
    • E. Call update-function-code with the image URI (or the new digest) to redeploy the image.
Answers
  1. B. A container image holds up to 10 GB and fits the existing Docker pipeline. A and C still hit the 250 MB unzipped limit for a function plus its layers; D adds download time to every cold start and custom loading code.
  2. D, E. CloudFormation deploys new S3 code only when the code location changes, and Lambda pins an image digest until update-function-code runs. A prevents tag reuse but deploys nothing; B doesn't change the deployed code; C works but is the most disruptive option.

9. Environment variables and secrets

Concept

Exam facts

Developer angle

aws lambda get-function-configuration --function-name payments \
  --query '{vars: Environment.Variables, rev: RevisionId}'
aws lambda update-function-configuration --function-name payments \
  --environment 'Variables={TABLE_NAME=payments-prod,LOG_LEVEL=INFO,DB_SECRET_ID=prod/payments/db}' \
  --kms-key-arn arn:aws:kms:eu-west-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab \
  --revision-id "$REVISION_ID"

Read a secret through the extension (Python standard library only; the execution role needs secretsmanager:GetSecretValue on arn:aws:secretsmanager:eu-west-1:111122223333:secret:prod/payments/db-*, the -* covering the random suffix Secrets Manager adds to secret ARNs):

import json
import os
import urllib.parse
import urllib.request

def get_secret(secret_id):
    url = "http://localhost:2773/secretsmanager/get?secretId=" + urllib.parse.quote(secret_id)
    # SnapStart functions: resolve the token from the SDK credential chain instead
    req = urllib.request.Request(url, headers={"X-Aws-Parameters-Secrets-Token": os.environ["AWS_SESSION_TOKEN"]})
    with urllib.request.urlopen(req, timeout=2) as resp:
        return json.loads(json.loads(resp.read())["SecretString"])

def handler(event, context):
    creds = get_secret(os.environ["DB_SECRET_ID"])   # served from the extension cache after the first call
    return {"user": creds["username"]}

Traps

Practice questions

  1. A function reads a database password from an environment variable encrypted with the AWS managed key. An audit finds that developers with read-only Lambda access can see the password in the console, and the password must now rotate every 30 days without redeploying the function. Which solution meets these requirements with the LEAST operational overhead?

    • A. Store the password in Secrets Manager with rotation enabled and read it through the AWS Parameters and Secrets Lambda Extension.
    • B. Re-encrypt the environment variable with a customer managed key and remove kms:Decrypt from the developers.
    • C. Enable encryption helpers so that the value is encrypted client-side, and redeploy the function every month.
    • D. Store the password in an S3 object and download it in the handler on every invocation.
  2. After a teammate edits a function, every invocation fails with HTTP 502 and KMSDisabledException, and the LOG_LEVEL variable added last week has disappeared. Which TWO actions explain and fix the problems? (Select TWO.)

    • A. Increase the function timeout because decryption runs out of time during Init.
    • B. Re-enable the customer managed key used for the environment variables, or switch the function back to the AWS managed key.
    • C. Re-send the complete Variables map, because --environment replaced every variable with the one the teammate passed.
    • D. Add kms:Decrypt to the caller's identity policy so that Invoke can decrypt the payload.
    • E. Publish a new version, because $LATEST can't hold environment variables.
Answers
  1. A. Secrets Manager hides the value from Lambda readers and rotates it without redeployments; the extension caches it. B hides the value but still needs a redeploy for each rotation; C keeps the monthly redeploy; D adds latency and still has no rotation.
  2. B, C. KMSDisabledException means Lambda can't decrypt the variables because the key is disabled, and --environment overwrote the whole map. A is unrelated to KMS state; D confuses the caller's permissions with the function's; E is wrong because $LATEST holds environment variables.

10. VPC access and storage options

Concept

Exam facts

Option Persistence Shared between environments Size Typical use
/tmp Ephemeral, per environment No 512–10,240 MB Scratch files, cached downloads
Layer (/opt) Immutable per layer version Yes, read-only Within 250 MB unzipped Libraries, static reference data
EFS Durable Yes, read and write Elastic Shared models, large reference data, files between invocations
S3 (SDK) Durable Yes Object storage Inputs and outputs, large objects

Developer angle

aws lambda update-function-configuration --function-name orders-db \
  --vpc-config SubnetIds=subnet-0a1b2c3d4e5f60718,subnet-0f1e2d3c4b5a69788,SecurityGroupIds=sg-0123456789abcdef0
aws lambda wait function-updated-v2 --function-name orders-db
aws lambda get-function-configuration --function-name orders-db \
  --query '{state: State, update: LastUpdateStatus, reason: LastUpdateStatusReasonCode}'

aws lambda update-function-configuration --function-name orders-db --ephemeral-storage Size=4096
aws lambda update-function-configuration --function-name orders-db \
  --file-system-configs Arn=arn:aws:elasticfilesystem:eu-west-1:111122223333:access-point/fsap-0123456789abcdef0,LocalMountPath=/mnt/models

Keep the network-interface permissions for Lambda but deny them to the function's own code:

{ "Version": "2012-10-17",
  "Statement": [{ "Effect": "Deny", "Resource": "*",
    "Action": ["ec2:CreateNetworkInterface", "ec2:DeleteNetworkInterface", "ec2:DescribeNetworkInterfaces",
               "ec2:DescribeSubnets", "ec2:DetachNetworkInterface", "ec2:AssignPrivateIpAddresses",
               "ec2:UnassignPrivateIpAddresses"],
    "Condition": { "ArnEquals": {
      "lambda:SourceFunctionArn": "arn:aws:lambda:eu-west-1:111122223333:function:orders-db" } } }] }

Traps

Practice questions

  1. A function was attached to private subnets so that it can query an RDS database. Since the change, its calls to a third-party HTTPS API time out while database queries succeed. What should the developer do?

    • A. Move the function to public subnets so that it receives a public IP address.
    • B. Create an interface VPC endpoint for the third-party API's domain name.
    • C. Attach the AWSLambdaVPCAccessExecutionRole policy to the execution role.
    • D. Route the private subnets' internet-bound traffic through a NAT gateway in a public subnet.
  2. An inference function needs a 3 GB model that hundreds of concurrent environments must read and that data scientists replace weekly without redeploying the function. Downloading the model from S3 during every cold start makes cold starts too slow. Which TWO steps are required for the best-fitting solution? (Select TWO.)

    • A. Package the model in a Lambda layer and attach it to the function.
    • B. Raise ephemeral storage to 10,240 MB so that the model fits in /tmp.
    • C. Attach the function to the VPC that contains the EFS file system's mount targets.
    • D. Create an EFS access point and mount it under a path that starts with /mnt/.
    • E. Enable SnapStart so that the model is restored from the snapshot.
Answers
  1. D. A VPC-attached function reaches the internet only through a NAT gateway from private subnets. A fails because Lambda never assigns public IPs; B applies to AWS services and PrivateLink providers, not an arbitrary public API; C supplies interface permissions the function evidently already has.
  2. C, D. EFS shares one copy of the model across all environments and can be updated without redeploying; Lambda mounts it from the VPC through an access point under /mnt/. A exceeds the 250 MB unzipped limit; B still downloads per environment; E would freeze the weekly model into published versions and can't use more than 512 MB of /tmp.

11. Function URLs and response streaming

Concept

Exam facts

Developer angle

aws lambda create-function-url-config --function-name webhook --qualifier live \
  --auth-type NONE \
  --cors-config '{"AllowOrigins": ["https://app.example.com"], "AllowMethods": ["POST"]}'

# with the CLI you add both public statements yourself
aws lambda add-permission --function-name webhook --qualifier live \
  --statement-id url-public --action lambda:InvokeFunctionUrl \
  --principal '*' --function-url-auth-type NONE
aws lambda add-permission --function-name webhook --qualifier live \
  --statement-id url-invoke --action lambda:InvokeFunction \
  --principal '*' --invoked-via-function-url

# calling an AWS_IAM URL: sign the request with SigV4 for the lambda service
curl --aws-sigv4 "aws:amz:eu-west-1:lambda" \
  --user "$AWS_ACCESS_KEY_ID:$AWS_SECRET_ACCESS_KEY" \
  -H "x-amz-security-token: $AWS_SESSION_TOKEN" \
  -H 'content-type: application/json' -d '{"ping": true}' \
  https://abcdefghij1234567890.lambda-url.eu-west-1.on.aws/

A streaming handler (Node.js managed runtime; set the URL's invoke mode to RESPONSE_STREAM):

export const handler = awslambda.streamifyResponse(async (event, responseStream, context) => {
  for (const part of ["header\n", "rows...\n", "footer\n"]) {
    responseStream.write(part);
  }
  responseStream.end();
});

Traps

Practice questions

  1. A team exposes a webhook receiver through a Lambda function URL with auth type NONE, created with the AWS CLI. Every request from the SaaS provider receives 403 Forbidden, although the function's resource-based policy allows lambda:InvokeFunctionUrl for all principals. What is the MOST likely cause?

    • A. Function URLs with auth type NONE require requests signed with SigV4.
    • B. The policy lacks a statement that allows lambda:InvokeFunction for calls made through the function URL.
    • C. The function URL is attached to a published version instead of an alias.
    • D. The function's reserved concurrency is too low for the webhook traffic.
  2. A company wants a mobile back end in a partner AWS account to call one of its functions through a function URL. Only signed requests from a single IAM role in that account may succeed. Which TWO configurations are required? (Select TWO.)

    • A. Set the function URL's auth type to AWS_IAM.
    • B. Add CORS settings that allow the partner's web origin.
    • C. Create an interface VPC endpoint for the function URL in the partner's VPC.
    • D. Grant the partner role lambda:InvokeFunctionUrl and lambda:InvokeFunction in both the function's resource-based policy and the role's identity policy.
    • E. Set reserved concurrency to 0 for all other callers.
Answers
  1. B. New function URLs need both actions, and the CLI does not add the lambda:InvokeFunction statement (scoped with lambda:InvokedViaFunctionUrl). A is wrong because NONE accepts unsigned requests; C can't happen because URLs attach only to aliases or $LATEST; D would cause 429, not 403.
  2. A, D. AWS_IAM requires SigV4-signed requests, and a cross-account caller needs the permissions on both sides. B matters only for browsers; C is impossible because function URLs don't support PrivateLink; E would throttle everyone, including the partner.

12. Observability with logs metrics and traces

Concept

Exam facts

Developer angle

aws lambda update-function-configuration --function-name orders \
  --logging-config LogFormat=JSON,ApplicationLogLevel=WARN,SystemLogLevel=INFO,LogGroup=/shop/orders
aws lambda update-function-configuration --function-name orders --tracing-config Mode=Active
aws logs tail /shop/orders --follow --since 10m
aws lambda put-function-recursion-config --function-name orders --recursive-loop Terminate

CloudWatch Logs Insights query over REPORT lines (memory headroom, latency, cold starts):

filter @type = "REPORT"
| stats max(@maxMemoryUsed / 1000 / 1000) as maxMemoryMB,
        avg(@duration) as avgDurationMs,
        count(@initDuration) as coldStarts
  by bin(1h)

Traps

Practice questions

  1. A developer enables X-Ray tracing on an API Gateway stage, but the service map shows no Lambda nodes for the integrated function. The execution role already allows xray:PutTraceSegments and xray:PutTelemetryRecords. What should the developer do?

    • A. Raise the X-Ray sampling rate in the function configuration to 100%.
    • B. Set the AWS_XRAY_CONTEXT_MISSING environment variable to RUNTIME_ERROR.
    • C. Change the function's tracing configuration to Active.
    • D. Add a layer that runs the X-Ray daemon inside the function.
  2. After a teammate replaced a function's execution role, the function writes nothing to CloudWatch Logs, yet the Invocations metric keeps rising and the function's downstream writes still happen. The team also wants DEBUG output only in the test stage. Which TWO actions address these needs? (Select TWO.)

    • A. Enable Active tracing so that log lines are forwarded through X-Ray.
    • B. Add logs:CreateLogStream and logs:PutLogEvents (for example AWSLambdaBasicExecutionRole) to the new execution role.
    • C. Increase the function's memory because logging stops when memory runs out.
    • D. Add a resource-based policy statement that allows logs.amazonaws.com to invoke the function.
    • E. Use the JSON log format and set a lower ApplicationLogLevel on the test stage's function.
Answers
  1. C. In PassThrough mode Lambda only forwards the header; Active tracing makes it send segments. A isn't configurable for Lambda; B changes SDK behaviour, not whether segments are sent; D is unnecessary because Lambda runs the daemon for you.
  2. B, E. The new role lacks the CloudWatch Logs permissions, and JSON logging with ApplicationLogLevel filters levels per function configuration. A sends traces, not logs; C is unrelated to log delivery; D concerns who can invoke the function.

13. Performance tuning and limits

Concept

Exam facts

Developer angle

aws lambda update-function-configuration --function-name image-score \
  --memory-size 2048 --timeout 60
aws lambda update-function-code --function-name image-score \
  --zip-file fileb://image-score-arm64.zip --architectures arm64
aws lambda get-function-configuration --function-name image-score \
  --query '{memory: MemorySize, timeout: Timeout, arch: Architectures, tmp: EphemeralStorage.Size}'

Traps

Practice questions

  1. A single-threaded image-scoring function configured with 512 MB takes 9 seconds per request, and CPU utilization stays at its limit. The team needs responses under 3 seconds without rewriting the code, at the lowest cost that meets the target. What should the developer do first?

    • A. Increase memory in steps (for example with AWS Lambda Power Tuning) toward about 1,769 MB and measure duration and cost.
    • B. Set memory to 10,240 MB so that the function receives 6 vCPUs.
    • C. Configure provisioned concurrency so that each request starts in a warm environment.
    • D. Increase the function timeout from 10 seconds to 60 seconds.
  2. A nightly job processes about 2 million records in a single Lambda invocation that needs roughly 25 minutes and keeps timing out. The team wants to stay serverless with minimal operational overhead. Which TWO approaches meet the requirement? (Select TWO.)

    • A. Request a Service Quotas increase that raises the function timeout to 30 minutes.
    • B. Split the records into chunks and process them in parallel with a Step Functions Distributed Map state that invokes the function per chunk.
    • C. Increase memory to 10,240 MB so the job finishes within the current timeout.
    • D. Publish the records in chunks to an SQS queue and let an event source mapping invoke the function with batches.
    • E. Write intermediate results to /tmp so that they survive the timeout and the next run continues.
Answers
  1. A. CPU scales with memory up to one full vCPU at 1,769 MB, which is what single-threaded code can use; measuring finds the cheapest size that meets 3 seconds. B pays for 6 vCPUs the code can't use; C removes cold starts but not CPU-bound duration; D only lets the slow run continue longer.
  2. B, D. Both spread the work over many short invocations that each stay under 15 minutes, with managed retries. A fails because the 900-second maximum isn't adjustable; C isn't guaranteed to cut a 25-minute job below 15 minutes; E fails because /tmp belongs to one environment and the next invocation may run elsewhere.

Quick decision rules

Invocation and failure handling (§1–§3)

Permissions (§4)

Scaling and latency (§5–§6)

Releases and packaging (§7–§8)

Configuration, networking and endpoints (§9–§11)

Observability and tuning (§12–§13)

Changed vs older material

Learn the Current column; older practice material may still show the Older material may say value. Lambda rows awaiting confirmation are listed in the ingest report; confirmed rows, with verification dates, live in notes/current-facts.md.

Topic Older material may say Current (verified 2026-10-12) Source
§1 · §2 · Asynchronous invocation payload 256 KB 1 MB (quota 1,024 KB, not adjustable) since 2025-10-24; one request billed for the first 256 KB plus one per extra 64 KB What's New
§1 · Firehose name Kinesis Data Firehose Amazon Data Firehose (renamed 2024-02-09; row kept under sqs-sns-kinesis in notes/current-facts.md) What's New
§2 · Asynchronous destinations SQS, SNS, Lambda or EventBridge On failure also an S3 bucket (failure records only); on success SQS, SNS, Lambda or EventBridge AWS docs
§2 · §4 · EventBridge rule permission to invoke A resource-based statement for events.amazonaws.com is always required A resource-based statement or an IAM execution role on the target (RoleArn allowing lambda:InvokeFunction) since 2025-03-11; the statement is needed only when no role is set (row kept under monitoring in notes/current-facts.md) AWS docs
§3 · Event source mapping sources Kinesis, SQS and DynamoDB Streams Also Amazon MSK, self-managed Apache Kafka, Amazon MQ and Amazon DocumentDB AWS docs
§3 · SQS batch size 1–10 messages Standard queues up to 10,000 (batching window ≥ 1 s above 10), FIFO up to 10, default 10 AWS docs
§3 · SQS scaling +60 instances per minute, up to 1,000 batches at once Starts at 5, adds up to 300 concurrent invocations per minute (since 2023-11-06), at most 1,250 per mapping; provisioned mode scales further AWS docs
§3 · Discarded-batch destinations SQS or SNS SQS, SNS or S3 (Kinesis, DynamoDB and Kafka mappings; S3 receives the whole batch) and Kafka topics for Kafka mappings AWS docs
§4 · Function resource-based policies Built one Allow statement at a time with AddPermission, limited conditions Full JSON via PutResourcePolicy (multiple principals and actions, explicit Deny, all global condition keys; overwrites the policy) since 2026-08-25; 20 KB AWS docs
§5 · Concurrency scaling rate Account-wide burst of 500–3,000, then +500 per minute 1,000 execution environments every 10 s per function (since 2023-11-26), not adjustable AWS docs
§5 · Throttle error and quota increases "ThrottleError 429"; open a support ticket for more concurrency TooManyRequestsException (429) with ConcurrentInvocationLimitExceeded or ReservedFunctionConcurrentInvocationLimitExceeded; request increases in Service Quotas (L-B99A9384) AWS docs
§6 · Init phase billing Init is free for on-demand .zip functions on managed runtimes Billed for every configuration since 2025-08-01 AWS blog
§6 · SnapStart runtimes and packaging Java only, .zip packages only Java 11+, Python 3.12+, .NET 8+; .zip and container images on AWS base images; Python and .NET pay for caching and restores AWS docs
§8 · Code storage per Region 75 GB 300 GB of Lambda-managed storage (since 2026-07-15); self-managed S3 code storage doesn't count What's New
§8 · Runtime-included AWS SDK Every function gets the AWS SDK Only Node.js, Python and Ruby runtimes include one; AWS recommends bundling your own AWS docs
§8 · Go and Rust Community-supported custom runtimes OS-only runtime provided.al2023 (go1.x deprecated 2024-01-08) AWS docs
§8 · Container base images amazon/aws-lambda-nodejs:12, built on Amazon Linux 2 public.ecr.aws/lambda/<runtime>:<tag>; Amazon Linux 2023 for Node.js 20+, Python 3.12+, Java 21+, .NET 8+, Ruby 3.3+ AWS docs
§9 · Where secrets go KMS-encrypted environment variables are the place for secrets AWS recommends Secrets Manager instead of environment variables for credentials (Parameters and Secrets extension for cached reads) AWS docs
§10 · /tmp encryption /tmp is protected only if your code encrypts it with KMS data keys Always encrypted at rest with an AWS managed key, no setup; KMS data keys only for your own key or application-level encryption AWS docs
§11 · Function URL invoke permissions lambda:InvokeFunctionUrl alone lambda:InvokeFunctionUrl plus lambda:InvokeFunction (scope with lambda:InvokedViaFunctionUrl) for URLs created since October 2025, else 403 AWS docs
§11 · Streamed response size 20 MB 200 MB (since 2025-07-31); first 6 MB uncapped, then 2 MBps What's New
§12 · PassThrough tracing Lambda sends traces automatically when the upstream request was sampled PassThrough only forwards the header; enable Active tracing for Lambda segments AWS docs
§12 · X-Ray SDK X-Ray SDK plus daemon is the standard way to instrument Maintenance mode since 2026-02-25; OpenTelemetry recommended (row kept under monitoring in notes/current-facts.md) AWS docs
§13 · Memory for one full vCPU 1,792 MB 1,769 MB (up to 6 vCPUs at 10,240 MB) AWS docs
§13 · Duration price $1.00 per 600,000 GB-seconds $0.0000166667 per GB-second (x86, US East (N. Virginia), first tier) ≈ $1 per 60,000 GB-seconds AWS pricing