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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
mackee
March 19, 2023
Programming
10
14k
デプロイ今昔物語 〜CGIからサーバーレスまで〜 / The deployment technics
YAPC::Kyoto 2023
mackee
March 19, 2023
Tweet
Share
More Decks by mackee
See All by mackee
perlをWebAssembly上で動かすと何が嬉しいの??? / Where does Perl-on-Wasm actually make sense?
mackee
0
360
Agentに至る道 〜なぜLLMは自動でコードを書けるようになったのか〜
mackee
5
4.5k
今!ソフトウェアエンジニアがハードウェアに手を出すには
mackee
14
6k
ワンバイナリWebサービスのススメ
mackee
10
8.3k
tanukistack ライブコーディング / tanukistack live-coding
mackee
0
290
range over funcの使い道と非同期N+1リゾルバーの夢 / about a range over func
mackee
0
1.1k
perl for shell, awk and sed programmers
mackee
3
2.6k
今更GoのWebフレームワークを作ろうとしているワケ / Why am I trying to create a Go web framework now?
mackee
1
1k
database/sqlでNullを扱う歴史とsql.Null[T]の登場 / sql.Null[T] history
mackee
0
930
Other Decks in Programming
See All in Programming
Python札幌 LT資料
t3tra
7
1.1k
0→1 フロントエンド開発 Tips🚀 #レバテックMeetup
bengo4com
0
510
組織で育むオブザーバビリティ
ryota_hnk
0
140
なぜSQLはAIぽく見えるのか/why does SQL look AI like
florets1
0
340
AIエージェント、”どう作るか”で差は出るか? / AI Agents: Does the "How" Make a Difference?
rkaga
4
1.9k
AgentCoreとHuman in the Loop
har1101
5
200
QAフローを最適化し、品質水準を満たしながらリリースまでの期間を最短化する #RSGT2026
shibayu36
2
3.8k
PostgreSQLで手軽にDuckDBを使う!DuckDB&pg_duckdb入門/osc25hi-duckdb
takahashiikki
0
260
CSC307 Lecture 01
javiergs
PRO
0
680
今こそ知るべき耐量子計算機暗号(PQC)入門 / PQC: What You Need to Know Now
mackey0225
3
340
そのAIレビュー、レビューしてますか? / Are you reviewing those AI reviews?
rkaga
5
4k
從冷知識到漏洞,你不懂的 Web,駭客懂 - Huli @ WebConf Taiwan 2025
aszx87410
2
3.4k
Featured
See All Featured
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
150
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
890
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.7k
A Soul's Torment
seathinner
5
2.2k
Ethics towards AI in product and experience design
skipperchong
2
180
How to Talk to Developers About Accessibility
jct
1
100
The Language of Interfaces
destraynor
162
26k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.9k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
220
4 Signs Your Business is Dying
shpigford
187
22k
Building an army of robots
kneath
306
46k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
84
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σϓϩΠ͕ΊͪΌΊͪΌ͔ͬͨ • ΠϯϑϥͷઃఆσϓϩΠͱΞϓϦέʔγϣϯͷσϓϩΠͷڥ