SlideShare a Scribd company logo
Piotr Wasiak XI 2022
AWS Lambda
How to upload and load gems fast
Agenda
AWS loading code and gems
• Short intro to AWS Lambda
• How to load gems
• Problem with native extensions
• What's the load time?
• Deploying layers with no downtime?
About.me/Piotr.Wasiak
Ruby (and Rails) developer
• I work currently in SpaceOS.io prop-tech startup
• lambda is used in production to sync sequentially data with external systems
AWS Lambda
What is the fuss about
• Reduced complexity. There’s a
fi
xed operating system,
fi
xed software
language, and a
fi
xed version.
• No infrastructure to manage. AWS owns and manages the infrastructure.
You only pay for the time your code runs.
• Implicit scaling. AWS will handle scaling, no matter how much you use your
functions.
AWS Lambda
function sca
ff
old
• We can trigger lambda function by:
• Amazon Simple Queue Service
• HTTP Request
• Other Amazon events
What about loading libraries
3 ways
• pushing gem sources with code (naive way)
• pushing gems as a layer (pack the sources as zip)
• bundle install --deployment
• zip -FSr gem_layer.zip ./ruby/
• aws lambda publish-layer-version ....
• dockerize lambda image (but hmm it should be without additional setup)
Can we use bundler for loading gems?
bundler is by default shiped with ruby
• yes, we can use Gem
fi
le for loading
• on lambda function start:
require 'bundler'
Bundler.require(:default)
• bundler will raise on start if some gem version is missing or wrong
• but you can always require 'gem_name' wherever do you want it
First problem with layers
What if we require gems
with native extensions?
dependency from Savon
• inside Nokogiri there is also racc
• so there are external libs per
architecture/distributions
Nokogiri
Solution
• use aws-lambda docker to generate libs
• bundle con
fi
g set --local clean 'true'
• zip & push it as layer
Nokogiri depedency
Second problem with ruby
What is really the load time
of lambda function
Before adding native extentions
Loading time ~ 1050 ms
After adding native extentions
Loading time ~ 1550 ms
Our Gemfile right now
> bundle install --without test
(...)
Using activesupport 7.0.4
Using nokogiri 1.13.9 (arm64-darwin)
Using aws-sdk-core 3.166.0
Using faraday 2.6.0
Using graphql 2.0.15
Using savon 2.13.1
(...)
Using sentry-lambda 0.2.1
Using warning 1.3.0
Using zeitwerk 2.6.4
Bundle complete! 14 Gem
fi
le dependencies, 38 gems now installed.
Gems in the group 'test' were not installed.
Autoloader to load only required files
Zeitwerk Solution
• Convention to store required classes in proper folders
• load on usage and don't load twice (even if it has di
ff
erent require path)
After adding Zeitwerk (code autoloader)
Loading time ~ 1350 ms
Load gems only if needed
Solution
• skip requiring Nokogiri and GraphQL in Gem
fi
le (on boot)
• manual require in service
fi
les
With autoloader skipping Savon, GraphQL
Loading time ~ 820 ms Faster than 6 month ago :O
Third problem with layers
How to ensure no downtime
with releasing new libs and code
How to release new layer with code
Solutions
1. Combine together previous layer with new one and ship combined layer
fi
rst
• can be incompatible with API changes (test it
fi
rst)
• no downtime at all
• have to use bundler (require does not know which gem version should be loaded)
2. Push new layer
and switch it just before pushing the new function code
• there is no way to push the code and switch to new layer in one transaction
• very small downtime (already started functions will be
fi
ne during that change)
3. Use lambda function versions and just switch event trigger to new code version with layer
Take aways
• Lambda loading time
for ruby is more 0,5 sec
• Loading gems with layers
provides some challenges
• If you have complex app
then go with lambda docker
Sources
• https://stackify.com/aws-lambda-with-ruby-getting-started-guide
• https://docs.aws.amazon.com/lambda/latest/dg/lambda-ruby.html
• github.com aws-lambda developer-guide/sample-ruby
• https://github.com/fxn/zeitwerk#awards
• https://bundler.io
Thanks for listening

More Related Content

Similar to AWS Lambda How to upload and load gems fast

