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

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

Avatar for mackee mackee
May 31, 2025

 ワンバイナリ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ϑΝΠϧΛಥͬࠐΉͷࣗ࡞ͯ͠΋͔͑͑΋͠ΕΜ