The fix is diagnostic, not a single package list: confirm that Puppeteer’s browser download ran on the Elastic Beanstalk instance, compare the cache path and runtime user, point Puppeteer at a separately managed executable when appropriate, then check shared libraries and CPU architecture if the binary exists but will not launch.
The message means Chrome is absent from the location Puppeteer searched. A different failure—Chrome is present but exits immediately because Linux libraries are missing—requires a later step. Work through the checks below on the deployed instance, not on your development computer.
What the error actually means
When you install the puppeteer package, its documented installation flow downloads a compatible Chrome for Testing browser. Since Puppeteer 21.6.0, that flow also includes chrome-headless-shell. Puppeteer’s default browser cache has been $HOME/.cache/puppeteer since version 19.0.0. The project’s guide estimates downloads of about 282 MB for Linux (the exact size changes with releases).
Therefore, “Could not find Chrome” usually indicates one of these conditions:
#1 Best Overall
- The dependency install script was skipped, so no browser was downloaded.
- The browser was downloaded under a different user or
$HOMEthan the account running your app. - You installed Chrome somewhere else but did not configure Puppeteer to use that executable.
If the file is found and the error changes to a launch or shared-library failure, stop treating it as a missing-browser problem and continue to the runtime checks.
For reference, Puppeteer documents installation and browser management at its installation guide. An example report with the full “Could not find Chrome (ver. 127.0.6533.88)” wording is tracked in issue #13116.
1. Verify that the deployment downloaded a browser
Package managers and CI systems can disable lifecycle scripts. If Puppeteer’s install script was blocked, the package is present but its browser is not. Run the documented manual installer during your Elastic Beanstalk build or deployment:
npx puppeteer browsers install
Run it on the EC2 instance (or in the same deployment phase and filesystem used by the instance), and inspect its output and exit status. Installing Chrome on your laptop has no effect on the Beanstalk environment.
Check install-script policy
If your package manager uses an install-script allowlist, opt Puppeteer’s script back in according to that manager’s policy, or keep the explicit npx puppeteer browsers install command in the deployment. Make the command fail the deployment when it fails; silently continuing leaves the application to discover the problem at request time.
Confirm the files on the target host
After deployment, log into the instance using your normal operational method and inspect the cache directory named in the error. The precise path in the error is valuable evidence. Check that it exists, contains the expected Chrome-for-Testing revision, and is readable and executable by the application account.
Rank #2
2. Compare the cache path, $HOME, and user
Puppeteer’s default cache is derived from $HOME. Elastic Beanstalk platform hooks run as root, while your Node process may run as another account. AWS documents this execution model for Linux platform hooks. A hook can consequently download Chrome into /root/.cache/puppeteer while the application searches, for example, /home/webapp/.cache/puppeteer.
Print these values in the deployment step and in the running application’s diagnostic output (avoid logging secrets):
id
printf 'HOME=%sn' "$HOME"
printf 'PUPPETEER_CACHE_DIR=%sn' "${PUPPETEER_CACHE_DIR:-<unset>}"
ls -la "${PUPPETEER_CACHE_DIR:-$HOME/.cache/puppeteer}"
Use one deliberate configuration for both phases. You can set Puppeteer’s cache directory to a shared location that the app user can read, or install and run under the same account. Whichever approach you choose, verify ownership and permissions on the actual instance. A path mismatch is a hypothesis to test, not proof that every Beanstalk environment has it.
Keep deployment and runtime aligned
- Use the same
HOMEor explicit cache setting when downloading and launching. - Ensure the runtime account can traverse every parent directory and execute the browser files.
- Do not rely on a browser cached only inside a temporary build directory unless that directory is present in the final application instance.
3. Configure a separately managed Chrome explicitly
If your image, platform layer, or provisioning script installs Chrome outside Puppeteer’s cache, tell Puppeteer exactly which executable to use. Puppeteer supports executablePath; it also supports channel for a standard installation it recognizes. puppeteer-core never downloads Chrome, so it always needs a managed browser and an explicit path or channel.
const puppeteer = require('puppeteer');
const browser = await puppeteer.launch({
executablePath: process.env.PUPPETEER_EXECUTABLE_PATH,
});
Set PUPPETEER_EXECUTABLE_PATH to a path verified on the deployed host. Check it as the application user:
test -x "$PUPPETEER_EXECUTABLE_PATH" && "$PUPPETEER_EXECUTABLE_PATH" --version
Never copy a path from macOS or Windows, another AMI, another CPU architecture, or a different installation method. A path that exists but cannot execute is a separate launch problem.
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 problems4. If Chrome exists, inspect Linux libraries
Finding the binary does not prove that Amazon Linux can start it. Amazon Linux 2023 community reports describe Chrome for Testing failing because libatk-1.0.so.0 was unavailable. Reports also mention packages such as atk, pango, alsa-lib, libXcomposite, libXdamage, libXrandr, libxkbcommon, cups-libs, libdrm, and mesa-libgbm; another dated Beanstalk example adds font packages.
These are investigation leads, not a universal AL2023 recipe. Package names and availability vary by Amazon Linux release, repository configuration, architecture, and browser build. The AL2023 discussion is community material, not an AWS compatibility guarantee.
Identify the first missing dependency
Run the executable’s version command as the app user. If it reports a missing shared object, use your platform’s package manager to identify the package that provides that library, install only the dependencies required by the selected browser, and repeat the check. You can also inspect dynamic dependencies with the system’s ELF tools. Capture the exact error from the target instance before changing packages.
5. Check CPU architecture
Confirm the architecture of the Beanstalk instances before selecting a browser distribution:
The Tool Desk
Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →uname -m
The Puppeteer issue and AL2023 discussion include Chrome binaries for x86 and community reports of separate ARM Chromium setups, but they do not establish a current compatibility matrix for every Puppeteer release, Chrome build, AL2023 image, and instance type. Select a browser build that explicitly supports the architecture returned by your host, configure its verified executable path, and test it there. Do not assume an x86_64 installation works on ARM.
6. Put installation in the right Elastic Beanstalk phase
AWS provides .platform/hooks/prebuild, predeploy, and postdeploy for Linux environments. AWS defines postdeploy this way: “Files here run after the Elastic Beanstalk platform engine deploys the application and proxy server.” Hook files run in lexicographical filename order, execute as root, and a non-zero exit code aborts deployment. See Platform hooks.
Rank #4
Choose the phase based on what must already exist. Installing dependencies needed to build the application belongs before the build; installing or validating a browser after the application and proxy are present can belong in a postdeploy hook. Source any runtime environment values as AWS documents, and explicitly handle ownership when root performs the install.
AWS also documents Buildfile, Procfile, platform hooks, and .ebextensions as configuration mechanisms. The right mechanism depends on whether you need build-time commands, process startup, platform hooks, or CloudFormation-backed configuration; no single file is a universal Chrome solution. See Configuration files.
Recommended Free Tools
Choose a browser-management model
| Model | Advantages | Responsibilities |
|---|---|---|
| Puppeteer-managed download | Browser installation follows Puppeteer’s documented workflow and revision pairing. | Allow the install script or run npx puppeteer browsers install; preserve a shared cache and enough disk space. |
| System or separately managed browser | Fits controlled images and existing provisioning pipelines. | Maintain a compatible executable, configure executablePath or channel, and validate libraries and architecture. |
Both models still require a test on the deployed instance. The choice changes who owns browser updates and where the files live; it does not remove Linux dependency or architecture checks.
Common symptoms and fixes
| Symptom | Likely cause | Action |
|---|---|---|
| Error names a cache directory that is empty | Install script was skipped or manual install ran elsewhere | Run npx puppeteer browsers install in deployment and inspect its result. |
Browser appears under /root, app searches another home |
Hook user and runtime user differ | Align HOME/cache configuration or use a managed executable path with correct permissions. |
Executable exists but reports a missing .so |
Runtime library absent | Identify the package providing that library on the exact AL2023 image; do not blindly reuse a dated package list. |
| “Exec format error” or immediate exit on an ARM instance | Architecture mismatch | Install a browser build supporting the host architecture and retest. |
| Works locally, fails after deployment | Local browser, user, cache, or libraries differ | Repeat every check on the Beanstalk EC2 instance as the application account. |
Performance, reliability, and cost considerations
The Puppeteer guide’s approximate Linux download size is 282 MB, so account for deployment bandwidth, disk space, and cold-start time. A cache can avoid repeated downloads, but only when its location survives deployment and is readable by the runtime user. A system browser shifts download work into image or provisioning maintenance; that can make releases more predictable while making compatibility your responsibility.
Make browser validation observable: log the resolved executable path, browser version, architecture, and a sanitized cache location; fail deployment when installation or validation fails. Avoid logging cookies, authorization headers, or page contents. When upgrading Puppeteer, retest the browser revision and required libraries rather than assuming an older image remains compatible.
Or skip the browser setup
If your goal is simply to obtain a reliable website screenshot, ScreenshotNeo provides a website screenshot API and MCP server. One request returns PNG, JPEG, WebP, or PDF. It accepts cookie and consent banners before capture and removes more than 60 known consent platforms, newsletter popups, and chat widgets; each cleanup step can be disabled. Bot checks or CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed, and response headers identify the page verdict and billing status.
Quick wins for a faster PC:
Clear out junk files and repair common Windows errorsFree Scan →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Use the API documentation at screenshotneo.com/docs/. cURL:
Best Value
- Used Book in Good Condition
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}`);
ScreenshotNeo also offers an MCP server with take_screenshot, get_page_info, and capture_pdf for Claude, Cursor, and other MCP clients. Plans include 1,000 screenshots per month free with no card; paid plans start at $5 for 3,000. Create a free ScreenshotNeo account.
FAQ
Does installing puppeteer-core download Chrome?
No. Puppeteer says puppeteer-core does not download a browser; provide a managed executable path or recognized channel.
Is an AL2023 dependency list guaranteed to work?
No. Community package examples are tied to particular dates, images, repositories, and architectures. Verify missing libraries on your own instance.
Should I use .ebextensions or a platform hook?
Use the mechanism that matches the operation. AWS documents both, while platform hooks provide ordered deployment phases and run as root; choose deliberately and manage ownership.
Frequently Asked Questions
Does installing puppeteer-core download Chrome?
No. Puppeteer says puppeteer-core does not download a browser; provide a managed executable path or recognized channel.
Is an AL2023 dependency list guaranteed to work?
No. Community package examples are tied to particular dates, images, repositories, and architectures. Verify missing libraries on your own instance.
Should I use .ebextensions or a platform hook?
Use the mechanism that matches the operation. AWS documents both, while platform hooks provide ordered deployment phases and run as root; choose deliberately and manage ownership.
Free tools Windows power users keep installed
One-click scans. No signup required.
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.