Matt Chung (Independent) - Serverless application with AWS Lambda
Matt Chung (Independent) - Serverless application with AWS Lambda Matt Chung (Independent) - Serverless application with AWS Lambda
Matt Chung (Independent) - Serverless application with AWS Lambda
Outlyer
 
Polyglot Plugin Programming
Polyglot Plugin ProgrammingPolyglot Plugin Programming
Polyglot Plugin ProgrammingAtlassian
 
aws lambda & api gateway
aws lambda & api gatewayaws lambda & api gateway
aws lambda & api gateway
fumihiko hata
 
Java to scala
Java to scalaJava to scala
Java to scala
GiltTech
 
Symfony aws
Symfony awsSymfony aws
Dockerize the World
Dockerize the WorldDockerize the World
Dockerize the World
damovsky
 
Polyglot Grails
Polyglot GrailsPolyglot Grails
Polyglot Grails
Marcin Gryszko
 
Fast Deployments to Multiple Golang Lambda Functions
Fast Deployments to Multiple Golang Lambda FunctionsFast Deployments to Multiple Golang Lambda Functions
Fast Deployments to Multiple Golang Lambda Functions
Kp Krishnamoorthy
 
Exploring Ruby on Rails and PostgreSQL
Exploring Ruby on Rails and PostgreSQLExploring Ruby on Rails and PostgreSQL
Exploring Ruby on Rails and PostgreSQL
Barry Jones
 
Hosting a Rails App
Hosting a Rails AppHosting a Rails App
Hosting a Rails App
Josh Schramm
 
Serverless design considerations for Cloud Native workloads
Serverless design considerations for Cloud Native workloadsServerless design considerations for Cloud Native workloads
Serverless design considerations for Cloud Native workloads
Tensult
 
Lightweight Virtualization Docker in Practice
Lightweight Virtualization Docker in PracticeLightweight Virtualization Docker in Practice
Lightweight Virtualization Docker in PracticeDocker, Inc.
 
RubyStack: the easiest way to deploy Ruby on Rails
RubyStack: the easiest way to deploy Ruby on RailsRubyStack: the easiest way to deploy Ruby on Rails
RubyStack: the easiest way to deploy Ruby on Railselliando dias
 
Everything-as-code. A polyglot adventure. #DevoxxPL
Everything-as-code. A polyglot adventure. #DevoxxPLEverything-as-code. A polyglot adventure. #DevoxxPL
Everything-as-code. A polyglot adventure. #DevoxxPL
Mario-Leander Reimer
 
Everything-as-code - A polyglot adventure
Everything-as-code - A polyglot adventureEverything-as-code - A polyglot adventure
Everything-as-code - A polyglot adventure
QAware GmbH
 
Scala Native: Ahead of Time
Scala Native: Ahead of TimeScala Native: Ahead of Time
Scala Native: Ahead of Time
Nadav Wiener
 
MariaDB on Docker
MariaDB on DockerMariaDB on Docker
MariaDB on Docker
MariaDB plc
 
Java script nirvana in netbeans [con5679]
Java script nirvana in netbeans [con5679]Java script nirvana in netbeans [con5679]
Java script nirvana in netbeans [con5679]
Ryan Cuprak
 
Docker for the Rubyist
Docker for the RubyistDocker for the Rubyist
Docker for the Rubyist
Brian DeHamer
 
Cloud Foundry 百日行 振り返り
Cloud Foundry 百日行 振り返りCloud Foundry 百日行 振り返り
Cloud Foundry 百日行 振り返り
nota-ja
 

Similar to AWS Lambda How to upload and load gems fast (20)

Matt Chung (Independent) - Serverless application with AWS Lambda
Matt Chung (Independent) - Serverless application with AWS Lambda Matt Chung (Independent) - Serverless application with AWS Lambda
Matt Chung (Independent) - Serverless application with AWS Lambda
 
Polyglot Plugin Programming
Polyglot Plugin ProgrammingPolyglot Plugin Programming
Polyglot Plugin Programming
 
aws lambda & api gateway
aws lambda & api gatewayaws lambda & api gateway
aws lambda & api gateway
 
Java to scala
Java to scalaJava to scala
Java to scala
 
Symfony aws
Symfony awsSymfony aws
Symfony aws
 
