Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Chromium Binary for AWS Lambda and Google Cloud Functions

License

NotificationsYou must be signed in to change notification settings

unlayer/chrome-aws-lambda

 
 

Repository files navigation

@sparticuz/chrome-aws-lambdaTypeScriptChromiumDonate

Chromium Binary for AWS Lambda and Google Cloud Functions

Difference from alixaxel/chrome-aws-lambda

This fork was born out ofalixaxel/chrome-aws-lambda#264.The biggest difference, besides the chromium version, is the inclusion of some code fromhttps://github.com/alixaxel/lambdafs,as well as dropping that as a dependency. Due to some changes in WebGL, the files in bin/swiftshader.tar.br need tobe extracted to/tmp instead of/tmp/swiftshader. This necessitated changes in lambdafs.

Install

npm install @sparticuz/chrome-aws-lambda --save-prod

This will ship with appropriate binary for the latest stable release ofpuppeteer (usually updated within a few days).

You also need to install the corresponding version ofpuppeteer-core (orpuppeteer):

npm install puppeteer-core --save-prod

If you wish to install an older version of Chromium, take a look atVersioning.

Usage

This package works with all the currently supported AWS Lambda Node.js runtimes out of the box.

constchromium=require('@sparticuz/chrome-aws-lambda');exports.handler=async(event,context,callback)=>{letresult=null;letbrowser=null;try{browser=awaitchromium.puppeteer.launch({args:chromium.args,defaultViewport:chromium.defaultViewport,executablePath:awaitchromium.executablePath,headless:chromium.headless,ignoreHTTPSErrors:true,});letpage=awaitbrowser.newPage();awaitpage.goto(event.url||'https://example.com');result=awaitpage.title();}catch(error){returncallback(error);}finally{if(browser!==null){awaitbrowser.close();}}returncallback(null,result);};

Usage with Playwright

