How to test a Lambda function locally with SAM and AWS SAM CLI
| Service | AWS Lambda |
|---|---|
| Cloud | Amazon Web Services (AWS) |
| Guide type | Procedure |
| Skill level | Intermediate to advanced |
| Time | 15 - 60 minutes depending on account size |
When How to test a Lambda function locally with SAM and AWS SAM CLI bites you on AWS Lambda, the first instinct is to open a ticket. Most of the time you do not have to. The steps below are the ones AWS Support would walk you through on the call.
What how to test a lambda function locally with sam and aws sam cli actually involves on AWS Lambda
This task on Lambda is one of the more searched operational topics on AWS in the last 12 months. The procedure below is the path that works in a current AWS account with default IAM and standard VPC config.
The rest of this page is the structured fix path. Start with diagnose, then remediation, then the automation options so you do not have to do this by hand the next time it surfaces. Verify and safety sections at the end are the discipline that keeps the fix from regressing in production.
Signal review
Pull the AWS request ID from the response headers: x-amz-request-id for most services, x-amzn-RequestId for API Gateway, both x-amz-request-id and x-amz-id-2 for S3. AWS Support needs these IDs to look up your call in their internal logs - without them, the first reply on a ticket will ask you to reproduce the call and capture them. Save them with a timestamp; AWS Support cannot retrieve calls older than 90 days for most services.
Check CloudWatch Logs for the calling service. Lambda, ECS, EKS, Step Functions, API Gateway, and most managed services write detailed traces to CloudWatch Logs under predictable log group names. Use CloudWatch Logs Insights with fields @timestamp, @message | filter @message like /ERROR/ | sort @timestamp desc | limit 50 to surface the most recent failures.
Diff against last known good. The last config change you made is the cause about three quarters of the time, even when the change should not have mattered. Use AWS Config history (or your Terraform / CloudFormation drift report) to see the actual delta between the resource state when it worked and when it broke. The change you remember is often not the only change that happened.
Solution-focused remediation path
If you cannot reproduce the failure consistently, the cause is probably a race condition or a session-cache issue. Run the call with --profile set to a fresh STS session, in a different region you control, with a single concurrent request. If it works there but fails in your normal setup, the difference is the bug.
Most AWS Lambda failures fall into one of three buckets: IAM permission gap, networking path break (security group, NACL, or VPC endpoint policy), or service-limit / quota hit. Run that mental triage first - it covers around 80 percent of real-world cases. If the failure does not fit any of the three, it is likely a service-side regression worth opening a re:Post or support ticket for.
If the issue points at IAM, do not start by adding * to a policy. Use IAM Access Analyzer (Policy Generator) against the failed action to see the minimum scope. Adding * is the fastest way to fail your next AWS Well-Architected security review, and it usually does not even fix the issue because the explicit deny is often coming from a higher level (SCP, RCP, or permission boundary), not a missing allow.
Automate this fix so you do not do it twice
Codify the fix in Terraform or CloudFormation
When you reach for the console to fix the same issue twice, the third occurrence should be solved in IaC, not in the console. Terraform's terraform import and CloudFormation's resource importer let you adopt the existing resource into state without recreating it. Lock the corrected attribute behind a variable so the next operator does not have to rediscover the value. Add a moved {} block or CloudFormation resource refactor to keep the diff clean.
Add a Systems Manager Automation runbook
For multi-step fixes that include a manual approval, use SSM Automation. Document the fix as a runbook with aws:approve steps where a human signs off and aws:executeAwsApi steps where the runbook calls the AWS API. Approvers are notified by SNS; the runbook execution shows up in CloudTrail with the approver's identity attached. This makes audit trails easy and stops production fixes from being one-person operations.
Automate the fix with the AWS CLI
The CLI one-liner pattern for AWS Lambda operations is roughly: aws lambda describe-... --query ... to read state, aws lambda modify-... --no-dry-run to apply the change, and aws lambda describe-... --query ... again to verify. Wrap it in a shell script that sets a region variable at the top and exits on first error with set -euo pipefail so a partial run does not leave the account in a half-fixed state.
# Template - replace placeholders with your account specifics
export AWS_REGION=us-east-1
export AWS_PROFILE=prod
aws lambda describe-... --query 'Resources[?Status==`FAILED`].[Id,Reason]' --output table
aws lambda modify-... --resource-id RESOURCE_ID --no-dry-run
aws lambda describe-... --resource-id RESOURCE_ID --query 'Status'
Things that bite
The most common pitfall when fixing this on AWS Lambda is treating it as a one-off rather than as a recurring class of incident. The same misconfiguration tends to happen again after a deployment, a role rotation, or a region migration unless the fix is codified. Add a CloudFormation hook, Service Control Policy condition, or AWS Config rule that prevents the same misconfig from being introduced again. Documentation alone does not survive turnover.
Another common trap: confirming the fix on a single resource and assuming the fleet is healthy. Loop your check across every account, region, and IAM principal that could exhibit the same symptom. If you cannot enumerate the affected scope without a script, you do not yet understand the scope.
Repair sequence
- Reproduce the original symptom path. If it still surfaces in any account or region or IAM role, you have not fixed it.
- Watch for 24 to 48 hours. AWS metrics and policy systems can mask issues with cached health for 6 to 12 hours, especially CloudFront and Route 53.
- Run a smoke test under realistic load. Happy-path tests miss race conditions and IAM session-cache issues.
- Capture the new state in a runbook so the next person on call does not have to rediscover this. Push it to Confluence or your team wiki, not into Slack.
- If the fix involved a permission change, run IAM Access Analyzer one more time to confirm you did not open a separate hole while closing this one.
Safety, rollback, blast radius
- Test in a non-production account if your environment has Control Tower or AWS Organizations. The cost of one sandbox account is cheaper than one rollback meeting.
- Export the existing config before changing it. Most AWS Lambda resources support describe + export to JSON via CLI - capture that to source control before you start.
- Know your rollback path. Some AWS Lambda operations are one-way (region migration, account-level feature opt-in, KMS key deletion past pending window). Confirm reversibility on the AWS doc before you commit.
- Be aware of cross-service impact. IAM role changes ripple to every service trusting that role. KMS key changes break every workload depending on that key. VPC endpoint changes affect every VPC consumer of that endpoint.
- Maintenance window discipline: if the change touches DNS, certificate rotation, or anything that emits TLS handshakes, line up a window with stakeholder notification, not a heroic mid-day swap.
FAQ
aws lambda describe-... first, then commit it before you change anything. A few operations are one-way (KMS key deletion past the pending window, region migration, account closure). Check the AWS doc for the specific API before you commit.aws CLI or SDK calls - those almost always still work.References
- docs.aws.amazon.com - official documentation for AWS Lambda
- AWS re:Post (formerly forums) - community Q&A with AWS-staff-verified answers
- AWS Health Dashboard at health.aws.amazon.com
- AWS Service Quotas console and AWS Well-Architected Tool
Related fixes
Related guides worth a look while you sort this one out:
- SAM remote testing Lambda function URL invocation
- OAC for Lambda function URL AWS_IAM auth-type and SigV4 signing config
- How to fix CodeStorageExceededException when uploading a Lambda function
- How to use Lambda function URLs instead of API Gateway
- Secrets Manager Lambda rotation function fails AWSPENDING vs AWSCURRENT lifecycle
- Step Functions Lambda.Unknown function timeout out of memory