Dockerize the World
Dockerize the WorldDockerize the World
Dockerize the World
 
Polyglot Grails
Polyglot GrailsPolyglot Grails
Polyglot Grails
 
Fast Deployments to Multiple Golang Lambda Functions
Fast Deployments to Multiple Golang Lambda FunctionsFast Deployments to Multiple Golang Lambda Functions
Fast Deployments to Multiple Golang Lambda Functions
 
Exploring Ruby on Rails and PostgreSQL
Exploring Ruby on Rails and PostgreSQLExploring Ruby on Rails and PostgreSQL
Exploring Ruby on Rails and PostgreSQL
 
Hosting a Rails App
Hosting a Rails AppHosting a Rails App
Hosting a Rails App
 
Serverless design considerations for Cloud Native workloads
Serverless design considerations for Cloud Native workloadsServerless design considerations for Cloud Native workloads
Serverless design considerations for Cloud Native workloads
 
Lightweight Virtualization Docker in Practice
Lightweight Virtualization Docker in PracticeLightweight Virtualization Docker in Practice
Lightweight Virtualization Docker in Practice
 
RubyStack: the easiest way to deploy Ruby on Rails
RubyStack: the easiest way to deploy Ruby on RailsRubyStack: the easiest way to deploy Ruby on Rails
RubyStack: the easiest way to deploy Ruby on Rails
 
Everything-as-code. A polyglot adventure. #DevoxxPL
Everything-as-code. A polyglot adventure. #DevoxxPLEverything-as-code. A polyglot adventure. #DevoxxPL
Everything-as-code. A polyglot adventure. #DevoxxPL
 
Everything-as-code - A polyglot adventure
Everything-as-code - A polyglot adventureEverything-as-code - A polyglot adventure
Everything-as-code - A polyglot adventure
 
Scala Native: Ahead of Time
Scala Native: Ahead of TimeScala Native: Ahead of Time
Scala Native: Ahead of Time
 
MariaDB on Docker
MariaDB on DockerMariaDB on Docker
MariaDB on Docker
 
Java script nirvana in netbeans [con5679]
Java script nirvana in netbeans [con5679]Java script nirvana in netbeans [con5679]
Java script nirvana in netbeans [con5679]
 
Docker for the Rubyist
Docker for the RubyistDocker for the Rubyist
Docker for the Rubyist
 
Cloud Foundry 百日行 振り返り
Cloud Foundry 百日行 振り返りCloud Foundry 百日行 振り返り
Cloud Foundry 百日行 振り返り
 

Recently uploaded

NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...
NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...
NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...
Amil Baba Dawood bangali
 
NUMERICAL SIMULATIONS OF HEAT AND MASS TRANSFER IN CONDENSING HEAT EXCHANGERS...
NUMERICAL SIMULATIONS OF HEAT AND MASS TRANSFER IN CONDENSING HEAT EXCHANGERS...NUMERICAL SIMULATIONS OF HEAT AND MASS TRANSFER IN CONDENSING HEAT EXCHANGERS...
NUMERICAL SIMULATIONS OF HEAT AND MASS TRANSFER IN CONDENSING HEAT EXCHANGERS...
ssuser7dcef0
 
Investor-Presentation-Q1FY2024 investor presentation document.pptx
Investor-Presentation-Q1FY2024 investor presentation document.pptxInvestor-Presentation-Q1FY2024 investor presentation document.pptx
Investor-Presentation-Q1FY2024 investor presentation document.pptx
AmarGB2
 
road safety engineering r s e unit 3.pdf
road safety engineering  r s e unit 3.pdfroad safety engineering  r s e unit 3.pdf
road safety engineering r s e unit 3.pdf
VENKATESHvenky89705
 
Building Electrical System Design & Installation
Building Electrical System Design & InstallationBuilding Electrical System Design & Installation
Building Electrical System Design & Installation
symbo111
 
Fundamentals of Electric Drives and its applications.pptx
Fundamentals of Electric Drives and its applications.pptxFundamentals of Electric Drives and its applications.pptx
Fundamentals of Electric Drives and its applications.pptx
manasideore6
 