constchromium=require('@sparticuz/chrome-aws-lambda');constplaywright=require('playwright-core');(async()=>{constbrowser=awaitplaywright.chromium.launch({args:chromium.args,executablePath:awaitchromium.executablePath,headless:chromium.headless,});// ...awaitbrowser.close();})();

You should allocate at least 512 MB of RAM to your Lambda, however 1600 MB (or more) is recommended.

Running Locally

Please refer to theLocal Development Wiki page for instructions and troubleshooting.

API

Method / PropertyReturnsDescription
font(url){?Promise<string>}Provisions a custom font and returns its basename.
args{!Array<string>}Provides a list of recommended additionalChromium flags.
defaultViewport{!Object}Returns more sensible default viewport settings.
executablePath{?Promise<string>}Returns the path the Chromium binary was extracted to.
headless{!boolean}Returnstrue if we are running on AWS Lambda or GCF.
puppeteer{!Object}Overloadspuppeteer and returns the resolved package.

Fonts

The Amazon Linux 2 AWS Lambda runtime is no longer provisioned with any font faces.

Because of this, this package ships withOpen Sans, which supports the following scripts:

  • Latin
  • Greek
  • Cyrillic

To provision additional fonts, simply call thefont() method with an absolute path or URL:

awaitchromium.font('/var/task/fonts/NotoColorEmoji.ttf');// orawaitchromium.font('https://raw.githack.com/googlei18n/noto-emoji/master/fonts/NotoColorEmoji.ttf');

Noto Color Emoji (or similar) is needed if you want torender emojis.

For URLs, it's recommended that you use a CDN, likeraw.githack.com orgitcdn.xyz.

This method should be invokedbefore launching Chromium.

On non-serverless environments, thefont() method is a no-op to avoid polluting the user space.


Alternatively, it's also possible to provision fonts via AWS Lambda Layers.

Simply create a directory named.fonts and place any font faces you want there:

.fonts├── NotoColorEmoji.ttf└── Roboto.ttf

Afterwards, you just need to ZIP the directory and upload it as a AWS Lambda Layer:

zip -9 --filesync --move --recurse-paths .fonts.zip .fonts/

Overloading

Since version8.0.0, it's possible tooverload puppeteer with the following convenient API:

interfaceBrowser{defaultPage(...hooks:((page:Page)=>Promise<Page>)[])newPage(...hooks:((page:Page)=>Promise<Page>)[])}interfaceBrowserContext{defaultPage(...hooks:((page:Page)=>Promise<Page>)[])newPage(...hooks:((page:Page)=>Promise<Page>)[])}interfacePage{block(patterns:string[])clear(selector:string)clickAndWaitForNavigation(selector:string,options?:WaitForOptions)clickAndWaitForRequest(selector:string,predicate:string|RegExp,options?:WaitTimeoutOptions)clickAndWaitForRequest(selector:string,predicate:((request:HTTPRequest)=>boolean|Promise<boolean>),options?:WaitTimeoutOptions)clickAndWaitForResponse(selector:string,predicate:string|RegExp,options?:WaitTimeoutOptions)clickAndWaitForResponse(selector:string,predicate:((request:HTTPResponse)=>boolean|Promise<boolean>),options?:WaitTimeoutOptions)count(selector:string)exists(selector:string)fillFormByLabel(selector:string,data:Record<string,boolean|string|string[]>)fillFormByName(selector:string,data:Record<string,boolean|string|string[]>)fillFormBySelector(selector:string,data:Record<string,boolean|string|string[]>)fillFormByXPath(selector:string,data:Record<string,boolean|string|string[]>)number(selector:string,decimal?:string,property?:string)selectByLabel(selector:string, ...values:string[])string(selector:string,property?:string)waitForInflightRequests(requests?:number,alpha:number,omega:number,options?:WaitTimeoutOptions)waitForText(predicate:string,options?:WaitTimeoutOptions)waitUntilVisible(selector:string,options?:WaitTimeoutOptions)waitWhileVisible(selector:string,options?:WaitTimeoutOptions)withTracing(options:TracingOptions,callback:(page:Page)=>Promise<any>)}interfaceFrame{clear(selector:string)clickAndWaitForNavigation(selector:string,options?:WaitForOptions)clickAndWaitForRequest(selector:string,predicate:string|RegExp,options?:WaitTimeoutOptions)clickAndWaitForRequest(selector:string,predicate:((request:HTTPRequest)=>boolean|Promise<boolean>),options?:WaitTimeoutOptions)clickAndWaitForResponse(selector:string,predicate:string|RegExp,options?:WaitTimeoutOptions)clickAndWaitForResponse(selector:string,predicate:((request:HTTPResponse)=>boolean|Promise<boolean>),options?:WaitTimeoutOptions)count(selector:string)exists(selector:string)fillFormByLabel(selector:string,data:Record<string,boolean|string|string[]>)fillFormByName(selector:string,data:Record<string,boolean|string|string[]>)fillFormBySelector(selector:string,data:Record<string,boolean|string|string[]>)fillFormByXPath(selector:string,data:Record<string,boolean|string|string[]>)number(selector:string,decimal?:string,property?:string)selectByLabel(selector:string, ...values:string[])string(selector:string,property?:string)waitForText(predicate:string,options?:WaitTimeoutOptions)waitUntilVisible(selector:string,options?:WaitTimeoutOptions)waitWhileVisible(selector:string,options?:WaitTimeoutOptions)}interfaceElementHandle{clear()clickAndWaitForNavigation(options?:WaitForOptions)clickAndWaitForRequest(predicate:string|RegExp,options?:WaitTimeoutOptions)clickAndWaitForRequest(predicate:((request:HTTPRequest)=>boolean|Promise<boolean>),options?:WaitTimeoutOptions)clickAndWaitForResponse(predicate:string|RegExp,options?:WaitTimeoutOptions)clickAndWaitForResponse(predicate:((request:HTTPResponse)=>boolean|Promise<boolean>),options?:WaitTimeoutOptions)fillFormByLabel(data:Record<string,boolean|string|string[]>)fillFormByName(data:Record<string,boolean|string|string[]>)fillFormBySelector(data:Record<string,boolean|string|string[]>)fillFormByXPath(data:Record<string,boolean|string|string[]>)getInnerHTML()getInnerText()number(decimal?:string,property?:string)selectByLabel(...values:string[])string(property?:string)}

To enable this behavior, simply call thepuppeteer property exposed by this package.

Refer to theTypeScript typings for general documentation.

Page Hooks

When overloaded, you can specify a list of hooks to automatically apply to pages.

For instance, to remove theHeadless substring from the user agent:

asyncfunctionreplaceUserAgent(page:Page):Promise<Page>{letvalue=awaitpage.browser().userAgent();if(value.includes('Headless')===true){awaitpage.setUserAgent(value.replace('Headless',''));}returnpage;}

And then simply pass that page hook todefaultPage() ornewPage():

letpage=awaitbrowser.defaultPage(replaceUserAgent);

Additional bundled page hooks can be found on/build/hooks.

Versioning

This package is versioned based on the underlyingpuppeteer minor version:

puppeteer Versionchrome-aws-lambda VersionChromium Revision
14.4.*npm i @sparticuz/chrome-aws-lambda@~14.4.11002410 (103.0.5058.0)
14.3.*npm i @sparticuz/chrome-aws-lambda@~14.3.01002410 (103.0.5058.0)
14.2.*npm i @sparticuz/chrome-aws-lambda@~14.2.01002410 (103.0.5058.0)
14.1.*npm i @sparticuz/chrome-aws-lambda@~14.1.1991974 (102.0.5002.0)
10.1.*npm i chrome-aws-lambda@~10.1.0884014 (92.0.4512.0)
10.0.*npm i chrome-aws-lambda@~10.0.0884014 (92.0.4512.0)
9.1.*npm i chrome-aws-lambda@~9.1.0869685 (91.0.4469.0)
9.0.*npm i chrome-aws-lambda@~9.0.0869685 (91.0.4469.0)
8.0.*npm i chrome-aws-lambda@~8.0.2856583 (90.0.4427.0)
7.0.*npm i chrome-aws-lambda@~7.0.0848005 (90.0.4403.0)
6.0.*npm i chrome-aws-lambda@~6.0.0843427 (89.0.4389.0)
5.5.*npm i chrome-aws-lambda@~5.5.0818858 (88.0.4298.0)
5.4.*npm i chrome-aws-lambda@~5.4.0809590 (87.0.4272.0)
5.3.*npm i chrome-aws-lambda@~5.3.1800071 (86.0.4240.0)
5.2.*npm i chrome-aws-lambda@~5.2.1782078 (85.0.4182.0)
5.1.*npm i chrome-aws-lambda@~5.1.0768783 (84.0.4147.0)
5.0.*npm i chrome-aws-lambda@~5.0.0756035 (83.0.4103.0)
3.1.*npm i chrome-aws-lambda@~3.1.1756035 (83.0.4103.0)
3.0.*npm i chrome-aws-lambda@~3.0.4737027 (81.0.4044.0)
2.1.*npm i chrome-aws-lambda@~2.1.1722234 (80.0.3987.0)
2.0.*npm i chrome-aws-lambda@~2.0.2705776 (79.0.3945.0)
1.20.*npm i chrome-aws-lambda@~1.20.4686378 (78.0.3882.0)
1.19.*npm i chrome-aws-lambda@~1.19.0674921 (77.0.3844.0)
1.18.*npm i chrome-aws-lambda@~1.18.1672088 (77.0.3835.0)
1.18.*npm i chrome-aws-lambda@~1.18.0669486 (77.0.3827.0)
1.17.*npm i chrome-aws-lambda@~1.17.1662092 (76.0.3803.0)
1.16.*npm i chrome-aws-lambda@~1.16.1656675 (76.0.3786.0)
1.15.*npm i chrome-aws-lambda@~1.15.1650583 (75.0.3765.0)
1.14.*npm i chrome-aws-lambda@~1.14.0641577 (75.0.3738.0)
1.13.*npm i chrome-aws-lambda@~1.13.0637110 (74.0.3723.0)
1.12.*npm i chrome-aws-lambda@~1.12.2624492 (73.0.3679.0)
1.11.*npm i chrome-aws-lambda@~1.11.2609904 (72.0.3618.0)
1.10.*npm i chrome-aws-lambda@~1.10.1604907 (72.0.3582.0)
1.9.*npm i chrome-aws-lambda@~1.9.1594312 (71.0.3563.0)
1.8.*npm i chrome-aws-lambda@~1.8.0588429 (71.0.3542.0)
1.7.*npm i chrome-aws-lambda@~1.7.0579032 (70.0.3508.0)
1.6.*npm i chrome-aws-lambda@~1.6.3575458 (69.0.3494.0)
1.5.*npm i chrome-aws-lambda@~1.5.0564778 (69.0.3452.0)
1.4.*npm i chrome-aws-lambda@~1.4.0555668 (68.0.3419.0)
1.3.*npm i chrome-aws-lambda@~1.3.0549031 (67.0.3391.0)
1.2.*npm i chrome-aws-lambda@~1.2.0543305 (67.0.3372.0)
1.1.*npm i chrome-aws-lambda@~1.1.0536395 (66.0.3347.0)
1.0.*npm i chrome-aws-lambda@~1.0.0526987 (65.0.3312.0)
0.13.*npm i chrome-aws-lambda@~0.13.0515411 (64.0.3264.0)

Patch versions are reserved for bug fixes inchrome-aws-lambda and general maintenance.

Compiling

To compile your own version of Chromium check theAnsible playbook instructions.

AWS Lambda Layer

Lambda Layers is a new convenient way to manage common dependencies between different Lambda Functions.

The following set of (Linux) commands will create a layer of this package alongsidepuppeteer-core:

git clone --depth=1 https://github.com/alixaxel/chrome-aws-lambda.git&& \cd chrome-aws-lambda&& \make chrome_aws_lambda.zip

The above will create achrome-aws-lambda.zip file, which can be uploaded to your Layers console.

Alternatively, you can also download the layer artifact from one of ourCI workflow runs.

Google Cloud Functions

Since version1.11.2, it's also possible to use this package on Google/Firebase Cloud Functions.

According to our benchmarks, it's 40% to 50% faster than using the off-the-shelfpuppeteer bundle.

Compression

The Chromium binary is compressed using the Brotli algorithm.

This allows us to get the best compression ratio and faster decompression times.

FileAlgorithmLevelBytesMiB%Inflation
chromium--136964856130.62--
chromium.gzGzip15166208749.2762.28%1.035s
chromium.gzGzip25043835248.1063.17%1.016s
chromium.gzGzip34942845947.1463.91%0.968s
chromium.gzGzip44787397845.6665.05%0.950s
chromium.gzGzip54692942244.7665.74%0.938s
chromium.gzGzip64652252944.3766.03%0.919s
chromium.gzGzip74640640644.2666.12%0.917s
chromium.gzGzip84629791744.1566.20%0.916s
chromium.gzGzip94627097244.1366.22%0.968s
chromium.gzZopfli104508916143.0067.08%0.919s
chromium.gzZopfli204508586843.0067.08%0.919s
chromium.gzZopfli304508500343.0067.08%0.925s
chromium.gzZopfli404508432843.0067.08%0.921s
chromium.gzZopfli504508409843.0067.08%0.935s
chromium.brBrotli05540121152.8359.55%0.778s
chromium.brBrotli15442952351.9160.26%0.757s
chromium.brBrotli24643612644.2866.10%0.659s
chromium.brBrotli34612203343.9966.33%0.616s
chromium.brBrotli44505023942.9667.11%0.692s
chromium.brBrotli54081351038.9270.20%0.598s
chromium.brBrotli64011695138.2670.71%0.601s
chromium.brBrotli73930228137.4871.30%0.615s
chromium.brBrotli83903830337.2371.50%0.668s
chromium.brBrotli93885399437.0571.63%0.673s
chromium.brBrotli103609008734.4273.65%0.765s
chromium.brBrotli113482040833.2174.58%0.712s

License

MIT

About

Chromium Binary for AWS Lambda and Google Cloud Functions

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • TypeScript94.5%
  • JavaScript3.2%
  • Makefile1.9%
  • Python0.4%

[8]ページ先頭

©2009-2025 Movatter.jp