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

Universal Application にありがちな LB ガチャ問題を解消する #awswakaran_tokyo / Resolve LB mistake in Universal Application

Universal Application にありがちな LB ガチャ問題を解消する #awswakaran_tokyo / Resolve LB mistake in Universal Application

2019年07月22日に #awswakaran_tokyo でのセッションスライドです。

More Decks by potato4d(Hanatani Takuma)

Other Decks in Technology

Transcript

  1. Profile • Takuma HANATANI (@potato4d) • ͱ͋ΔձࣾͷϑϩϯτΤϯυΤϯδχΞ & ݸਓࣄۀओ •

    Co-Organizer at UIT / awswakaran.tokyo • Πϯϑϥࣄ৘ • αʔόʔϨεपΓͷ AWS ͱ Firebase ͕͖͢ • GCP΋৮Βͳ͍͜ͱ͸ͳ͍͚ͲΑ͘Θ͔ΒΜ • ຊۀͷձࣾ͸ࣗࣾϓϥΠϕʔτΫϥ΢υ • ڏແΤϐιʔυɿݖݶͷ౎߹Ͱ Cloud Formation ͕࣮ߦͰ͖ͣ Skype Ͱ ૬खͷϚωίϯͷ༷ࢠΛฉ͖ͳ͕ΒΠϯϑϥΛߏஙͨ͜͠ͱ͕͋Δ
  2. ࠓ೔࿩͢͜ͱ 1. SPA ͱ SSRɺ Universal Application ͷ͓͞Β͍ 2. Universal

    Application ॳ৺ऀ͕΍Γ͕ͪͳΠϯϑϥߏ੒ 3. ॳ৺ऀ͕΍Γ͕ͪͳΠϯϑϥߏ੒ʹ͓͚Δ LB Ψνϟͷ໰୊ͷ঺հ 4. LB ΨνϟΛҾ͔ͳ͍ͨΊͷߏஙྫͷ͝঺հ
  3. Single Page Application • HTML / CSS / JavaScript ͷΈͰϑϩϯτΤϯυͷ

    Web UI ΛऔΓѻ͏ٕज़ͷ ૯শ • ͬ͘͟Γ͍͏ͱΞϓϦέʔγϣϯαʔόʔ͕ HTML ͡Όͳͯ͘ JSON Λฦ͢ ੈք؍ʹ͓͚ΔϑϩϯτΤϯυ • શ෦ ΫϥΠΞϯτͷ JS Ͱඳը͢ΔͷͰΞΫηε࣌͸͔Βͷ div ͚ͩͷੈք؍ • Πϯϑϥతʹ͍͏ͱϑϩϯτΤϯυʹίϯϐϡʔςΟϯάϦιʔεΛ࢖Θͳ͍ ͷ͕ಛ௃
  4. Universal Application (SSR/SPA) • SPA ͕ΫϥΠΞϯταΠυͰߦ͏ JavaScript ͷίʔυΛͦͷ··αʔόʔଆ࣮ ߦ͠ɺ݁Ռͷ HTML

    Λαʔόʔ͔Βฦ٫͢Δɻ͚ͲҰճ HTML Λฦ٫ͨ͠Βͦ ͷޙ͸ JS ΛಡΈࠐΜͰ SPA ͱͯ͠ಈ͘ • ຊจ͕ͦͷ··ϨϯμϦϯά͞ΕͨΓ OGP Λಈతʹੜ੒Ͱ͖ͨΓɺSEO/ιʔ γϟϧจ຺Ͱ΋ॏๅ͞ΕΔ΄͔ɺύϑΥʔϚϯε؍఺Ͱ΋࠾༻͞ΕΔ • ࠷ۙ͸ Nuxt.js ͱ͔ Next.js ͱ͔ΦʔϧΠϯϫϯͳϑϨʔϜϫʔΫ͕ग़ͨ͜ͱʹ ΑͬͯɺͱΓ͋͑ͣ Universal ʹ͕ͨ͠Δਓ΋૿͖͍͑ͯͯΔ
  5. ੩త഑৴ϨΠϠͰࠔΔ͜ͱ • CloudFront Ͱ഑৴͞Ε͍ͯͳ͍৔߹ • ੩తϑΝΠϧͷͨΊʹαʔόʔ͕૿͑ΔՄೳੑ༗Γ • S3 Ͱ഑৴͞Ε͍ͯͳ͍৔߹ •

    ಺෦తʹ࢖ΘΕ͍ͯΔ Node.js ͷϑΝΠϧ I/O ͳͲʹྑ͘ͳ͍఺͕͋ Δ৔߹ʹͦͷ··ίϯϐϡʔςΟϯάʹͭͳ͕ͬͯ͠·͏
  6. ੩త഑৴ϨΠϠͰࠔΔ͜ͱ • ͳʹΑΓ LB ΍ɺ୯ҰΠϯελϯεͰ΋λΠϛϯά࣍ୈͰΨνϟ͕ى͜Δ • CloudFront ͕લஈʹ͋Δ৔߹ɺSSR ࣌ʹچΠϯελϯεΛҾ͘෼ʹ͸໰୊ͳ͍ •

    چϦιʔε͸ CDN ʹ͋ΔͷͰ৽ΠϯελϯεʹΞΫηεͯ͠΋໰୊ͳ͠ • SSR ʹ৽ΠϯελϯεΛҾ͍ͨ৔߹ʹ໰୊͕ੜ͡Δ • CDN ʹ৐ͬͯͳ͍ JS ϑΝΠϧΛچΠϯελϯεʹಡΈʹߦͬͯ 404 • چ (HTML) → ৽(JS) ͱಡΈʹߦͬͨ৔߹Ͱ֬཰ͰΤϥʔͱͳΔ
  7. ΍Δ΂͖͜ͱ • Node αʔόʔͰ͸੩తϑΝΠϧ഑৴ΛߦΘͳ͍ • ඞͣ S3 ʹΞοϓϩʔυ͢Δ • S3

    ʹ੾Γग़͞ͳ͍ߏ੒Λ࡞Δਓ͸ CF ͷΩϟογϡΛૢΕͳ͍͜ͱ΋ߟྀ • ͨͱ͑͹੾Γग़ͨ͠Β SSR αʔόʔ͸ s-max-age 0 Ͱ΋ྑ͍ • ϏϧυϑΣʔζͱσϓϩΠϑΣʔζΛ෼͚ͯॱ൪ʹߦ͏ • ϏϧυϑΣʔζͰ S3 ʹΞοϓϩʔυͯ͠ΨνϟΛ๷͍Ͱ͔ΒσϓϩΠ͢Δ
  8. ͦͷଞΠϯϑϥվળ఺ • VPC Θ͚ͯΔͷԿɺ API call ͷ࣌ʹ֎ग़ΔͷԿ • ׬શڞ௨ίʔυͰઃఆͨ͠৔߹͸େମ͜͏ͳ͍͕ͬͯͪ •

    ϑϨʔϜϫʔΫଆͰ࢖͏ baseURL Λ੾Γସ͑ΒΕΔ΋ͷ΋͋Δ • e.g.) https://axios.nuxtjs.org/options#browserbaseurl • Unix socket Ͱ΋ͳ͍ݶΓ͋Μ·Γ࢖ΘΕͳ͍
  9. ͦͷଞΠϯϑϥվળ఺ • LB Ψνϟࣗମ͸ sticky session Ͱ΋ղܾՄೳʁ • εϥΠυ४උதʹ Twitter

    Ͱͪΐ͏Ͳ͋ͬͨ࿩ • ࢖͑Δঢ়ଶ(ྫ͑͹ ELB ʹ΋͋Δ)Ͱ͋Ε͹࢖͑͹͜Εࣗମ͸ղܾՄೳ • NGINX ࢖ͬͯ·͢ݟ͍ͨ৔߹͸ϞδϡʔϧೖΕΔͱͦΕ͚ͩͰར༻Մೳ • ͱ͸͍͑લड़ͷ੩తϑΝΠϧΞΫηεͷͨΊʹ Node αʔόʔʹૄ௨ͯ͠ ͠·͏݅͸ղܾ͠ͳ͍ͷͰผ్ରԠ͕ඞཁ
  10. ͦͷଞΠϯϑϥվળ఺ • ͦͷଞߟ͑Δ͜ͱɺ࣮ࡍͷ΍Γํ͸ʁ • GitHub master ΁ͷ push ܖػͰͷ Code

    Build -> S3 Ξοϓϩʔυ → ECS / EB ͱ͔͕ݱ࣮తͳϑϩʔʹ(গ͠खؒ) • Universal Application ͷ৔߹ϛεΔͱ HTML ʹϢʔβʔ৘ใ͕৐Δͷ ͰɺΞηοτΛ֎ʹಀ͕ͨ͠Β͍ͬͦ s-max-age=0 Ͱ΋ྑ͍(࠶ܝ)
  11. ఻͍͑ͨ͜ͱ 1. Universal Application ͸͋͘·Ͱ΋ SPA ͷԆ௕ͱߟ͑Α͏ 2. ࡶͳ CD

    ؀ڥ͸ߏங͠΍ͯ͘͢ࡶ͚ͩͲසൟͳσϓϩΠΛߦ͏৔߹΍ Ϣʔβʔ਺͕૿͑ͯ͘Δͱ໰୊ʹͳΔͷͰվળ͠Α͏
  12. ఻͍͑ͨ͜ͱ 1. Universal Application ͸͋͘·Ͱ΋ SPA ͷԆ௕ͱߟ͑Α͏ 2. ࡶͳ CD

    ؀ڥ͸ߏங͠΍ͯ͘͢ࡶ͚ͩͲසൟͳσϓϩΠΛߦ͏৔߹΍ Ϣʔβʔ਺͕૿͑ͯ͘Δͱ໰୊ʹͳΔͷͰվળ͠Α͏ 3. ϑϩϯτΤϯυΤϯδχΞ͔ΒʮNuxt.js ΍ Next.js Ͱ SSR ΍Γͨ ͍ʯͱ͍͏ཁ๬͕དྷͨ৔߹ɺNode αʔόʔͰ͋Δ͜ͱ(=ηΩϡϦ ςΟ΍ෛՙ)͚ͩʹ஫ҙ͕޲͍͍ͯΔՄೳੑ͕͋ΔͷͰ஫ҙ͠Α͏