Nuclear Power Economics and Structuring 2024
Nuclear Power Economics and Structuring 2024Nuclear Power Economics and Structuring 2024
Nuclear Power Economics and Structuring 2024
Massimo Talia
 
Final project report on grocery store management system..pdf
Final project report on grocery store management system..pdfFinal project report on grocery store management system..pdf
Final project report on grocery store management system..pdf
Kamal Acharya
 
Tutorial for 16S rRNA Gene Analysis with QIIME2.pdf
Tutorial for 16S rRNA Gene Analysis with QIIME2.pdfTutorial for 16S rRNA Gene Analysis with QIIME2.pdf
Tutorial for 16S rRNA Gene Analysis with QIIME2.pdf
aqil azizi
 
Forklift Classes Overview by Intella Parts
Forklift Classes Overview by Intella PartsForklift Classes Overview by Intella Parts
Forklift Classes Overview by Intella Parts
Intella Parts
 
AP LAB PPT.pdf ap lab ppt no title specific
AP LAB PPT.pdf ap lab ppt no title specificAP LAB PPT.pdf ap lab ppt no title specific
AP LAB PPT.pdf ap lab ppt no title specific
BrazilAccount1
 
Gen AI Study Jams _ For the GDSC Leads in India.pdf
Gen AI Study Jams _ For the GDSC Leads in India.pdfGen AI Study Jams _ For the GDSC Leads in India.pdf
Gen AI Study Jams _ For the GDSC Leads in India.pdf
gdsczhcet
 
DESIGN A COTTON SEED SEPARATION MACHINE.docx
DESIGN A COTTON SEED SEPARATION MACHINE.docxDESIGN A COTTON SEED SEPARATION MACHINE.docx
DESIGN A COTTON SEED SEPARATION MACHINE.docx
FluxPrime1
 
English lab ppt no titlespecENG PPTt.pdf
English lab ppt no titlespecENG PPTt.pdfEnglish lab ppt no titlespecENG PPTt.pdf
English lab ppt no titlespecENG PPTt.pdf
BrazilAccount1
 
一比一原版(IIT毕业证)伊利诺伊理工大学毕业证成绩单专业办理
一比一原版(IIT毕业证)伊利诺伊理工大学毕业证成绩单专业办理一比一原版(IIT毕业证)伊利诺伊理工大学毕业证成绩单专业办理
一比一原版(IIT毕业证)伊利诺伊理工大学毕业证成绩单专业办理
zwunae
 
Governing Equations for Fundamental Aerodynamics_Anderson2010.pdf
Governing Equations for Fundamental Aerodynamics_Anderson2010.pdfGoverning Equations for Fundamental Aerodynamics_Anderson2010.pdf
Governing Equations for Fundamental Aerodynamics_Anderson2010.pdf
WENKENLI1
 
HYDROPOWER - Hydroelectric power generation
HYDROPOWER - Hydroelectric power generationHYDROPOWER - Hydroelectric power generation
HYDROPOWER - Hydroelectric power generation
Robbie Edward Sayers
 
CME397 Surface Engineering- Professional Elective
CME397 Surface Engineering- Professional ElectiveCME397 Surface Engineering- Professional Elective
CME397 Surface Engineering- Professional Elective
karthi keyan
 
Standard Reomte Control Interface - Neometrix
Standard Reomte Control Interface - NeometrixStandard Reomte Control Interface - Neometrix
Standard Reomte Control Interface - Neometrix
Neometrix_Engineering_Pvt_Ltd
 
14 Template Contractual Notice - EOT Application
14 Template Contractual Notice - EOT Application14 Template Contractual Notice - EOT Application
14 Template Contractual Notice - EOT Application
SyedAbiiAzazi1
 

Recently uploaded (20)

NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...
NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...
NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...
 
NUMERICAL SIMULATIONS OF HEAT AND MASS TRANSFER IN CONDENSING HEAT EXCHANGERS...
NUMERICAL SIMULATIONS OF HEAT AND MASS TRANSFER IN CONDENSING HEAT EXCHANGERS...NUMERICAL SIMULATIONS OF HEAT AND MASS TRANSFER IN CONDENSING HEAT EXCHANGERS...
NUMERICAL SIMULATIONS OF HEAT AND MASS TRANSFER IN CONDENSING HEAT EXCHANGERS...
 
