The fix depends on which thing is missing. Cannot find module 'chrome-aws-lambda' (or puppeteer-core) is a Node.js dependency-resolution problem. An error from puppeteer.launch() saying that Chromium or an executable path is missing is a browser-asset or runtime problem. Check the complete Lambda stack trace, deployed artifact, package versions, layer layout, and launch configuration before changing packages.
First, identify the failure class
Capture the complete CloudWatch error, including the first stack-trace line and the operation that failed. Record the Lambda Node.js runtime, Puppeteer and Chromium package versions, deployment type (ZIP, layer, or container), and whether the failure occurs during an import or at puppeteer.launch(). Puppeteer’s diagnostic guidance separates missing-browser launch failures from other error types; see its diagnostic guide and error reference.
JavaScript module resolution
Messages such as Cannot find module 'chrome-aws-lambda' or Cannot find package 'puppeteer-core' mean Node cannot resolve a JavaScript package. The browser has not been launched yet. Investigate dependency declarations, production installation, bundler output, and layer paths.
Chromium executable or asset resolution
If imports succeed but launch reports a missing executable, an invalid path, permission failure, or unavailable browser files, the issue is different. Check that Chromium is present in the deployed artifact or attached layer, that the package can extract it in Lambda’s writable temporary directory, and that the configured executable path is the one returned by the package.
#1 Best Overall
- Intel Celeron N4120: 4 Cores & Threads, 1.1GHz Base Clock, Up to 2.6GHz Boost Clock, 4MB Cache, Intel UHD Graphics 600. The perfect combination of performance, power consumption, and value helps your device handle multitasking smoothly and reliably with four processing cores to divide up the work.
- 14" HD Display: 14.0-inch diagonal, HD (1366 x 768), micro-edge, anti-glare. See your digital world in a whole new way. Enjoy movies and photos with the great image quality and high-definition detail of 1 million pixels.
- Memory & Storage: 4 GB LPDDR4x & 64 GB eMMC Storage. Adequate high-bandwidth RAM to smoothly run multiple applications and browser tabs all at once. An embedded multimedia card provides reliable flash-based storage.
- Ports:2 x USB 3.0 Type-A,1 x USB 3.0 Type-C,1 x HDMI,1 x Headphone Jack
- Chrome OS: Chromebook is a computer for the way the modern world works, with thousands of apps. Enjoy the seamless simplicity that comes with Google Chrome and Android apps, all integrated into one laptop. It’s fast, simple, and secure.
Check what Lambda actually received
- Inspect production dependencies. Ensure every package imported by the function is listed in
dependencies, not onlydevDependencies. Build and install with the same production settings used by CI. A package installed on your workstation does not prove it is inside the ZIP or container. - Inspect the artifact. Unzip the deployment package (or inspect the container image) and verify the expected
node_modulesdirectories and Chromium files exist. Bundlers may tree-shake or externalize native/browser assets; configure them to include the package files rather than assuming a local cache will be available. - Validate layers. Confirm the layer is attached to the exact function and version, is published for the selected architecture, and uses the directory layout visible to that Node.js runtime. A correctly built layer has no effect if it is not attached or its files are outside Node’s search paths.
- Reproduce production locally. Run the built artifact with the same Node.js major version and environment variables used by Lambda. Do not use a developer install containing packages or browser caches that the deployed function lacks.
Repairing an application that uses the original chrome-aws-lambda
For an existing application intentionally built around the original package, do not select versions independently. Its README compatibility table maps each package release to a Puppeteer release and Chromium revision. Choose a row from that table, pin the versions, reinstall, and redeploy the complete dependency tree.
Install the mapped versions
npm install --save-exact chrome-aws-lambda@<mapped-version> puppeteer-core@<mapped-version>
# or use the exact pair specified by the project's compatibility table
npm ci --omit=dev
The README also documents installing matching puppeteer-core separately. Keep the package pair in lockfile and deploy from that lockfile so a later install cannot silently change the browser revision.
Use the package’s launch values
const chromium = require('chrome-aws-lambda');
exports.handler = async () => {
const browser = await chromium.puppeteer.launch({
args: chromium.args,
defaultViewport: chromium.defaultViewport,
executablePath: await chromium.executablePath,
headless: chromium.headless
});
try {
const page = await browser.newPage();
await page.goto('https://example.com', { waitUntil: 'networkidle2' });
return {
statusCode: 200,
body: await page.title()
};
} finally {
await browser.close();
}
};
Do not hard-code a path from a local Chrome installation. await chromium.executablePath is the package-provided path after its browser assets are available to Lambda. Keep the documented args, viewport, and headless settings unless you have verified a deliberate alternative.
Rank #2
- Storage: 16GB Flash Memory
- OS: Chrome OS
- Screen Size: 11.6"
When a newer Puppeteer stack is a better fit
If the project uses a newer Puppeteer release, evaluate @sparticuz/chromium with puppeteer-core. The package documentation says it is not pinned to particular Puppeteer versions, but its Chromium build still must match a browser version supported by your chosen Puppeteer. Pin both dependencies and test the deployed artifact; “not tied to a specific version” does not mean every Chromium/Puppeteer combination is valid.
Current-style launch example
const puppeteer = require('puppeteer-core');
const chromium = require('@sparticuz/chromium');
exports.handler = async () => {
const browser = await puppeteer.launch({
args: chromium.args,
defaultViewport: chromium.defaultViewport,
executablePath: await chromium.executablePath(),
headless: chromium.headless
});
try {
const page = await browser.newPage();
await page.goto('https://example.com', { waitUntil: 'networkidle2' });
return { statusCode: 200, body: await page.title() };
} finally {
await browser.close();
}
};
Follow the package’s current API exactly; method names and extraction behavior can change between releases. The @sparticuz/chromium README describes both packaging Chromium with the function and deploying it as a Lambda layer, plus a minimal package option for deployment-size constraints.
Package Chromium correctly
ZIP deployment
Build the ZIP from a clean install, include production node_modules, and verify the Chromium asset directories before uploading. Native modules and compressed browser files must be built for the Lambda architecture you select. If your build tool externalizes @sparticuz/chromium or chrome-aws-lambda, explicitly copy the package assets into the artifact.
Rank #3
- Intel Processor Up to 2.80GHz, 4GB DDR4, 128GB Storage
- 15" FHD IPS Display, Intel UHD Graphics
- 1x USB Type C, 1 x USB Type A, 1x Headphone/Microphone Combo Jack, HDMI
- Super Fast WiFi and Bluetooth, Integrated Webcam
- Chrome OS, AC Charger Included, Pastel Blue
Lambda layer
Attach the layer to the function, publish a new layer version when files change, and confirm the function’s architecture and Node.js runtime are supported by that layer. Check the layer’s directory tree against the paths documented by the package. A layer that exists in AWS but is not attached to the deployed function produces the same symptom as a missing package.
Container image
Install dependencies during the image build, copy browser assets into the final runtime stage, and test the final image rather than an intermediate build stage. Avoid relying on a browser installed only on the CI host.
Runtime and resource settings
The @sparticuz/chrome-aws-lambda documentation says it works with currently supported Lambda Node.js runtimes and recommends at least 512 MB of memory, with 1600 MB or more recommended. That is maintainer guidance, not a guaranteed minimum for every page or workload. Increase memory when launches are killed, extraction fails under pressure, or pages time out, and measure your own workload.
Rank #4
- THE BETTER WAY TO LAPTOP – Imagine a Chromebook that’s as flexible as your day: thin and lightweight with built-in Google apps and stress-free security.
- TAKE HITS KEEP MOVING – Sleek, light, and built to last- the Chromebook 2-in-1 is just 0.69” thick and 3.3lbs. Enjoy long-lasting battery life, fast charging, and military-grade durability for nonstop productivity wherever life takes you.
- PERFORMANCE THAT MATCHES YOUR HUSTLE – Fuel your ideas with an Intel Core processor and 128GB storage. Boot up in under 10 seconds to start the day powerfully efficient.
- FLEX YOUR CREATIVITY ANYWHERE, ANYTIME – Create, work, or unwind your way with a versatile 2-in-1 design. Flip easily between laptop, tent, and tablet modes with a responsive touchscreen built for flexibility.
- BRILLIANT VIEWS AND IMMERSIVE AUDIO – See, hear, and create with awesome clarity. The WUXGA display brings rich detail to your work and play, while audio tuned by Waves MaxxAudio provides immersive, balanced sound.
Allow enough timeout for cold-start extraction, browser launch, navigation, and rendering. Reuse a browser between warm invocations only when you reset pages and close them reliably; always close the browser on errors. Ensure the function can write to the temporary directory used for extraction and has network access to the target site.
Systematic troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
Cannot find module 'chrome-aws-lambda' |
Package absent from production artifact, wrong layer path, or bundler externalized it. | Add it to production dependencies, run a clean production install, inspect the ZIP/layer, and rebuild the bundler output. |
Cannot find package 'puppeteer-core' |
Puppeteer core was installed locally or omitted from the deployed dependency tree. | Declare and pin it, run npm ci --omit=dev, and verify it is present in the artifact. |
| Launch reports a missing executable | Chromium files were not packaged, extraction failed, or an incorrect path was supplied. | Verify browser assets, writable temporary storage, and use the package’s documented executable-path property. |
| Browser starts locally but not in Lambda | Local browser cache, runtime, architecture, or environment differs from production. | Run the built artifact with Lambda’s Node.js version and architecture; test the same ZIP, layer, or image. |
| Page launch times out or the process is killed | Insufficient memory/timeout, slow navigation, or blocked network access. | Increase memory and timeout, use an explicit navigation wait strategy, and verify VPC/NAT or other egress requirements. |
| Layer appears present but imports still fail | Layer not attached to the active function version or files are outside Node’s module search path. | Inspect the function configuration and layer directory layout, then publish and attach the correct layer version. |
| Version-dependent protocol or launch errors | Puppeteer expects a different Chromium revision. | For chrome-aws-lambda, use its compatibility table; for Sparticuz, match its Chromium to Puppeteer’s supported browser and pin both. |
Verification checklist before redeploying
- The stack trace identifies import failure versus executable/browser failure.
- Package versions are pinned and compatible with the selected Chromium revision.
- The production artifact contains JavaScript packages and browser assets, or the attached layer contains them at documented paths.
- The function architecture, Node.js runtime, memory, timeout, temporary storage, and network path match the package and workload.
- The launch call uses the package’s arguments, viewport, headless setting, and executable path.
- A test invocation logs package versions, the resolved executable path (without secrets), navigation result, and browser-close behavior.
Or skip the browser setup
If your goal is simply a reliable website screenshot rather than running Chromium inside your Lambda function, ScreenshotNeo provides a website screenshot API and MCP server. It accepts consent banners before capture and removes more than 60 known consent platforms, newsletter popups, and chat widgets. Bot checks or CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed; response headers identify the page verdict and whether the request was billed.
One request returns PNG, JPEG, WebP, or PDF. The API supports full-page captures with lazy images, CSS-selector element captures, device presets and custom viewports, dark mode, retina scale, PDF paper and page-range settings, custom CSS and JavaScript, clicks, waits, request blocking, headers, cookies, user agents, authorization, timezone, geolocation, transparent backgrounds, resizing, TTL caching, signed image links, asynchronous jobs with signed webhooks, bulk capture of up to 100 URLs per call, usage reporting, and an OpenAPI specification. Existing screenshot integrations can use the parameter names common to other APIs. An MCP server exposes take_screenshot, get_page_info, and capture_pdf to Claude, Cursor, and other MCP clients.
Do these 3 things before closing this tab:
1Clear out junk files and repair common Windows errors2Scan for outdated or missing drivers - takes under a minute3Repair Windows errors before they cause bigger problemscURL (see the ScreenshotNeo documentation):
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
Python:
import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
open("shot.webp", "wb").write(r.content)
Node.js:
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
The Free plan includes 1,000 screenshots each month with no card. Paid plans start at $5 for 3,000 shots; every feature is on every plan. Create a free ScreenshotNeo account.
Best Value
- Storage: 16 GB Flash Memory
- OS: Chrome OS
- Screen Size: 11.6"
FAQ
Is chrome-aws-lambda itself abandoned or universally broken?
No universal conclusion follows from a missing-module error. Existing applications can work when their dependency tree and compatibility mapping are intact; the stack trace and deployed artifact determine the remedy.
Should I install full puppeteer instead of puppeteer-core?
Use the package’s documented pairing. Serverless Chromium packages are commonly used with puppeteer-core so the browser supplied by the serverless package is launched explicitly.
Can I fix this only by increasing Lambda memory?
Memory can help launch and extraction failures, but it cannot add an omitted npm package, attach a missing layer, or correct incompatible browser revisions.
Frequently Asked Questions
Is `chrome-aws-lambda` itself abandoned or universally broken?
No universal conclusion follows from a missing-module error. Existing applications can work when their dependency tree and compatibility mapping are intact; the stack trace and deployed artifact determine the remedy.
Should I install full `puppeteer` instead of `puppeteer-core`?
Use the package’s documented pairing. Serverless Chromium packages are commonly used with `puppeteer-core` so the browser supplied by the serverless package is launched explicitly.
Can I fix this only by increasing Lambda memory?
Memory can help launch and extraction failures, but it cannot add an omitted npm package, attach a missing layer, or correct incompatible browser revisions.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

