$30 off During Our Annual Pro Sale. View Details »

デプロイ今昔物語 〜CGIからサーバーレスまで〜 / The deployment technics

mackee
March 19, 2023

デプロイ今昔物語 〜CGIからサーバーレスまで〜 / The deployment technics

YAPC::Kyoto 2023

mackee

March 19, 2023
Tweet

More Decks by mackee

Other Decks in Programming

Transcript

  1. σϓϩΠࠓੲ෺ޠ
    ʙCGI͔ΒαʔόʔϨε·Ͱʙ
    @mackee_w a.k.a macopy

    View Slide

  2. ࿩͢಺༰

    View Slide

  3. σϓϩΠ

    View Slide

  4. @macopy
    • ໘ന๏ਓΧϠοΫ eεϙʔπࣄۀ෦
    TonamelαʔόαΠυςοΫϦʔυ


    • Perlେ޷͖ Go΋޷͖


    • GGST࢖༻Ωϟϥ: ϥϜϨβϧ


    • ISUCON11 ༏উ / ISUCON12 ग़୊

    View Slide

  5. [AD] Tonamel

    View Slide

  6. [AD] Tonamel
    ࠓճͷτʔΫͰ঺հ͢Δ


    ʮσϓϩΠʯͰ͍͏ͱ


    Tonamel͸


    ʮPullܕσϓϩΠʯ͔ͭ
    ʮDockerʯͰ͢

    View Slide

  7. ͜ͷτʔΫʹ͓͚ΔʮσϓϩΠʯͷൣғ
    • WebΞϓϦέʔγϣϯΛ։ൃͨ͠ޙ͔ΒɺϢʔβʔ͕ϒϥ΢βͰݟΔ
    ·Ͱʹඞཁͳٕज़܈


    • ʮσϦόϦʔʯͱ΋ݴ͏


    • ྫ:


    • αʔόʔ΁ͷϓϩάϥϜͷ൓өํ๏


    • αʔόʔϓϩάϥϜͷϗεςΟϯάํ๏

    View Slide

  8. !DISCLAIMER!


    ͜ͷτʔΫͰ͸ҟͳΔϨΠϠʔͷ֓೦͕ަޓ
    ʹग़͖ͯͨΓࠞͬͨ͟Γͯ͠࿩͞Ε·͢


    ॱ൪͸֓Ͷ࣌ܥྻͰͷొ৔ॱͰ͕͢ɺ঺հ͢
    ΔτϐοΫ͸ొஃऀͷڵຯͰܾΊ͍ͯ·͢

    View Slide

  9. ͜ͷτʔΫͷਐΊํ
    • ҎԼͷΛҰͭͷσϓϩΠٕज़ʹରͯ͠࿩͍͖ͯ͠·͢


    •ख๏ͷղઆ


    •࣌୅എܠ


    •࣮ફ

    View Slide

  10. ͜ͷτʔΫͷਐΊํ
    • ҎԼͷΛҰͭͷσϓϩΠٕज़ʹରͯ͠࿩͍͖ͯ͠·͢


    •ख๏ͷղઆ => Ͳ͏͍͏࢓૊Έͳͷ͔


    •ొ৔എܠ => ੜ·ΕͨܦҢ


    •࣮ફ => ΍ͬͯΈΑ͏ɺମݧͯ͠ΈΑ͏

    View Slide

  11. !DISCLAIMER! ͦͷ2


    σϞʹ͸౰࣌࢖ΘΕ͍ͯͨιϑτ΢ΣΞ
    (όʔδϣϯ)͸࢖͍ͬͯ·ͤΜʂʂʂ


    ࠓݱࡏೖखͰ͖Δ΋ͷΛ࢖͍ͬͯ·͢

    View Slide

  12. ొ৔͢Διϑτ΢ΣΞ΍؀ڥ
    • Perl 5.32.1(system perl), Perl 5.36.0


    • Apache 2.4.54


    • mod_perl 2.0.11


    • Debian 11 bullseye


    • ݕূ؀ڥͱ͜ͷϚγϯؒ͸tailscaleͰVPNΛு͍ͬͯ·͢

    View Slide

  13. Are you
    ready?

    View Slide

  14. CGI

    View Slide

  15. CGIͷख๏

    View Slide

  16. CGIͷొ৔എܠ
    • 1993೥ʹఏҊ͞Εͨ࢓༷ ͜ͷ࣌ͷόʔδϣϯ͸1.0


    • NCSA httpdʹhtbinͱ͍͏ػೳ͕͕͋ͬͨɺଞͷαʔόʔͰ΋࢖͑
    ΔΑ͏ʹ”Common”ͳ࢓༷͕ߟ͑ΒΕͨ


    • ౰࣌͸HTML΋ࡦఆ్্ͰɺWebΛऔΓר͘πʔϧνΣΠϯ͕ੜ·Ε
    Δᴈ໌ظͱ͍ͬͨײ͡

    View Slide

  17. ʮϨϯλϧαʔόʔʯ
    ※ҰྫͰ͢

    View Slide

  18. ࣮ફ: PerlͷCGIϓϩάϥϜΛσϓϩΠ

    View Slide

  19. ඪ४ετϦʔϜͱ؀ڥม਺͕͋Ε͹ͳΜͰ΋͓k
    • ϓϩάϥϛϯάݴޠඇґଘͰ͋Δ


    • PerlͰCGI͸͋·Γʹ΋͋Γ͖ͨΓͰ͸


    • ͔ͤͬ͘ݴޠඇґଘͳͷʹ͜ͷσϞͰ͸ͭ·Μͳ͍Ͱ͢ΑͶʁ

    View Slide

  20. ࣮ફ: jqͰCGIϓϩάϥϜΛ


    ॻ͍ͯσϓϩΠ

    View Slide

  21. CGIͷσϝϦοτ
    • ϓϩηεىಈͷίετ͕ॏ͍


    • ϦΫΤετͷͨͼʹϓϩηεΛىಈ͠ऴྃ͢Δ͜ͱʹͳΔ


    • PerlͷΑ͏ͳLLͰ͸ϞδϡʔϧͷಡΈࠐΈ͕౎౓ൃੜ͢Δ͜ͱʹ


    • ੲ͸`use`Ͱ͸ͳ͘`require`Λ࢖ͬͨDynamic Loading͕ଟ༻͞Ε
    ͍ͯͨͷ΋ͦͷ͍ͤͩͱฉ͍͍ͯ·͢

    View Slide

  22. ੩తΤϯυϙΠϯτͷϕϯνϚʔΫ

    View Slide

  23. CGIͷϕϯνϚʔΫ

    View Slide

  24. mod_perl

    View Slide

  25. mod_perlͷख๏

    View Slide

  26. mod_perlͷొ৔എܠ
    • 1996೥ʹmod_perl, 2002೥ʹmod_perl2͕ϦϦʔε


    • Apacheͷػೳ֦ுΛPerlͰߦ͏Ϟδϡʔϧ


    • Ͱ͸͋Δ͕CGIϓϩάϥϜΛͦͷ··ޮ཰Α͘ಈ͔ͨ͢Ίʹ࢖ΘΕͨ


    • `ModPerl::Registry`౳ͷHandlerΛ࢖͑͹CGIͱͷޓ׵ੑΛอͬͨ··࢖͑Δ


    • άϩʔόϧม਺ͷण໋͕ϦΫΤετ୯ҐͰͳ͘ͳͬͨ


    • ཪΛฦͤ͹ϦΫΤετ୯ҐͰ͋ΔલఏͷCGIϓϩάϥϜ͸ͦͷ··Ͱ͸ಈ͔ͳ͍

    View Slide

  27. ࣮ફ: PerͷCGIϓϩάϥϜΛ
    mod_perlͰಈ͔͢

    View Slide

  28. ྨࣅ඼
    • mod_mruby, mod_lua etc…


    • Perlͷ෦෼Λผͷݴޠʹஔ͖׵͑ͨApacheͷϞδϡʔϧ


    • ngx_http_perl_module


    • nginxʹPerlΛ૊ΈࠐΜͰϦΫΤετॲཧͤ͞ΔϞδϡʔϧ

    View Slide

  29. FastCGI

    View Slide

  30. FastCGIͷख๏

    View Slide

  31. FastCGIͷొ৔എܠ
    • 1996೥ʹఏএ͞Εͨ


    • mod_perlͷ༻్ͱಉ͘͡ʮCGIϓϩάϥϜͷߴ଎Խʯ


    • ҰํͰɺmod_perlͱ͸ҧ͍ݴޠඇґଘΛ໨ࢦͨ͠


    • ׬શͳdrop-in replacement͸Ͱ͖ͳ͍͕ɺηϚϯςΟΫε͸CGI͔Β
    Ҿ͖ܧ͍Ͱ͍Δ


    • 1ͭͷίωΫγϣϯͰϦΫΤετͷଟॏԽ΋͞Ε͍ͯΔ

    View Slide

  32. ࣮ફ: PerlͷFastCGI޲͚ϓϩάϥϜΛ
    ಈ͔͢

    View Slide

  33. FastCGIͷྨࣅ඼
    • SpeedyCGI/PersistentPerl


    • CGIϓϩηεΛӬଓԽͯ͠ར༻͢Δվ଄͞ΕͨperlΠϯλϓϦλΛ
    ༻͍Δ


    • #!/usr/bin/speedy ʹshebangΛஔ͖׵͑Δͱར༻Ͱ͖Δ


    • ApacheͱSpeedyCGIؒ͸CGIͱಉ༷ඪ४ετϦʔϜ+؀ڥม਺

    View Slide

  34. PSGI

    View Slide

  35. PSGIͷొ৔എܠ
    • 2009೥ʹspec͕CPANʹshipit͞Εͨ


    • WebϑϨʔϜϫʔΫͷ࣌୅ʹͳ͍͕ͬͯͨɺWebϑϨʔϜϫʔΫ͕ͦΕ
    ͧΕɺCGI΍FastCGIɺmod_perl޲͚ͷରԠΛߦͳ͍ͬͯͨ…


    • ͦ͜ͰWebΞϓϦͷೖग़ྗΛந৅Խͨ͠ΠϯλʔϑΣΠεΛ༻ҙͯ͠
    (=PSGI)ͦͷΠϯλʔϑΣΠεΛѻ͍΍ͨ͘͢͠ϥΠϒϥϦ(=Plack)Λ༻
    ҙͯ͠ɺPlack::Handlerͱͯ͠CGI΍mod_perlͷϋϯυϥ͕࣮૷͞Εͨ

    View Slide

  36. PSGIͷొ৔എܠ ͦͷ2
    • ҰํͰϓϩάϥϛϯάݴޠϥϯλΠϜࣗମͰHTTPαʔόʔΛಈ͔͢Α
    ͏ʹͳͬͨ


    • ”ϦόʔεϓϩΩγ”ͱ͍͏֓೦͕ҰൠతʹͳΓ࢝Ίͨ


    • lighttpd, nginx etc…


    • Plack::Handlerͱͯ͠Starman΍Starletͱ͍ͬͨPreforkܕͷHTTPαʔ
    όʔ͕࣮૷͞Εͯ޿͘࢖ΘΕΔΑ͏ʹͳͬͨ

    View Slide

  37. Plack/PSGIͷख๏

    View Slide

  38. ࣮ફ: ੜPSGIΛॻ͍ͯΈͨ

    View Slide

  39. PSGIͷྨࣅ඼
    • Java Servelet API


    • WSGI (Python)


    • Rack (Ruby)


    • ͜ͷॱ൪Ͱspecʹݴٴ͕͋Δ


    • PSGIʹ͸WSGIͱRackͱ”JSGI”ʹݴٴ͕͋Δ

    View Slide

  40. Plackͷྨࣅ඼(ΠϯλʔϑΣΠεࢹ఺)
    • ઌ૆ͨͪ


    • CGI.pm


    • CGI::Application


    • Apache::Request


    • HTTP::Engine


    • Catalyst::Engine

    View Slide

  41. ͜Ε·Ͱ͸ΞʔΩςΫνϟ΍


    ϓϩάϥϛϯάΠϯλʔϑΣΠεΛ


    த৺ʹ͝঺հ

    View Slide

  42. ͔͜͜Β͸αʔόʔ΁ͷ


    ൓өํ๏ʹ͍ͭͯ͝঺հ

    View Slide

  43. FTP

    View Slide

  44. CGI/mode_perl/FastCGIͰ͸FTPΛ
    ࢖ͬͯσϓϩΠ͍ͯͨ͠ͷͰলུ
    ※2023೥࣌఺ͷҙݟͰ͢

    View Slide

  45. Pushܕ


    σϓϩΠ

    View Slide

  46. PushܕσϓϩΠͷख๏

    View Slide

  47. ࣮ફ: PSGIΞϓϦΛ


    PushܕσϓϩΠ͢Δ

    View Slide

  48. PushܕσϓϩΠͷ೉

    • αʔόʔ୆਺͕େ͖͘ͳΓ࢝Ίͨ


    • Push͢ΔଆͷϦιʔεͷ཯଎ͯ͠
    σϓϩΠ଎౓͕஗͘ͳΔ


    • ύϒϦοΫΫϥ΢υͷීٴͰΦʔ
    τεέʔϧ͢ΔΑ͏ʹͳ͕ͬͨɺ
    ͦͷ৔߹ͷ৯͍߹Θ͕ͤѱ͍

    View Slide

  49. Pullܕ


    σϓϩΠ

    View Slide

  50. PullܕσϓϩΠͷख๏

    View Slide

  51. ࣮ફ: stretcherΛ༻͍ͨ


    PushܕσϓϩΠ

    View Slide

  52. ΞʔΩςΫνϟͷ঺հʹ໭Δ

    View Slide

  53. Docker

    View Slide

  54. DockerΛ࢖ͬͨσϓϩΠͷख๏

    View Slide

  55. ࣮ફ: Docker SwarmΛ༻͍ͨ


    DockerͷσϓϩΠ

    View Slide

  56. Dockerͷొ৔എܠ
    • Dockerͷൃද͸2013೥


    • PullܕσϓϩΠ


    • ʮίϯςφʯͱ͍͏ܗͰWebΞϓϦέʔγϣϯΛϥϯλΠϜ͝ͱ
    packͯ͠σϓϩΠ͢Δख๏


    • ʮσϓϩΠʯͷର৅͕ΞϓϦέʔγϣϯϓϩάϥϜʹՃ͑ͯϥϯ
    λΠϜ·Ͱ޿͕ͬͨ

    View Slide

  57. Serverless

    View Slide

  58. LambdaΛ༻͍ͨαʔόʔϨεͷख๏

    View Slide

  59. ࣮ફ: lambrollΛ༻͍ͨ


    Perl WebΞϓϦέʔγϣϯͷσϓϩΠ

    View Slide

  60. Serverless/FaaSͷొ৔എܠ
    • ΞϓϦέʔγϣϯ੍࡞ऀ͕௚઀؅ཧ͢Δର৅͕࣌୅Λ௥͏͝ͱʹϨΠ
    Ϡʔ্͕΁ͱ্͕͍͍ͬͯͬͯͨ


    • ෺ཧαʔόʔ, Ծ૝αʔόʔ, IaaS, ίϯςφ


    • ϥϯλΠϜ΍ϓϩηεͷϥΠϑαΠΫϧ·ͰΫϥ΢υࣄۀऀʹ͓ئ͍
    ͯ͠͠·͏ͷ͕Serverless


    • Ϩϯλϧαʔόʔ/CGI΁ͷճؼ, ΑΓޮ཰Խ͞Εͨ΋ͷ

    View Slide

  61. Serverless/FaaSͷྨࣅ඼
    • PaaS


    • Heroku, Elastic Beanstalk, AppEngine(Flexible Environment)…


    • ϥϯλΠϜͷ੹຿͸Ϋϥ΢υࣄۀऀ


    • ͨͩ͠αʔόʔతଘࡏ͸࣮֬ʹײ͡Δ, εέʔϦϯάઃఆͳͲ

    View Slide

  62. ͍͔͕Ͱͨ͠Ͱ͠ΐ͏͔

    View Slide

  63. ొஃऀͷײ૝
    • σϓϩΠٕज़͸લʹ࢖ΘΕٕͨज़ͷ՝୊Λղফ͢ΔͨΊʹੜ·Ε͖ͯͨ


    • ࢼߦࡨޡͷ݁Ռࠓ͕͋Δɻͭ·Γ “try/catch” Ͱ͢Ͷ


    • ͦΕ͸ͦΕͱͯ͠ɺੲͷٕज़Ͱ΋ݟͲ͜Ζ͸͋Δ


    • CGI͕ಈ͘Ϩϯλϧαʔόʔ͸FaaSͱݴ͑Δ


    • ੲΑΓ΋WebΞϓϦέʔγϣϯ͕ղ͜͏ͱ͢Δ՝୊͕ෳࡶʹͳ͍ͬͯΔ
    ͷͰɺ؅ཧํ๏ͷҰͭͰ͋ΔʮσϓϩΠʯ΋ෳࡶʹͳΔ܏޲

    View Slide

  64. ͋ͳͨͷ޷͖ͳ


    ʮσϓϩΠʯ͸


    ͋Γ·͔ͨ͠ʁ

    View Slide

  65. ࠙਌ձͱ͔࿓ԼͰ࿩ͯ͠ཉ͍͠࿩୊
    • 2000೥ΑΓલͷJavaͱ͔͸Ͳ͏΍ͬͯσϓϩΠ͍ͯͨ͠ͷ͔ʁ


    • warͰݻΊͯΛFTPͰυʔϯ͍ͯͨ͠, TomcatͰͱ͍͏࿩୊͕͋Γ·͢ɻ༗ࣝऀ
    ͷํʑͲ͏ͧ


    • ASPͱ͔IISͱ͔Windows Server


    • mod_perl͔FastCGIͲͪΒΛ࢖͍͔ͬͯͨ


    • ͓͢͢ΊͷϨϯλϧαʔόʔ


    • ొஃऀ͸XREAΛ࢖͍ͬͯ·ͨ͠

    View Slide

  66. ࠙਌ձͱ͔࿓ԼͰ࿩ͯ͠ཉ͍͠࿩୊ ͦͷ2
    • ϩʔϦϯάϦελʔτ, ϒϧʔάϦʔϯσϓϩΠ


    • graceful restart


    • PullܕσϓϩΠ+graceful restart͸σϓϩΠ͕ΊͪΌΊͪΌ଎͔ͬͨ


    • ΠϯϑϥͷઃఆσϓϩΠͱΞϓϦέʔγϣϯͷσϓϩΠͷڥ໨

    View Slide