Investor-Presentation-Q1FY2024 investor presentation document.pptx
Investor-Presentation-Q1FY2024 investor presentation document.pptxInvestor-Presentation-Q1FY2024 investor presentation document.pptx
Investor-Presentation-Q1FY2024 investor presentation document.pptx
 
road safety engineering r s e unit 3.pdf
road safety engineering  r s e unit 3.pdfroad safety engineering  r s e unit 3.pdf
road safety engineering r s e unit 3.pdf
 
Building Electrical System Design & Installation
Building Electrical System Design & InstallationBuilding Electrical System Design & Installation
Building Electrical System Design & Installation
 
Fundamentals of Electric Drives and its applications.pptx
Fundamentals of Electric Drives and its applications.pptxFundamentals of Electric Drives and its applications.pptx
Fundamentals of Electric Drives and its applications.pptx
 
Nuclear Power Economics and Structuring 2024
Nuclear Power Economics and Structuring 2024Nuclear Power Economics and Structuring 2024
Nuclear Power Economics and Structuring 2024
 
Final project report on grocery store management system..pdf
Final project report on grocery store management system..pdfFinal project report on grocery store management system..pdf
Final project report on grocery store management system..pdf
 
Tutorial for 16S rRNA Gene Analysis with QIIME2.pdf
Tutorial for 16S rRNA Gene Analysis with QIIME2.pdfTutorial for 16S rRNA Gene Analysis with QIIME2.pdf
Tutorial for 16S rRNA Gene Analysis with QIIME2.pdf
 
Forklift Classes Overview by Intella Parts
Forklift Classes Overview by Intella PartsForklift Classes Overview by Intella Parts
Forklift Classes Overview by Intella Parts
 
AP LAB PPT.pdf ap lab ppt no title specific
AP LAB PPT.pdf ap lab ppt no title specificAP LAB PPT.pdf ap lab ppt no title specific
AP LAB PPT.pdf ap lab ppt no title specific
 
Gen AI Study Jams _ For the GDSC Leads in India.pdf
Gen AI Study Jams _ For the GDSC Leads in India.pdfGen AI Study Jams _ For the GDSC Leads in India.pdf
Gen AI Study Jams _ For the GDSC Leads in India.pdf
 
DESIGN A COTTON SEED SEPARATION MACHINE.docx
DESIGN A COTTON SEED SEPARATION MACHINE.docxDESIGN A COTTON SEED SEPARATION MACHINE.docx
DESIGN A COTTON SEED SEPARATION MACHINE.docx
 
English lab ppt no titlespecENG PPTt.pdf
English lab ppt no titlespecENG PPTt.pdfEnglish lab ppt no titlespecENG PPTt.pdf
English lab ppt no titlespecENG PPTt.pdf
 
一比一原版(IIT毕业证)伊利诺伊理工大学毕业证成绩单专业办理
一比一原版(IIT毕业证)伊利诺伊理工大学毕业证成绩单专业办理一比一原版(IIT毕业证)伊利诺伊理工大学毕业证成绩单专业办理
一比一原版(IIT毕业证)伊利诺伊理工大学毕业证成绩单专业办理
 
Governing Equations for Fundamental Aerodynamics_Anderson2010.pdf
Governing Equations for Fundamental Aerodynamics_Anderson2010.pdfGoverning Equations for Fundamental Aerodynamics_Anderson2010.pdf
Governing Equations for Fundamental Aerodynamics_Anderson2010.pdf
 
HYDROPOWER - Hydroelectric power generation
HYDROPOWER - Hydroelectric power generationHYDROPOWER - Hydroelectric power generation
HYDROPOWER - Hydroelectric power generation
 
CME397 Surface Engineering- Professional Elective
CME397 Surface Engineering- Professional ElectiveCME397 Surface Engineering- Professional Elective
CME397 Surface Engineering- Professional Elective
 
Standard Reomte Control Interface - Neometrix
Standard Reomte Control Interface - NeometrixStandard Reomte Control Interface - Neometrix
Standard Reomte Control Interface - Neometrix
 
