Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
デプロイ今昔物語 〜CGIからサーバーレスまで〜 / The deployment technics
Search
mackee
March 19, 2023
Programming
10
11k
デプロイ今昔物語 〜CGIからサーバーレスまで〜 / The deployment technics
YAPC::Kyoto 2023
mackee
March 19, 2023
Tweet
Share
More Decks by mackee
See All by mackee
マイクロサービス化を利用した Goへの移行事例
mackee
0
66
PerlでつくるフルスクラッチWebAuthn/パスキー認証 / Demonstration of full-scratch WebAuthn/Passkey Authentication written in Perl
mackee
3
2.6k
SRE定例やその辺の取り組みをアプリケーションエンジニア目線で語る / "Observe" about SRE Meeting by Application Engineer
mackee
0
1.7k
TinyGoで使えるORM sqllaの 紹介とTinyGoで使えるようにするための工夫
mackee
0
730
Go向けORM sqllaの紹介と JOINやUNIONを含んだクエリの扱い方
mackee
0
1.2k
E2Eテストから負荷試験シナリオを作ってみた / Why do we make a scenario of load testing from E2E testing scenarios
mackee
3
5k
じわじわとPerlからGoに移行しようとしている俺達のマイクロサービシーズの紹介 / The migrating to microservices in Go from Monolith in Perl
mackee
2
2.9k
Mojoliciousで書いて理解するhotwireの仕組み
mackee
0
4.8k
GraphQLサーバを作る苦しみと解決手法
mackee
16
9.2k
Other Decks in Programming
See All in Programming
Harnessing Large Language Models for Training-free Video Anomaly Detection
tereka114
1
1.3k
Ruby メモリ管理 プログラミング
megmogmog1965
0
130
Polarsの成長: v0.14からv1.0までの変遷と今後の展望
zerebom
1
350
ドメイン駆動設計の実践
masuda220
PRO
17
5.1k
Modern Angular: Renovation for Your Applications
manfredsteyer
PRO
0
140
Javaの現状2024夏 / Java current status 2024 summer
kishida
4
1.4k
CSC307 Lecture 09
javiergs
PRO
1
500
ぼっちを避けて楽しむためのアノテコノテ / Various Tips and Tricks to Avoid Loneliness and Have Fun
nrslib
3
1.7k
Composing an API the *right* way (Droidcon Berlin 2024)
zsmb
1
450
入社1ヶ月でここまでやった!Findy Toolsインフラ支援の最適化
rvirus0817
6
1.4k
Rust.Nagoya #1
codemountains
0
170
OpenAI/Gemini APIを使って EPUBを翻訳するCLIツールをつくってみた
tomiyan
0
790
Featured
See All Featured
Building a Scalable Design System with Sketch
lauravandoore
458
32k
Designing the Hi-DPI Web
ddemaree
276
34k
Bash Introduction
62gerente
607
210k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
248
20k
RailsConf 2023
tenderlove
16
720
XXLCSS - How to scale CSS and keep your sanity
sugarenia
245
1.2M
Pencils Down: Stop Designing & Start Developing
hursman
118
11k
Docker and Python
trallard
37
2.9k
The Art of Programming - Codeland 2020
erikaheidi
48
13k
How GitHub (no longer) Works
holman
305
140k
No one is an island. Learnings from fostering a developers community.
thoeni
17
2.8k
In The Pink: A Labor of Love
frogandcode
139
22k
Transcript
σϓϩΠࠓੲޠ ʙCGI͔ΒαʔόʔϨε·Ͱʙ @mackee_w a.k.a macopy
͢༰
σϓϩΠ
@macopy • ໘ന๏ਓΧϠοΫ eεϙʔπࣄۀ෦ TonamelαʔόαΠυςοΫϦʔυ • Perlେ͖ Go͖ • GGST༻Ωϟϥ:
ϥϜϨβϧ • ISUCON11 ༏উ / ISUCON12 ग़
[AD] Tonamel
[AD] Tonamel ࠓճͷτʔΫͰհ͢Δ ʮσϓϩΠʯͰ͍͏ͱ Tonamel ʮPullܕσϓϩΠʯ͔ͭ ʮDockerʯͰ͢
͜ͷτʔΫʹ͓͚ΔʮσϓϩΠʯͷൣғ • WebΞϓϦέʔγϣϯΛ։ൃͨ͠ޙ͔ΒɺϢʔβʔ͕ϒϥβͰݟΔ ·Ͱʹඞཁͳٕज़܈ • ʮσϦόϦʔʯͱݴ͏ • ྫ: • αʔόʔͷϓϩάϥϜͷөํ๏
• αʔόʔϓϩάϥϜͷϗεςΟϯάํ๏
!DISCLAIMER! ͜ͷτʔΫͰҟͳΔϨΠϠʔͷ֓೦͕ަޓ ʹग़͖ͯͨΓࠞͬͨ͟Γͯ͠͞Ε·͢ ॱ൪֓Ͷ࣌ܥྻͰͷొॱͰ͕͢ɺհ͢ ΔτϐοΫొஃऀͷڵຯͰܾΊ͍ͯ·͢
͜ͷτʔΫͷਐΊํ • ҎԼͷΛҰͭͷσϓϩΠٕज़ʹର͍͖ͯͯ͠͠·͢ •ख๏ͷղઆ •࣌എܠ •࣮ફ
͜ͷτʔΫͷਐΊํ • ҎԼͷΛҰͭͷσϓϩΠٕज़ʹର͍͖ͯͯ͠͠·͢ •ख๏ͷղઆ => Ͳ͏͍͏Έͳͷ͔ •ొഎܠ => ੜ·ΕͨܦҢ •࣮ફ
=> ͬͯΈΑ͏ɺମݧͯ͠ΈΑ͏
!DISCLAIMER! ͦͷ2 σϞʹ࣌ΘΕ͍ͯͨιϑτΣΞ (όʔδϣϯ)͍ͬͯ·ͤΜʂʂʂ ࠓݱࡏೖखͰ͖ΔͷΛ͍ͬͯ·͢
ొ͢ΔιϑτΣΞڥ • Perl 5.32.1(system perl), Perl 5.36.0 • Apache 2.4.54
• mod_perl 2.0.11 • Debian 11 bullseye • ݕূڥͱ͜ͷϚγϯؒtailscaleͰVPNΛு͍ͬͯ·͢
Are you ready?
CGI
CGIͷख๏
CGIͷొഎܠ • 1993ʹఏҊ͞Ε༷ͨ ͜ͷ࣌ͷόʔδϣϯ1.0 • NCSA httpdʹhtbinͱ͍͏ػೳ͕͕͋ͬͨɺଞͷαʔόʔͰ͑ ΔΑ͏ʹ”Common”ͳ༷͕ߟ͑ΒΕͨ • ࣌HTMLࡦఆ్্ͰɺWebΛऔΓר͘πʔϧνΣΠϯ͕ੜ·Ε
Δᴈ໌ظͱ͍ͬͨײ͡
ʮϨϯλϧαʔόʔʯ ※ҰྫͰ͢
࣮ફ: PerlͷCGIϓϩάϥϜΛσϓϩΠ
ඪ४ετϦʔϜͱڥม͕͋ΕͳΜͰ͓k • ϓϩάϥϛϯάݴޠඇґଘͰ͋Δ • PerlͰCGI͋·Γʹ͋Γ͖ͨΓͰ • ͔ͤͬ͘ݴޠඇґଘͳͷʹ͜ͷσϞͰͭ·Μͳ͍Ͱ͢ΑͶʁ
࣮ફ: jqͰCGIϓϩάϥϜΛ ॻ͍ͯσϓϩΠ
CGIͷσϝϦοτ • ϓϩηεىಈͷίετ͕ॏ͍ • ϦΫΤετͷͨͼʹϓϩηεΛىಈ͠ऴྃ͢Δ͜ͱʹͳΔ • PerlͷΑ͏ͳLLͰϞδϡʔϧͷಡΈࠐΈ͕ൃੜ͢Δ͜ͱʹ • ੲ`use`Ͱͳ͘`require`ΛͬͨDynamic Loading͕ଟ༻͞Ε
͍ͯͨͷͦͷ͍ͤͩͱฉ͍͍ͯ·͢
੩తΤϯυϙΠϯτͷϕϯνϚʔΫ
CGIͷϕϯνϚʔΫ
mod_perl
mod_perlͷख๏
mod_perlͷొഎܠ • 1996ʹmod_perl, 2002ʹmod_perl2͕ϦϦʔε • Apacheͷػೳ֦ுΛPerlͰߦ͏Ϟδϡʔϧ • Ͱ͋Δ͕CGIϓϩάϥϜΛͦͷ··ޮΑ͘ಈ͔ͨ͢ΊʹΘΕͨ • `ModPerl::Registry`ͷHandlerΛ͑CGIͱͷޓੑΛอͬͨ··͑Δ
• άϩʔόϧมͷण໋͕ϦΫΤετ୯ҐͰͳ͘ͳͬͨ • ཪΛฦͤϦΫΤετ୯ҐͰ͋ΔલఏͷCGIϓϩάϥϜͦͷ··Ͱಈ͔ͳ͍
࣮ફ: PerͷCGIϓϩάϥϜΛ mod_perlͰಈ͔͢
ྨࣅ • mod_mruby, mod_lua etc… • Perlͷ෦Λผͷݴޠʹஔ͖͑ͨApacheͷϞδϡʔϧ • ngx_http_perl_module •
nginxʹPerlΛΈࠐΜͰϦΫΤετॲཧͤ͞ΔϞδϡʔϧ
FastCGI
FastCGIͷख๏
FastCGIͷొഎܠ • 1996ʹఏএ͞Εͨ • mod_perlͷ༻్ͱಉ͘͡ʮCGIϓϩάϥϜͷߴԽʯ • ҰํͰɺmod_perlͱҧ͍ݴޠඇґଘΛࢦͨ͠ • શͳdrop-in replacementͰ͖ͳ͍͕ɺηϚϯςΟΫεCGI͔Β
Ҿ͖ܧ͍Ͱ͍Δ • 1ͭͷίωΫγϣϯͰϦΫΤετͷଟॏԽ͞Ε͍ͯΔ
࣮ફ: PerlͷFastCGI͚ϓϩάϥϜΛ ಈ͔͢
FastCGIͷྨࣅ • SpeedyCGI/PersistentPerl • CGIϓϩηεΛӬଓԽͯ͠ར༻͢Δվ͞ΕͨperlΠϯλϓϦλΛ ༻͍Δ • #!/usr/bin/speedy ʹshebangΛஔ͖͑Δͱར༻Ͱ͖Δ •
ApacheͱSpeedyCGIؒCGIͱಉ༷ඪ४ετϦʔϜ+ڥม
PSGI
PSGIͷొഎܠ • 2009ʹspec͕CPANʹshipit͞Εͨ • WebϑϨʔϜϫʔΫͷ࣌ʹͳ͍͕ͬͯͨɺWebϑϨʔϜϫʔΫ͕ͦΕ ͧΕɺCGIFastCGIɺmod_perl͚ͷରԠΛߦͳ͍ͬͯͨ… • ͦ͜ͰWebΞϓϦͷೖग़ྗΛநԽͨ͠ΠϯλʔϑΣΠεΛ༻ҙͯ͠ (=PSGI)ͦͷΠϯλʔϑΣΠεΛѻ͍ͨ͘͢͠ϥΠϒϥϦ(=Plack)Λ༻ ҙͯ͠ɺPlack::Handlerͱͯ͠CGImod_perlͷϋϯυϥ͕࣮͞Εͨ
PSGIͷొഎܠ ͦͷ2 • ҰํͰϓϩάϥϛϯάݴޠϥϯλΠϜࣗମͰHTTPαʔόʔΛಈ͔͢Α ͏ʹͳͬͨ • ”ϦόʔεϓϩΩγ”ͱ͍͏֓೦͕ҰൠతʹͳΓ࢝Ίͨ • lighttpd, nginx
etc… • Plack::Handlerͱͯ͠StarmanStarletͱ͍ͬͨPreforkܕͷHTTPαʔ όʔ͕࣮͞Εͯ͘ΘΕΔΑ͏ʹͳͬͨ
Plack/PSGIͷख๏
࣮ફ: ੜPSGIΛॻ͍ͯΈͨ
PSGIͷྨࣅ • Java Servelet API • WSGI (Python) • Rack
(Ruby) • ͜ͷॱ൪Ͱspecʹݴٴ͕͋Δ • PSGIʹWSGIͱRackͱ”JSGI”ʹݴٴ͕͋Δ
Plackͷྨࣅ(ΠϯλʔϑΣΠεࢹ) • ઌͨͪ • CGI.pm • CGI::Application • Apache::Request •
HTTP::Engine • Catalyst::Engine
͜Ε·ͰΞʔΩςΫνϟ ϓϩάϥϛϯάΠϯλʔϑΣΠεΛ த৺ʹ͝հ
͔͜͜Βαʔόʔͷ өํ๏ʹ͍ͭͯ͝հ
FTP
CGI/mode_perl/FastCGIͰFTPΛ ͬͯσϓϩΠ͍ͯͨ͠ͷͰলུ ※2023࣌ͷҙݟͰ͢
Pushܕ σϓϩΠ
PushܕσϓϩΠͷख๏
࣮ફ: PSGIΞϓϦΛ PushܕσϓϩΠ͢Δ
PushܕσϓϩΠͷ • αʔόʔ͕େ͖͘ͳΓ࢝Ίͨ • Push͢ΔଆͷϦιʔεͷͯ͠ σϓϩΠ͕͘ͳΔ • ύϒϦοΫΫϥυͷීٴͰΦʔ τεέʔϧ͢ΔΑ͏ʹͳ͕ͬͨɺ
ͦͷ߹ͷ৯͍߹Θ͕ͤѱ͍
Pullܕ σϓϩΠ
PullܕσϓϩΠͷख๏
࣮ફ: stretcherΛ༻͍ͨ PushܕσϓϩΠ
ΞʔΩςΫνϟͷհʹΔ
Docker
DockerΛͬͨσϓϩΠͷख๏
࣮ફ: Docker SwarmΛ༻͍ͨ DockerͷσϓϩΠ
Dockerͷొഎܠ • Dockerͷൃද2013 • PullܕσϓϩΠ • ʮίϯςφʯͱ͍͏ܗͰWebΞϓϦέʔγϣϯΛϥϯλΠϜ͝ͱ packͯ͠σϓϩΠ͢Δख๏ • ʮσϓϩΠʯͷର͕ΞϓϦέʔγϣϯϓϩάϥϜʹՃ͑ͯϥϯ
λΠϜ·Ͱ͕ͬͨ
Serverless
LambdaΛ༻͍ͨαʔόʔϨεͷख๏
࣮ફ: lambrollΛ༻͍ͨ Perl WebΞϓϦέʔγϣϯͷσϓϩΠ
Serverless/FaaSͷొഎܠ • ΞϓϦέʔγϣϯ੍࡞ऀ͕ཧ͢Δର͕࣌Λ͏͝ͱʹϨΠ Ϡʔ্͕ͱ্͕͍͍ͬͯͬͯͨ • ཧαʔόʔ, Ծαʔόʔ, IaaS, ίϯςφ •
ϥϯλΠϜϓϩηεͷϥΠϑαΠΫϧ·ͰΫϥυࣄۀऀʹ͓ئ͍ ͯ͠͠·͏ͷ͕Serverless • Ϩϯλϧαʔόʔ/CGIͷճؼ, ΑΓޮԽ͞Εͨͷ
Serverless/FaaSͷྨࣅ • PaaS • Heroku, Elastic Beanstalk, AppEngine(Flexible Environment)… •
ϥϯλΠϜͷΫϥυࣄۀऀ • ͨͩ͠αʔόʔతଘࡏ࣮֬ʹײ͡Δ, εέʔϦϯάઃఆͳͲ
͍͔͕Ͱͨ͠Ͱ͠ΐ͏͔
ొஃऀͷײ • σϓϩΠٕज़લʹΘΕٕͨज़ͷ՝Λղফ͢ΔͨΊʹੜ·Ε͖ͯͨ • ࢼߦࡨޡͷ݁Ռࠓ͕͋Δɻͭ·Γ “try/catch” Ͱ͢Ͷ • ͦΕͦΕͱͯ͠ɺੲͷٕज़ͰݟͲ͜Ζ͋Δ •
CGI͕ಈ͘ϨϯλϧαʔόʔFaaSͱݴ͑Δ • ੲΑΓWebΞϓϦέʔγϣϯ͕ղ͜͏ͱ͢Δ՝͕ෳࡶʹͳ͍ͬͯΔ ͷͰɺཧํ๏ͷҰͭͰ͋ΔʮσϓϩΠʯෳࡶʹͳΔ
͋ͳͨͷ͖ͳ ʮσϓϩΠʯ ͋Γ·͔ͨ͠ʁ
࠙ձͱ͔࿓ԼͰͯ͠ཉ͍͠ • 2000ΑΓલͷJavaͱ͔Ͳ͏ͬͯσϓϩΠ͍ͯͨ͠ͷ͔ʁ • warͰݻΊͯΛFTPͰυʔϯ͍ͯͨ͠, TomcatͰͱ͍͏͕͋Γ·͢ɻ༗ࣝऀ ͷํʑͲ͏ͧ • ASPͱ͔IISͱ͔Windows Server
• mod_perl͔FastCGIͲͪΒΛ͍͔ͬͯͨ • ͓͢͢ΊͷϨϯλϧαʔόʔ • ొஃऀXREAΛ͍ͬͯ·ͨ͠
࠙ձͱ͔࿓ԼͰͯ͠ཉ͍͠ ͦͷ2 • ϩʔϦϯάϦελʔτ, ϒϧʔάϦʔϯσϓϩΠ • graceful restart • PullܕσϓϩΠ+graceful
restartσϓϩΠ͕ΊͪΌΊͪΌ͔ͬͨ • ΠϯϑϥͷઃఆσϓϩΠͱΞϓϦέʔγϣϯͷσϓϩΠͷڥ