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
ワンバイナリWebサービスのススメ
Search
mackee
May 31, 2025
Programming
10
7.9k
ワンバイナリWebサービスのススメ
Houtou.pm #1
https://houtoupm.connpass.com/event/348282/
mackee
May 31, 2025
Tweet
Share
More Decks by mackee
See All by mackee
tanukistack ライブコーディング / tanukistack live-coding
mackee
0
110
range over funcの使い道と非同期N+1リゾルバーの夢 / about a range over func
mackee
0
780
perl for shell, awk and sed programmers
mackee
2
2.4k
今更GoのWebフレームワークを作ろうとしているワケ / Why am I trying to create a Go web framework now?
mackee
1
750
database/sqlでNullを扱う歴史とsql.Null[T]の登場 / sql.Null[T] history
mackee
0
640
マイクロサービス化を利用した Goへの移行事例
mackee
0
770
PerlでつくるフルスクラッチWebAuthn/パスキー認証 / Demonstration of full-scratch WebAuthn/Passkey Authentication written in Perl
mackee
3
4.8k
SRE定例やその辺の取り組みをアプリケーションエンジニア目線で語る / "Observe" about SRE Meeting by Application Engineer
mackee
0
2k
TinyGoで使えるORM sqllaの 紹介とTinyGoで使えるようにするための工夫
mackee
0
1.5k
Other Decks in Programming
See All in Programming
No Install CMS戦略 〜 5年先を見据えたフロントエンド開発を考える / no_install_cms
rdlabo
0
420
TypeScriptでDXを上げろ! Hono編
yusukebe
4
920
Google I/O Extended Incheon 2025 ~ What's new in Android development tools
pluu
1
220
Understanding Kotlin Multiplatform
l2hyunwoo
0
250
Claude Code と OpenAI o3 で メタデータ情報を作る
laket
0
100
[Codecon - 2025] Como não odiar seus testes
camilacampos
0
100
バイブコーディングの正体——AIエージェントはソフトウェア開発を変えるか?
stakaya
5
630
オンコール⼊⾨〜ページャーが鳴る前に、あなたが備えられること〜 / Before The Pager Rings
yktakaha4
2
1.2k
変化を楽しむエンジニアリング ~ いままでとこれから ~
murajun1978
0
650
Vibe coding コードレビュー
kinopeee
0
390
Jakarta EE Meets AI
ivargrimstad
0
550
Quality Gates in the Age of Agentic Coding
helmedeiros
PRO
1
120
Featured
See All Featured
Fireside Chat
paigeccino
37
3.6k
Rebuilding a faster, lazier Slack
samanthasiow
83
9.1k
A designer walks into a library…
pauljervisheath
207
24k
What's in a price? How to price your products and services
michaelherold
246
12k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.3k
Building Applications with DynamoDB
mza
95
6.5k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.8k
Rails Girls Zürich Keynote
gr2m
95
14k
Making Projects Easy
brettharned
117
6.3k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
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ͰαʔϏε ߏஙͷͰͨ͠