Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ワンバイナリWebサービスのススメ

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

 ワンバイナリWebサービスのススメ

Avatar for mackee

mackee

May 31, 2025
Tweet

More Decks by mackee

Other Decks in Programming

Transcript

  1. ୭ʁ macopy GitHub: mackee X: mackee_w, mixi2: macopy ໘ന๏ਓΧϠοΫ άϧʔϓ৘ใ෦

    όοΫΤϯυ, SRE, ΞʔΩςΫτ ୅ද࡞: sqlla(ORM), tanukirpc(WAF)
  2. αʔόʔϨεͷߏ੒ཁૉ(1) • FaaS ྫ: AWS Lambda, Cloud fl are Workers,

    Cloud Run Functions • αʔόʔ؅ཧ͕͍Βͳ͍ • FaaSͷ৔߹͸ϦΫΤετ΍ॲཧ࣌ؒʹΑΔ՝͕ۚଟ͍ • ϑϧϚωʔδυ or αʔόʔϨεͳDB • RDBMS ͷ৔߹͸ϑϧϚωʔδυ͕ଟ͍ ྫ: Amazon RDS, Cloud SQL etc… • NoSQL΍Ұ෦ͷRDBMS͸αʔόʔϨεత՝ۚϞσϧ ྫ: DynamoDB, Firestore
  3. αʔόʔϨεͷߏ੒ཁૉ(2) • ΦϒδΣΫτετϨʔδ ྫ: Amazon S3, Cloud fl are R2,

    Cloud Storage • ϑΝΠϧΞοϓϩʔυཁૉ͕͋ΔͱབྷΜͰ͘Δ • KVSͱͯ͠୅༻͢Δྫ΋͋Δ • CDN ྫ: Amazon CloudFront, Cloud fl are, Cloud CDN • WebϑϩϯτΤϯυ͕͋ΔαʔϏεͳΒཉ͍͠ • ΤοδͰॲཧͰ͖ͯخ͍͠έʔε΋͋Δ(CloudFront Functions౳
  4. αʔόʔϨεͷߏ੒ཁૉ(3) • ϝοηʔδΩϡʔ ྫ: Amazon SQS, Cloud fl are Queues,

    Cloud Tasks… • ඇಉظͰδϣϒΛΩοΫ͍ͨ͠έʔε͕͋Δ࣌ʹ࢖ͬͨΓ͢Δ • FaaSͰϨεϙϯεΛฦ͞ͳͯ͘΋ྑ͍͕௕͍ॲཧΛ΍Γ͍ͨέʔ εͳͲͰར༻͢Δ • ࣦഊͯ͠΋ϦτϥΠ͢ΔػߏͳͲ͕ೖͬͯͯخ͍͠
  5. 1. ϩʔΧϧͰ։ൃͨ͠΋ͷΛͦͷ··࢖͑ͳ͍ • ϩʔΧϧͱαʔόʔϨε؀ڥ͸ಉҰͰ͸ͳ͍ • ΤϛϡϨʔτखஈ: AWS SAM Local, LocalStack౳

    • ྆ରԠؔ਺ϋϯυϥ: fujiwara/ridge౳ • ͦΕͰ΋ϓϩηεϞσϧͷҧ͍͔Β͘Δࡉ͔͍ڍಈͷҧ͍, ͦ΋ͦ΋ ࣮ݱ͕೉͍͜͠ͱͳͲ͕͋Δ • ޓ׵ϨΠϠʔΛ͍ͭ͘΋ॻ͘͜ͱʹͳΔ
  6. 1. ϩʔΧϧͰ։ൃͨ͠΋ͷΛͦͷ··࢖͑ͳ͍ • ϩʔΧϧͱαʔόʔϨε؀ڥ͸ಉҰͰ͸ͳ͍ • ΤϛϡϨʔτखஈ: AWS SAM Local, LocalStack౳

    • ྆ରԠؔ਺ϋϯυϥ: fujiwara/ridge౳ • ͦΕͰ΋ϓϩηεϞσϧͷҧ͍͔Β͘Δࡉ͔͍ڍಈͷҧ͍, ͦ΋ͦ΋ ࣮ݱ͕೉͍͜͠ͱͳͲ͕͋Δ • ޓ׵ϨΠϠʔΛ͍ͭ͘΋ॻ͘͜ͱʹͳΔ ͩͬͨΒϩʔΧϧͱಉ͡Α͏ͳ ී௨αʔόʔͰྑ͍ͷͰ͸ʁ
  7. 3. Ͱ͖ͳ͍͜ͱɾ೉͍͜͠ͱ͕͋Δ • ࠷࣮ۙࡍʹ࢓ࣄͰͰ͘Θͨ͠՝୊ • PoCͷΞϓϦέʔγϣϯΛY.jsͱLocalStorageΛ૊Έ߹ΘͤͯΫϥΠΞϯταΠυ͚ͩͰಈ࡞͢ ΔΑ͏ʹ࡞ͬͨ • ࣾ಺Ͱෳ਺ਓͰ͓ࢼ͍͕ͨ͠͠ɺY.jsΛͪΌΜͱωοτϫʔΫܨ͛ͨΓLocalStorage಺ͷσʔλ ͸ຊ౰͸αʔόʔʹஔ͖͍ͨ

    • LambdaͩͱWebSocketΊΜͲ͍͘͞͠ɺ͕࣌ؒͳ͍ͷͰY.jsͷWebSocketαʔόʔΛͦͷ·· ಈ͔͍ͨ͠… • ͍͑ʂ΋͏EC2ཱͯͯͦ͜ͰWebSocketͷαʔόʔஔ͖·͢ɻAPIαʔόʔ΋αΫοͱॻ͍ͯͦ ͜Ͱϗετ͠·͢ʂ => ͳΜͩ͜ΕͰ͍͍͡ΌΜ
  8. • ௿ίετ • (डୗͳͲͷ৔߹͸)௿ίετΑΓఱҪ͕ͳ͍ͱ͍͏ํ͕ྑ͍ͱݴ͏͓٬͞Μ͕͍Δ => ैྔ՝ۚͷ αʔόʔϨε͸࢖͍ʹ͍͘ • ӡ༻ෛՙͷ௿ݮ •

    ݱ୅ͷಓ۩(ίϯςφorϫϯόΠφϦͰు͘ݴޠ,tailscale΍Cloud fl are Tunnel, AWS Systems Manager etc…)Λ࢖͑͹Ͳ͏ʹ͔ͳΔ͔΋ʁ • εέʔϧΞ΢τੑೳ • ఘΊΔ😇 • CDNͰ଱͑Δʂαʔόʔ͕མͪͨΒఘΊΔ ݁ہαʔόʔϨεͰಘΒΕΔ΋ͷ͸ຊ౰ʹඞཁʁ
  9. ͡Ό͋Ͳ͜ʹσϓϩΠ͢Δʁ • ϩʔΧϧ…͸࣮༻తͰ͸ͳ͍ͷͰ • Cloud fl are Tunnel΍ngrok͸httpsͰϩʔΧϧͷʹ΋஻Εͯྑ͍ • https͡Όͳ͍ͱ࢖͑ͳ͍Webٕज़͕͋Δ(ྫ:

    Web Push) • ͦ͜Βลͷద౰ͳVPSʹσϓϩΠ͍ͨ͠ • fl y.io΍Cloud RunΈ͍ͨͳDocker PaaSͰ΋ྑ͍͔ͱࢥ͍·͢ • Ͱ΋ී௨ʹσΟεΫʹॻ͍ͯ΋ফ͑ͪΌ͏͔Βͳ… • ͱ͸͍͑ͳΜΒ͔ӬଓతͳσΟεΫ͸Ξλον͸Ͱ͖Δͱ͸ࢥ͍·͢
  10. RailsʹֶͿ • ࠷ۙͷRails͸ONCEϞσϧ͕Ͱ͖ΔΑ͏ʹSQLiteʹد͍ͤͯΔ • Solid Queue, Solid Cable, Solid Cache

    • σϓϩΠπʔϧKamal͸αʔόʔʹରͯ͠ͷϓϩϏδϣχϯάͱσϓ ϩΠΛߦ͏ • DockerίϯςφͰͷσϓϩΠ • kamal-proxy͕σϓϩΠ࣌ͷϦΫΤετܦ࿏ͷ෇͚ସ͑Λߦ͏
  11. εϥΠυॻ͍ͯͯࢥͬͨ: SQLiteͰGraceful RestartՄೳͳͷʁ • ࣮ݧ: Go + SQLiteͰॻ͍ͨΞϓϦέʔγϣϯʹabͰॻ͖ࠐΈΛܧଓ తʹߦ͍ͭͭɺGraceful Restart

    • ͦ΋ͦ΋ෳ਺ͷॻ͖ࠐΈϦΫΤετ͕ಉ࣌ʹདྷΔͱ `database is locked (5) (SQLITE_BUSY)` ͷΑ͏ʹग़ΔͷͰ`sqlite3_busy_timeout` Λઃఆ • `sqlite3_busy_timeout `ͷޮՌͰ໰୊ͳͦ͞͏
  12. ࠷ۙͷRailsͰͷSQLiteͷΦϓγϣϯ • `IMMEDIATE` τϥϯβΫγϣϯͷΦϓγϣϯͰɺτϥϯβΫγϣϯΛ ։࢝ͨ࣌͠ʹσʔλϕʔεϩοΫΛऔΔ • WAL(Write Ahead Logging): τϥϯβΫγϣϯͷ୯ҐͰҰ࣌ϑΝΠϧ

    Λ࡞ͬͯίϛοτ࣌ʹຊମʹॻ͖ࠐΉ • `sqlite3_busy_timeout` ଞͷεϨου/ϓϩηε͕ϩοΫ͍ͯ͠Δ࣌ʹ ॻ͖ࠐ΋͏ͱͨ࣌͠ʹԿඵ͔଴ͭ
  13. GoͰRailsతʹ։ൃ͢Δ • ࠷ۙ࢓ࣄͰ΍Δ࣌ʹ࠾༻͢ΔελοΫ tanukirpc + sqlla • ϑϩϯτΤϯυ͸TanStack Router +

    React + Vite • tanukirpcͱsqlla͸boilerplateͳίʔυΛgenericsͱίʔυੜ੒Ͱ࡟ݮ͢ΔΞ ϓϩʔν • Rails͸gemͱDSLͰ࡟ݮ͍ͯ͠Δ • ݸਓతʹ͸͜ͷ૊Έ߹Θ͕ͤܕ෇͖ͰϫϯόΠφϦͰు͚ΔRailsͱͯ͠ೝࣝ͠ ͍ͯΔ
  14. ະղܾͷ໰୊: σϓϩΠͨ͠Βݹ͍ΞηοτʹΞ ΫηεͰ͖ͳ͘ͳͬͨ • σϓϩΠޙʹϒϥ΢β͕อ͍࣋ͯ͠Δݹ͍index.htmlͳͲ͕ಡ΋͏ͱ͍ͯ͠Δݹ͍JS΍CSSΛಡ΋ ͏ͱͯ͠404ʹͳΔ݅ • kamal-proxyͰ͸ղܾͰ͖͍ͯΔ • υΩϡϝϯτΛಡΉͱ྆ํอ͍࣋ͯ͠ΔͬΆ͍ʁ

    • ͠͹Β͘ݹ͍΍ͭ΋࣋ͭͷ͕͍͍ΜͰ͠ΐ͏͔ • CloudFront + S3Ͱ͸Α͘΍͍ͬͯͨखஈͰ͋Δ͕… • `window.addEventListener(‘error’, …)`Ͱ`location.reload()`͢Δํ๏΋Ͱ͖ͦ͏ʁ • ΋͘͠͸Service Worker?
  15. ͦͷଞͷ࿩୊: ingress௨৴ • ϙʔτ22൪Λ։͚Δͷ͸͔ͳΓݏ • tailscaleಥͬࠐΜͰຊ෺sshd͸࢖ΘͣʹTailscaleܦ༝ͰϩάΠϯ͍ͯ͠Δ • ͋ͱ͸ufwͰtailscaleҎ֎͔Βͷ֎͔Βͷ௨৴Λશ෦࠹͙ • 443൪։͚ͨ͘ͳ͍

    • ͦΜͳ࣌ʹ࢖͑Δͷ͕Cloud fl are Tunnel • cloud fl aredΛཱͯͯɺCloud fl areͰड͚ͨϦΫΤετΛτϯωϧܦ༝Ͱड͚Δ • cloud fl ared͸egressͷ௨৴͔͠͠ͳ͍ͷͰϙʔτ͸։͚Δඞཁ͕ͳ͍
  16. ͞Βʹͦͷଞ • daemonize • ੲ͸supervisordͱ͔daemontoolsͱ͔͚͋ͬͨΕͲࠓ͸systemdͰ͍͍ͱࢥ͏Α • cron • systemdͰ͍͍ͱࢥ͏Α •

    ٖࣅcronϫʔΧʔΛgoroutineͰཱͯΔͷ͸͋Γ • ϩά • systemdͰ͍͍ͱࢥ͏Α • ݕࡧ౳Ͱू໿͕ཉ͔ͬͨ͠ΒS3ͱ͔ʹͳΜΒ͔ϩάίϨΫλͰඈ͹͢ͷ͕͍͍ΜͰ͔͢Ͷ͑ • ؂ࢹ • Mackerelͱ͔NewRelicͱ͔ • ࣗલmisskeyαʔόʔ͸NewRelicೖΕͯΔ • ϓϩϏδϣχϯά • mitamae͔ͳ͋ systemdͷunitϑΝΠϧΛಥͬࠐΉͷࣗ࡞ͯ͠΋͔͑͑΋͠ΕΜ