14 Template Contractual Notice - EOT Application
14 Template Contractual Notice - EOT Application14 Template Contractual Notice - EOT Application
14 Template Contractual Notice - EOT Application
 

AWS Lambda How to upload and load gems fast

  • 1. Piotr Wasiak XI 2022 AWS Lambda How to upload and load gems fast
  • 2. Agenda AWS loading code and gems • Short intro to AWS Lambda • How to load gems • Problem with native extensions • What's the load time? • Deploying layers with no downtime?
  • 3. About.me/Piotr.Wasiak Ruby (and Rails) developer • I work currently in SpaceOS.io prop-tech startup • lambda is used in production to sync sequentially data with external systems
  • 4. AWS Lambda What is the fuss about • Reduced complexity. There’s a fi xed operating system, fi xed software language, and a fi xed version. • No infrastructure to manage. AWS owns and manages the infrastructure. You only pay for the time your code runs. • Implicit scaling. AWS will handle scaling, no matter how much you use your functions.
  • 5. AWS Lambda function sca ff old • We can trigger lambda function by: • Amazon Simple Queue Service • HTTP Request • Other Amazon events
  • 6. What about loading libraries 3 ways • pushing gem sources with code (naive way) • pushing gems as a layer (pack the sources as zip) • bundle install --deployment • zip -FSr gem_layer.zip ./ruby/ • aws lambda publish-layer-version .... • dockerize lambda image (but hmm it should be without additional setup)
  • 7. Can we use bundler for loading gems? bundler is by default shiped with ruby • yes, we can use Gem fi le for loading • on lambda function start: require 'bundler' Bundler.require(:default) • bundler will raise on start if some gem version is missing or wrong • but you can always require 'gem_name' wherever do you want it
  • 8.
  • 9. First problem with layers What if we require gems with native extensions?
  • 10. dependency from Savon • inside Nokogiri there is also racc • so there are external libs per architecture/distributions Nokogiri
  • 11. Solution • use aws-lambda docker to generate libs • bundle con fi g set --local clean 'true' • zip & push it as layer Nokogiri depedency
  • 12. Second problem with ruby What is really the load time of lambda function
  • 13. Before adding native extentions Loading time ~ 1050 ms
  • 14. After adding native extentions Loading time ~ 1550 ms
  • 15. Our Gemfile right now > bundle install --without test (...) Using activesupport 7.0.4 Using nokogiri 1.13.9 (arm64-darwin) Using aws-sdk-core 3.166.0 Using faraday 2.6.0 Using graphql 2.0.15 Using savon 2.13.1 (...) Using sentry-lambda 0.2.1 Using warning 1.3.0 Using zeitwerk 2.6.4 Bundle complete! 14 Gem fi le dependencies, 38 gems now installed. Gems in the group 'test' were not installed.
  • 16. Autoloader to load only required files Zeitwerk Solution • Convention to store required classes in proper folders • load on usage and don't load twice (even if it has di ff erent require path)
  • 17. After adding Zeitwerk (code autoloader) Loading time ~ 1350 ms
  • 18. Load gems only if needed Solution • skip requiring Nokogiri and GraphQL in Gem fi le (on boot) • manual require in service fi les
  • 19. With autoloader skipping Savon, GraphQL Loading time ~ 820 ms Faster than 6 month ago :O
  • 20. Third problem with layers How to ensure no downtime with releasing new libs and code
  • 21. How to release new layer with code Solutions 1. Combine together previous layer with new one and ship combined layer fi rst • can be incompatible with API changes (test it fi rst) • no downtime at all • have to use bundler (require does not know which gem version should be loaded) 2. Push new layer and switch it just before pushing the new function code • there is no way to push the code and switch to new layer in one transaction • very small downtime (already started functions will be fi ne during that change) 3. Use lambda function versions and just switch event trigger to new code version with layer
  • 22. Take aways • Lambda loading time for ruby is more 0,5 sec • Loading gems with layers provides some challenges • If you have complex app then go with lambda docker
  • 23. Sources • https://stackify.com/aws-lambda-with-ruby-getting-started-guide • https://docs.aws.amazon.com/lambda/latest/dg/lambda-ruby.html • github.com aws-lambda developer-guide/sample-ruby • https://github.com/fxn/zeitwerk#awards • https://bundler.io