Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ワンバイナリWebサービスのススメ
Search
mackee
May 31, 2025
Programming
9.4k
10
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ワンバイナリWebサービスのススメ
Houtou.pm #1
https://houtoupm.connpass.com/event/348282/
mackee
May 31, 2025
More Decks by mackee
See All by mackee
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
890
perlをWebAssembly上で動かすと何が嬉しいの??? / Where does Perl-on-Wasm actually make sense?
mackee
0
1.6k
Agentに至る道 〜なぜLLMは自動でコードを書けるようになったのか〜
mackee
6
6.9k
今!ソフトウェアエンジニアがハードウェアに手を出すには
mackee
14
7.7k
tanukistack ライブコーディング / tanukistack live-coding
mackee
0
990
range over funcの使い道と非同期N+1リゾルバーの夢 / about a range over func
mackee
0
1.2k
perl for shell, awk and sed programmers
mackee
3
3k
今更GoのWebフレームワークを作ろうとしているワケ / Why am I trying to create a Go web framework now?
mackee
1
1.2k
database/sqlでNullを扱う歴史とsql.Null[T]の登場 / sql.Null[T] history
mackee
0
1.1k
Other Decks in Programming
See All in Programming
LLM 101: Exploring LLMs, Starting with Tokens.
dalinaum
0
100
[JA] Domain Modeling with Vanilla Rails: 「操作」から再考するRailsの設計論
yasaichi
4
1.9k
AI時代のIaC入門 〜なぜインフラをコードで管理したいのか?〜 / Introduction to IaC in the AI Era
akihisaikeda
6
1.5k
Zero-Tap Sign-In対応、結局何をすればいいの?
mitohato14
0
1.9k
Lambda durable functionsでHuman in the Loopを楽に…楽に……
har1101
2
300
そのデザイントークン、Flutterでも同じ見た目になりますか?
nakamizu
0
320
SFCで実現する病院・医療システムの動的組み立て式UI
koukimiura
1
170
Enforcing Your Architecture with Unit Tests in the AI Era (Swift Connection X)
steliosf
PRO
1
150
Railsバージョンを4倍にした話
optim
0
970
SODA - FACT BOOK(JP)
sodainc
1
40k
社内AIエージェント「Askワンバン」における コストチューニングの取り組み
t0yohei
0
170
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
1.7k
Featured
See All Featured
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
760
Making the Leap to Tech Lead
cromwellryan
135
10k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.7k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
630
Rails Girls Zürich Keynote
gr2m
96
14k
Building Better People: How to give real-time feedback that sticks.
wjessup
371
20k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.4k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.4k
Test your architecture with Archunit
thirion
2
2.5k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
Automating Front-end Workflow
addyosmani
1370
210k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Transcript
ϫϯόΠφϦWebαʔϏεͷ εεϝ @mackee_w a.k.a macopy Houtou.pm #1
୭ʁ macopy GitHub: mackee X: mackee_w, mixi2: macopy ໘ന๏ਓΧϠοΫ άϧʔϓใ෦
όοΫΤϯυ, SRE, ΞʔΩςΫτ ද࡞: sqlla(ORM), tanukirpc(WAF)
Kamakura.goͬͯ·͢ʂʂʂ • લճ12݄ • ࣍7݄͔ͳ͋ͱͳͬͯ·͢
͓Βͤ: JRRF2025ʹग़ల͠·͢
ԿͷΛ͢Δͷʁ • αʔϏεΛ1ͭͷόΠφϦʹ·ͱΊͯ1ͭͷαʔόʔʹσϓϩΠ͢Δͷ Ͳ͏͔ͱݴ͏ఏҊ • ରൺ͢ΔͷෳͷΫϥυαʔϏεͰͷߏ(αʔόʔϨε) • ͦΕͧΕϝϦοτɾσϝϦοτ͕͋ΔͷͰ·ͣͦͷհ • ͳͥࠓʮϫϯόΠφϦʯͳͷ͔
͜ͷτʔΫΛ͠Α͏ͱࢥͬͨܦҢ • ීஈαʔόʔϨεߏͰࣄΛ͓ͯ͠Γେมศརʹײ͍ͯ͡Δ • ͔͠͠ؾ͔ͮͳ͍͏ͪʹࣄͷେ͕͍͔ʹखݩͰಈ͍͍ͯΔΞϓϦ έʔγϣϯΛͲ͏αʔόʔϨεߏʹద༻͢Δ͔ͷʹͳ͖ͬͯͨ • ͕࣌ؒͳͯ͘EC2Ͱͦͷ··ཱͯͨΒී௨ʹಈ͍ͨͷͰ͜ΕͰ͍͍ ͡ΌΜͱͳͬͨ
͜ͷηογϣϯͰͷ αʔόʔϨεͱʁ
αʔόʔϨεͷߏཁૉ(1) • FaaS ྫ: AWS Lambda, Cloud fl are Workers,
Cloud Run Functions • αʔόʔཧ͕͍Βͳ͍ • FaaSͷ߹ϦΫΤετॲཧ࣌ؒʹΑΔ՝͕ۚଟ͍ • ϑϧϚωʔδυ or αʔόʔϨεͳDB • RDBMS ͷ߹ϑϧϚωʔδυ͕ଟ͍ ྫ: Amazon RDS, Cloud SQL etc… • NoSQLҰ෦ͷRDBMSαʔόʔϨεత՝ۚϞσϧ ྫ: DynamoDB, Firestore
αʔόʔϨεͷߏཁૉ(2) • ΦϒδΣΫτετϨʔδ ྫ: Amazon S3, Cloud fl are R2,
Cloud Storage • ϑΝΠϧΞοϓϩʔυཁૉ͕͋ΔͱབྷΜͰ͘Δ • KVSͱͯ͠༻͢Δྫ͋Δ • CDN ྫ: Amazon CloudFront, Cloud fl are, Cloud CDN • WebϑϩϯτΤϯυ͕͋ΔαʔϏεͳΒཉ͍͠ • ΤοδͰॲཧͰ͖ͯخ͍͠έʔε͋Δ(CloudFront Functions
αʔόʔϨεͷߏཁૉ(3) • ϝοηʔδΩϡʔ ྫ: Amazon SQS, Cloud fl are Queues,
Cloud Tasks… • ඇಉظͰδϣϒΛΩοΫ͍ͨ͠έʔε͕͋Δ࣌ʹͬͨΓ͢Δ • FaaSͰϨεϙϯεΛฦ͞ͳͯ͘ྑ͍͕͍ॲཧΛΓ͍ͨέʔ εͳͲͰར༻͢Δ • ࣦഊͯ͠ϦτϥΠ͢ΔػߏͳͲ͕ೖͬͯͯخ͍͠
࠷ۙࣄͰ࡞ͬͨߏ
࠷ۙࣄͰ࡞ͬͨߏͦͷ2
झຯͰΔ࣌ͷߏ
ͳͥαʔόʔϨεͰ࡞Δͷ͔ʁ • ѹతʹ͍҆ • ୯७ͳWebαΠτ+গ͔͠Γͷॻ͖ࠐΈΛ͢ΔαΠτΛCDN/FaaS/NoSQL Ͱ࡞͕ͬͨɺͦͦ͜͜ར༻͕͋Δͷʹݸਓͷ͓খݣ͍ఔͰ͍͑ͯΔ • ӡ༻ίετݮ • αʔόʔͷΞοϓσʔτཧ੬ऑੑରԠͳͲͷൣғ͕ڱ͘ͳΔ
• εέʔϧΞτੑೳ • ʮαʔόʔʯ͕མͪΔͱ͍͏͜ͱཧతɾݱ࣮తʹͳ͍
͔͠͠ αʔόʔϨεͩͱࠔΔ͜ͱ͕͋Δ
1. ϩʔΧϧͰ։ൃͨ͠ͷΛͦͷ··͑ͳ͍ • ϩʔΧϧͱαʔόʔϨεڥಉҰͰͳ͍ • ΤϛϡϨʔτखஈ: AWS SAM Local, LocalStack
• ྆ରԠؔϋϯυϥ: fujiwara/ridge • ͦΕͰϓϩηεϞσϧͷҧ͍͔Β͘Δࡉ͔͍ڍಈͷҧ͍, ͦͦ ࣮ݱ͕͍͜͠ͱͳͲ͕͋Δ • ޓϨΠϠʔΛ͍ͭ͘ॻ͘͜ͱʹͳΔ
1. ϩʔΧϧͰ։ൃͨ͠ͷΛͦͷ··͑ͳ͍ • ϩʔΧϧͱαʔόʔϨεڥಉҰͰͳ͍ • ΤϛϡϨʔτखஈ: AWS SAM Local, LocalStack
• ྆ରԠؔϋϯυϥ: fujiwara/ridge • ͦΕͰϓϩηεϞσϧͷҧ͍͔Β͘Δࡉ͔͍ڍಈͷҧ͍, ͦͦ ࣮ݱ͕͍͜͠ͱͳͲ͕͋Δ • ޓϨΠϠʔΛ͍ͭ͘ॻ͘͜ͱʹͳΔ ͩͬͨΒϩʔΧϧͱಉ͡Α͏ͳ ී௨αʔόʔͰྑ͍ͷͰʁ
2. ࣗͷ৫֎Ͱͷӡ༻͕͍͠ • αʔόʔϨεͱ͍͏ΑΓΫϥυͷػೳʹґଘͨ͠αʔϏεͷσϝ Ϧοτ • ͓٬͞Μʮ͏ͪͷΦϯϓϨͰӡ༻͢Δ͔ΒιϑτΣΞΛചͬͯཉ͠ ͍ʯFaaS+αʔόʔϨεDBͰߏஙͨ͠΅͘ʮ…ʯ • 37signalsͷݴ͏ONCEϞσϧαʔόʔϨεલఏͷΞʔΩςΫνϟͩ
ͱࠔʹͳΔ
3. Ͱ͖ͳ͍͜ͱɾ͍͜͠ͱ͕͋Δ • ࠷࣮ۙࡍʹࣄͰͰ͘Θͨ͠՝ • PoCͷΞϓϦέʔγϣϯΛY.jsͱLocalStorageΛΈ߹ΘͤͯΫϥΠΞϯταΠυ͚ͩͰಈ࡞͢ ΔΑ͏ʹ࡞ͬͨ • ࣾͰෳਓͰ͓ࢼ͍͕ͨ͠͠ɺY.jsΛͪΌΜͱωοτϫʔΫܨ͛ͨΓLocalStorageͷσʔλ ຊαʔόʔʹஔ͖͍ͨ
• LambdaͩͱWebSocketΊΜͲ͍͘͞͠ɺ͕࣌ؒͳ͍ͷͰY.jsͷWebSocketαʔόʔΛͦͷ·· ಈ͔͍ͨ͠… • ͍͑ʂ͏EC2ཱͯͯͦ͜ͰWebSocketͷαʔόʔஔ͖·͢ɻAPIαʔόʔαΫοͱॻ͍ͯͦ ͜Ͱϗετ͠·͢ʂ => ͳΜͩ͜ΕͰ͍͍͡ΌΜ
݁ہαʔόʔϨεͰಘΒΕΔͷຊʹඞཁʁ • ίετ • ӡ༻ෛՙͷݮ • εέʔϧΞτੑೳ
• ίετ • (डୗͳͲͷ߹)ίετΑΓఱҪ͕ͳ͍ͱ͍͏ํ͕ྑ͍ͱݴ͏͓٬͞Μ͕͍Δ => ैྔ՝ۚͷ αʔόʔϨε͍ʹ͍͘ • ӡ༻ෛՙͷݮ •
ݱͷಓ۩(ίϯςφorϫϯόΠφϦͰు͘ݴޠ,tailscaleCloud fl are Tunnel, AWS Systems Manager etc…)Λ͑Ͳ͏ʹ͔ͳΔ͔ʁ • εέʔϧΞτੑೳ • ఘΊΔ😇 • CDNͰ͑Δʂαʔόʔ͕མͪͨΒఘΊΔ ݁ہαʔόʔϨεͰಘΒΕΔͷຊʹඞཁʁ
͡Ό͋Ͳ͜ʹσϓϩΠ͢Δʁ • ϩʔΧϧ…࣮༻తͰͳ͍ͷͰ • Cloud fl are TunnelngrokhttpsͰϩʔΧϧͷʹΕͯྑ͍ • https͡Όͳ͍ͱ͑ͳ͍Webٕज़͕͋Δ(ྫ:
Web Push) • ͦ͜ΒลͷదͳVPSʹσϓϩΠ͍ͨ͠ • fl y.ioCloud RunΈ͍ͨͳDocker PaaSͰྑ͍͔ͱࢥ͍·͢ • Ͱී௨ʹσΟεΫʹॻ͍ͯফ͑ͪΌ͏͔Βͳ… • ͱ͍͑ͳΜΒ͔ӬଓతͳσΟεΫΞλονͰ͖Δͱࢥ͍·͢
Ͳ͏ͬͯVPSͰӡ༻͢Δ͔
RailsʹֶͿ • ࠷ۙͷRailsONCEϞσϧ͕Ͱ͖ΔΑ͏ʹSQLiteʹد͍ͤͯΔ • Solid Queue, Solid Cable, Solid Cache
• σϓϩΠπʔϧKamalαʔόʔʹରͯ͠ͷϓϩϏδϣχϯάͱσϓ ϩΠΛߦ͏ • DockerίϯςφͰͷσϓϩΠ • kamal-proxy͕σϓϩΠ࣌ͷϦΫΤετܦ࿏ͷ͚ସ͑Λߦ͏
1ͰΑ͚ΕSQLiteͰྑ͍ • (ࢲSQLite͕ʹ͋ͬͨISUCON12༧બͷ࡞ऀͷҰਓͰ͢) • SQLite༧Ҏ্ͷྲྀྔΛࡹ͘͜ͱ͕Ͱ͖Δ • ϨϓϦέʔγϣϯ͍ͨ͠/ϦετΞ͍ͨ͠ => Litestream
εϥΠυॻ͍ͯͯࢥͬͨ: SQLiteͰGraceful RestartՄೳͳͷʁ • ࣮ݧ: Go + SQLiteͰॻ͍ͨΞϓϦέʔγϣϯʹabͰॻ͖ࠐΈΛܧଓ తʹߦ͍ͭͭɺGraceful Restart
• ͦͦෳͷॻ͖ࠐΈϦΫΤετ͕ಉ࣌ʹདྷΔͱ `database is locked (5) (SQLITE_BUSY)` ͷΑ͏ʹग़ΔͷͰ`sqlite3_busy_timeout` Λઃఆ • `sqlite3_busy_timeout `ͷޮՌͰͳͦ͞͏
࠷ۙͷRailsͰͷSQLiteͷΦϓγϣϯ • `IMMEDIATE` τϥϯβΫγϣϯͷΦϓγϣϯͰɺτϥϯβΫγϣϯΛ ։࢝ͨ࣌͠ʹσʔλϕʔεϩοΫΛऔΔ • WAL(Write Ahead Logging): τϥϯβΫγϣϯͷ୯ҐͰҰ࣌ϑΝΠϧ
Λ࡞ͬͯίϛοτ࣌ʹຊମʹॻ͖ࠐΉ • `sqlite3_busy_timeout` ଞͷεϨου/ϓϩηε͕ϩοΫ͍ͯ͠Δ࣌ʹ ॻ͖ࠐ͏ͱͨ࣌͠ʹԿඵ͔ͭ
GoͰRailsతʹ։ൃ͢Δ • ࠷ۙࣄͰΔ࣌ʹ࠾༻͢ΔελοΫ tanukirpc + sqlla • ϑϩϯτΤϯυTanStack Router +
React + Vite • tanukirpcͱsqllaboilerplateͳίʔυΛgenericsͱίʔυੜͰݮ͢ΔΞ ϓϩʔν • RailsgemͱDSLͰݮ͍ͯ͠Δ • ݸਓతʹ͜ͷΈ߹Θ͕ͤܕ͖ͰϫϯόΠφϦͰు͚ΔRailsͱͯ͠ೝࣝ͠ ͍ͯΔ
͍: ຊʹDocker͕ඞཁͳͷ͔ʁ • RailsͷΑ͏ͳRubyͱଟͷgemͰಈ࡞͢ΔͳΒ͋ͬͨํ͕ྑͦ͞͏ • σϓϩΠͷύοέʔδϯά͕DockerͰ୲͑Δ • gem͕OSଆͷڞ༗ϥΠϒϥϦʹґଘ͍ͯ͠Δέʔε • ෳͷϓϩηεͰಈ͘ͳΒ͋ͬͨํ͕ྑͦ͞͏
GoͷΑ͏ͳϫϯόΠφϦͳΒͲ͏͔ʁ • ϫʔΧʔͱ͔1ͭͷϓϩηεʹ·ͱΊͯgoroutineͰಈ͔ͪ͠Ό͏ • Graceful ShutdownႈੑؤுΖ͏ • σϓϩΠγϯϓϧʹखݩorCIͰϏϧυ => rsync
=> ࠶ىಈͰྑ͍ • ઌ΄ͲͷGraceful RestartͷσϞͰࣔͨ͠server_starterͷྫ
ϑϩϯτΤϯυͲ͏ͬͯΔʁ • `//go:embed` Λ༻͢Δ • ϑΝΠϧσΟϨΫτϦΛؙ͝ͱϓϩάϥϜͷόΠφϦʹ֨ೲ͢Δ • io/fs.FSΠϯλʔϑΣΠεΛ࣮͍ͯ͠ΔͷͰͦͷ··ϑΝΠϧγες ϜͷΑ͏ʹϓϩάϥϜ෦Ͱѻ͑Δ •
embedͰϏϧυͨ͠ϑϩϯτΤϯυΛ֨ೲ͢Δ
ະղܾͷ: σϓϩΠͨ͠Βݹ͍ΞηοτʹΞ ΫηεͰ͖ͳ͘ͳͬͨ • σϓϩΠޙʹϒϥβ͕อ͍࣋ͯ͠Δݹ͍index.htmlͳͲ͕ಡ͏ͱ͍ͯ͠Δݹ͍JSCSSΛಡ ͏ͱͯ͠404ʹͳΔ݅ • kamal-proxyͰղܾͰ͖͍ͯΔ • υΩϡϝϯτΛಡΉͱ྆ํอ͍࣋ͯ͠ΔͬΆ͍ʁ
• ͠Β͘ݹ͍ͭ࣋ͭͷ͕͍͍ΜͰ͠ΐ͏͔ • CloudFront + S3ͰΑ͍ͬͯͨ͘खஈͰ͋Δ͕… • `window.addEventListener(‘error’, …)`Ͱ`location.reload()`͢Δํ๏Ͱ͖ͦ͏ʁ • ͘͠Service Worker?
ͦͷଞͷ: ingress௨৴ • ϙʔτ22൪Λ։͚Δͷ͔ͳΓݏ • tailscaleಥͬࠐΜͰຊsshdΘͣʹTailscaleܦ༝ͰϩάΠϯ͍ͯ͠Δ • ͋ͱufwͰtailscaleҎ֎͔Βͷ֎͔Βͷ௨৴Λશ෦࠹͙ • 443൪։͚ͨ͘ͳ͍
• ͦΜͳ࣌ʹ͑Δͷ͕Cloud fl are Tunnel • cloud fl aredΛཱͯͯɺCloud fl areͰड͚ͨϦΫΤετΛτϯωϧܦ༝Ͱड͚Δ • cloud fl aredegressͷ௨৴͔͠͠ͳ͍ͷͰϙʔτ։͚Δඞཁ͕ͳ͍
͞Βʹͦͷଞ • daemonize • ੲsupervisordͱ͔daemontoolsͱ͔͚͋ͬͨΕͲࠓsystemdͰ͍͍ͱࢥ͏Α • cron • systemdͰ͍͍ͱࢥ͏Α •
ٖࣅcronϫʔΧʔΛgoroutineͰཱͯΔͷ͋Γ • ϩά • systemdͰ͍͍ͱࢥ͏Α • ݕࡧͰू͕ཉ͔ͬͨ͠ΒS3ͱ͔ʹͳΜΒ͔ϩάίϨΫλͰඈ͢ͷ͕͍͍ΜͰ͔͢Ͷ͑ • ࢹ • Mackerelͱ͔NewRelicͱ͔ • ࣗલmisskeyαʔόʔNewRelicೖΕͯΔ • ϓϩϏδϣχϯά • mitamae͔ͳ͋ systemdͷunitϑΝΠϧΛಥͬࠐΉͷࣗ࡞͔ͯ͑͑͠͠ΕΜ
Ҏ্ GoͰϫϯόΠφϦ+SQLiteͰαʔϏε ߏஙͷͰͨ͠