Ruby Business Users Conference 2018 2018-02-23 (Fri) 14:00 - 17:00
http://www.ruby.or.jp/rbuc2018/ https://rubyassociation.doorkeeper.jp/events/69247
esa.ioͷҭͯํ2018/02/23esa LLC ਂ୩ಞੜ
View Slide
2• ߹ಉձࣾ esa• ߹ܭ3໊• ΤϯδχΞ2໊• σβΠφʔ1໊• શһ͕ίʔυΛॻ͘• શһ͕ձࣾද• ۀ4
esa LLC͕͍ͬͯΔ͜ͱ• esa.ioͷ։ൃɾӡӦ (ࠓͷຊ)• pplog.netͷ։ൃɾӡӦ• ଞͷձࣾͷ։ൃσβΠϯͷ͓ख͍3
esa LLC͕Βͳ͍͜ͱ• αʔϏεձࣾͷٸܹͳࢦ͞ͳ͍• ࢿड͚ͳ͍• (ۜߦ͔Βগֹͷ༥ࢿड͚ͨ͜ͱ͕͋Δ)• Web ࠂग़͞ͳ͍4
esa.ioͱ?5
6
7• ݱࡏɺ2,200νʔϜ͕ར༻த• ITاۀΛத৺ͱͨ͠ձࣾɾஂମɾݸਓʢن: 1ਓʙ300ਓఔʣ• ΤϯδχΞɾσβΠφʔΛத৺ʹɺاըɾӦۀ৬ɾࣄܥͷํར༻• ݸਓ͝ՈఉɺେֶͷݚڀࣨɺझຯͷஂମଟUserAbout esa.io• MarkdownܗࣜͰॻ͚ΔɺνʔϜͷͨΊͷใڞ༗πʔϧ• ใɾٞࣄɾϝϞɾΞΠσΞɾ༷ॻɾاըॻɺνʔϜͰͷυΩϡϝϯτڞ༗Ͱར༻
8• ݱࡏɺ2,000νʔϜҎ্͕༗ྉར༻• ITاۀΛத৺ͱͨ͠ձࣾɾஂମɾݸਓʢن: 1ਓʙ300ਓఔʣ• ΤϯδχΞɾσβΠφʔΛத৺ʹɺاըɾӦۀ৬ɾࣄܥͷํར༻• ݸਓ͝ՈఉɺझຯͷஂମଟUserConcept: ใΛɺҭ͍ͯͨɻ• υΩϡϝϯτ࠷ॳ͔ΒᘳͰͳ͘ɺ࣌ؒΛ͔͚ͯΑ͍ͷʹҭ͍ͬͯ͘• ݸਓ͕ΏΔ͍ΞΠσΞΛग़͘͢͠ɺΈΜͳͰܧଓతʹվળ͍͢͠Έ• ্͔Βͷԡ͚͠Ͱͳ͘ϘτϜΞοϓͰࣗൃతʹใൃ৴͢ΔΑ͏ʹͳΔ͜ͱ͕ɺΑΓ͍͖͍͖ͱͨࣗ͠తͳνʔϜͮ͘Γʹͭͳ͕Δ
2014ͷ5݄͋Δ։ൃऀίϛϡχςΟͷझຯ։ൃ߹॓Ͱੜ9
10↓ਖ਼ࣜެ։↑୯ମͰࠇࣈԽ࠶ࠇࣈԽˣࣾһ͕1໊૿Ճˣ
ॳͷඪͰ͋ͬͨʮesa ͷऩӹ͚ͩͰձࣾΛܦӦͰ͖ΔʯΛୡ11
ࠓ͓͍ͨ͜͠ͱ• esaΛগਓͰ։ൃɾӡӦ͍ͯͨ͘͠ΊʹɺͲͷΑ͏ͳٕज़ɾઓུPaaS/SaaSͷྗΛआΓ͖͔ͯͨΛ࣮ྫΛަ͑ͯհ• झຯͰ࡞Γ࢝ΊͨWebαʔϏε͕ͲͷΑ͏ʹͯ͠Ϗδωεͱཱͯ͢͠ΔΑ͏ʹͳ͔ͬͨ12
ࠓ͓͍ͨ͜͠ͱ• [x] esaͱesa LLC ʹ͍ͭͯ (5)• [ ] esaͷγεςϜߏ (10)• [ ] esaͷػೳ͝ͱͷ࣮ํ๏ (15)• [ ] esaͷϢʔβʔαϙʔτ (5)• [ ] esaͱϞνϕʔγϣϯ (5)13
࣮͜ͷൃදΔͼ·0052߸ (2015-12)͕ϕʔεͰ͢14magazine.rubyist.net/?0052-esaio
esaͷγεςϜߏ15
جຊతͳઓུ• ࠷৽ͷRuby/RailsΛ͏• 2018/02/16࣌ͰRuby 2.5.0 / Rails 5.1.5• ຖɺࣗಈͰBundle Update͢Δ• ܧଓతʹͬͨ΄͏͕݁Ռతʹָ• ։ൃͷϦζϜʹͳΔ16
2014 ~ 2016• Heroku (US region)• 2X dyno Λ 2~5ݸ• ؒٳʹdynoΛগͳͯ͘͠અ• ϦϦʔε͔Β2ऑͷؒΠϯϑϥʹ͍ͭͯ·͞ΕΔ͜ͱ͕গͳͯ͘ຊʹॿ͔ͬͨ17
2014 ~ 2016• Heroku (US region)• ຊ֨తʹར༻͞ΕΔʹͭΕɺϨΠςϯγ͕ਏ͘ͳ͖ͬͯͨ• Enterpriseܖ͢ΕTokyo region͑ͦ͏͕ͩͬͨɺྉۚతʹஅ೦18
ΠϯϑϥେҾͬӽ͠19docs.esa.io/posts/179
Ҡߦޙͷߏ20
Ҡߦޙͷߏ• AWS ECS (Tokyo region)• Railsίϯςφ x 4ɺSidekiqίϯςφ x 1• db:migrate࣌ʹຖճ৽نʹίϯςφΛىಈˠഇغ21
Ҡߦޙͷߏ• AWS ECS (Tokyo region)• ϖʔδͷද͕ࣔ1/2 ~ 1/3ఔ·Ͱվળ• Ͱ͖Δ͚ͩHeroku࣌ͱಉ͡Α͏ͳ։ൃ͕ଓ͚ΒΕΔΑ͏ʹ• masterϚʔδͰࣗಈσϓϩΠ• ίϯςφͷ͕ҰఆʹอͨΕΔ22
֤ίϯςφʹ͍ͭͯ• Rails / Sidekiq ίϯςφ (2016/03 ~)• PlantUML ίϯςφ (2016/10 ~)• ܾࡁܥίϯςφ (2017/02 ~)23
Rails / Sidekiq ίϯςφ• ී௨ͷRails / Sidekiq app• ݩʑHeroku্Ͱಈ͍͍ͯͨesa.ioͷຊମ• ಉ͡Docker ImageͰىಈΦϓγϣϯͰweb/workerΛΓସ͑• ಈ͍͍ͯΔίϯςφRails: 4ɺSidekiq: 124
PlantUML ίϯςφ25
PlantUML ίϯςφ26• PlantUMLJava• Javaͷαʔόͷϝϯςͨ͘͠ͳ͍ɻɻɻ• JRuby + Sinatra + PumaͰ࣮• ςΩετΛड͚औͬͯsvgΛฦ͚ͩ͢• ։ൃ։͔࢝Β1ఔͰϦϦʔε
ܾࡁܥίϯςφ• ܾࡁߦαʔϏεΛWebPay͔ΒPAY.JPʹΓସ͑ΔλΠϛϯάͰΧʔυొը໘ΛผγεςϜʹΓ͚• ܾࡁߦαʔϏε͕ఏڙ͢ΔJSϥΠϒϥϦΛ͏͜ͱͰɺݩʑesaͷαʔόʹΧʔυใ͕Βͳ͍Α͏ʹͳ͍ͬͯΔ͕ɺผυϝΠϯɾผγεςϜԽ͢Δ͜ͱʹΑͬͯߋʹηΩϡΞʹ͢Δ͜ͱ͕ૂ͍27
ܾࡁܥίϯςφ• Ruby + Sinatra + PumaͰ࣮• ͳͥSinatra?• DBΞΫηε͕ͳ͍• ը໘͕গͳ͍28
γεςϜߏ·ͱΊ• ॳखHerokuTwelve-Factor AppͷࢥʹೃછΉ͜ͱ͕ग़དྷͨͱ͍͏Ͱྑ͔ͬͨ• ECSίϯςφରԠͷϚωʔδυɾαʔϏεΛ͏͜ͱͰɺHerokuΠϯϑϥ࡞ۀͷखؒΛݮΒ͢• ίϯςφԽ͓ͯ͘͜͠ͱͰɺҟͳΔݴޠϑϨʔϜϫʔΫͷαϒγεςϜΛՃ͍͢͠29
3012factor.net/ja/(ࢀߟ) Twelve-Factor App
esaͷػೳ͝ͱͷ࣮ํ๏31
ΧςΰϦػೳ32• هࣄλΠτϧΛʮ/ ʯͰ۠ΔͱΧςΰϦʹͳΔ• ΧςΰϦHOMEը໘ͰυϦϧμϯͰ͖Δ
ΧςΰϦػೳ33
ΧςΰϦػೳ• ܦ࿏ྻڍϞσϧͰ࣮34DBUFHPSJFTςʔϒϧJE QBUI GPP GPPCBSUJUMFGPPهࣄGPPCBSهࣄGPPCBSهࣄQPTUTςʔϒϧJE OBNF DBUFHPSZ@JE هࣄ هࣄ هࣄ
ΧςΰϦػೳ35DBUFHPSJFTςʔϒϧJE QBUI GPP GPPCBSQPTUTςʔϒϧJE OBNF DBUFHPSZ@JE هࣄ هࣄ هࣄ “foo/bar” ΧςΰϦͷهࣄݕࡧ:select * from postsjoin categories oncategories.id = posts.category_idwherecategories.path like ‘foo/bar/%’
֎෦ެ։ػೳ• ҙͷهࣄεϥΠυΛνʔϜ֎ʹެ։Ͱ͖Δػೳ• URLΛ͍ͬͯΕϩάΠϯෆཁͰӾཡՄೳ• GitHub pagesΛҙࣝͯ͠ɺesa-pages.ioͱ͍͏υϝΠϯ্Ͱڞ༗͞ΕΔ36
֎෦ެ։ػೳ37esa-pages.io/p/sharing/105/posts/46/70c5c045110fa64018dd.html
֎෦ެ։ػೳ• هࣄɾεϥΠυΛHTMLมޙʹS3ʹग़ྗ͠ɺCloudFrontܦ༝Ͱ৴• େྔͷΞΫηε͕͋ͬͯesaຊମʹෛՙֻ͕͔Βͳ͍Α͏ʹ• ݩهࣄΛߋ৽͢ΕS3্ͷهࣄࣗಈߋ৽38
ܾࡁ• ݄ॳʹɺલͷ݄ͷར༻ঢ়گʹԠͯ͡ΫϨδοτΧʔυܾࡁ• ޙ͍ͳͷͰΩϟογϡϑϩʔएׯ٘ਜ਼ʹͳΔ͕ɺ՝ۚλΠϛϯάΛͻͱ݄͋ͨΓ1ճʹͯ͠γεςϜͷγϯϓϧ͞ͱ҆ΛಘΔ• ҎલͷձࣾͰ࣍՝ۚόον͕͋ͬͯোͷ࣌ʹపରԠͨ͠ࢥ͍ग़ɻɻɻ39
ܾࡁ• ࣾʹෳνʔϜ͕͋Δ߹ʮܾࡁͷ࿈݁ʯ͕Մೳ• νʔϜͰॏෳͨ͠Ϣʔβʔʹ͍ͭͯ1νʔϜͷྉۚʹͳΔͷͰ͓ಘ40docs.esa.io/posts/190
ܾࡁ41• Q.ʮٻॻ͍ແ͍ΜͰ͔͢ʁʯ• A. ͢Έ·ͤΜɻࠓͷͱ͜Ζແ͍Ͱ͢ɻ
શจݕࡧ• ࠷ॳPostgresql + RansackͰແཧΓ࣮• هࣄ͕૿͑Δʹैͬͯݕࡧਫ਼ʹෆຬ• ΠϯΫϦϝϯλϧݕࡧ͕͍ͨ͠42
શจݕࡧ43docs.esa.io/posts/198
શจݕࡧ• Elasticsearchͷಋೖ• ਫ਼্͕͕ͬͨ• ιʔτΦϓγϣϯ͕૿͑ͨ• ͘ͳͬͨ• ΠϯΫϦϝϯλϧݕࡧͰ͖ΔΑ͏ʹ44
શจݕࡧ• Best matchιʔτ• “͍͍ײ͡” ͷॱ൪Ͱݕࡧ݁ՌΛදࣔ• Elasticsearchͷfunction_score queryΛ׆༻45
શจݕࡧ• “͍͍ײ͡” ͷॱ൪ͱʁ• هࣄλΠτϧΧςΰϦʹϚονͨ͠΄͏͕ɺهࣄຊจʹϚον͢ΔΑΓείΞ͕ߴ͍• ࠷ۙͷStarɾWatchɾCommentͷ͕ଟ͍΄͏͕είΞ͕ߴ͍• ΞʔΧΠϒ͞ΕͨهࣄͷείΞͱ͍ͯ• etc46
API• 2015/05ࠒ͔Βαϙʔτ• Doorkeeper gemΛ࣮ͬͯ• APIυΩϡϝϯτ: docs.esa.io/posts/102• APIΛͬͨαʔυύʔςΟπʔϧ๛47
αʔυύʔςΟπʔϧ48docs.esa.io/posts/158
ϩάΠϯ• ݱঢ়Google OAuth͚ͩ• ೋஈ֊ೝূͳͲGoogleଆͰ୲อ• ϩάΠϯػೳΛͰ͖Δ͚࣮ͩ͠ͳ͍͜ͱͰ։ൃίετΛԼ͛ͭͭηΩϡΞʹ͢Δૂ͍49
ϩάΠϯ• ෳΞΧϯτಉ࣌ϩάΠϯՄೳ50docs.esa.io/posts/210
ϩάΠϯ• Q. ʮGmailҎ֎ͷϝʔϧΞυϨεͱύεϫʔυͰϩάΠϯͰ͖ΔΑ͏ʹͳΓ·ͤΜ͔ʁʯ• A. ͢Έ·ͤΜɻ·ͩͰ͖·ͤΜɻ• (কདྷతʹఏڙ͍ͨ͠)51
esaͷϢʔβʔαϙʔτ52
جຊతͳߟ͑ํ• զʑͱϢʔβʔ͕ڞʹͤʹͳΔํ๏Λ୳͢• 5Ͱฦ৴͢Δ• (ӳจϝʔϧͷ༁Έ͍ͨͳจ໘ʹͳΔ)• ࣭ʹରͯ͠ɺʮ͍/͍͍͑ɻʯΑΓྑ͍ฦࣄ͕͋Δͣ53
ϑΟʔυόοΫϑΥʔϜ54
ϑΟʔυόοΫϑΥʔϜ55Slack, GitHub, Gmailʹ௨͕ඈͿ
ϑΟʔυόοΫϑΥʔϜ56• GmailͰͷΓͱΓGitHubͷIssueʹࣗಈͰಉظ͞ΕΔgithub.com/fukayatsu/feedback-sync
TwitterͰͷϑΟʔυόοΫ• esaؔ࿈πΠʔτ@esa_ioͷreplyͳͲ͕SlackʹྲྀΕΔΑ͏ʹͯ͋͠Δ• SlackͰEmoji reactionΛ͢ΕTwitter্Ͱ͓ؾʹೖΓ͕Ͱ͖Δ57github.com/fukayatsu/esarch
ϑΟʔυόοΫۦಈ։ൃ• ʮ͜͜͜͏ͩͱخ͍͠ΜͰ͚͢Ͳʯ• ʮΑͦ͞͏Ͱ͢ͶɻͬͯΈ·͢ʂʯ• (30ޙ)ʮϦϦʔε͠·ͨ͠ʂʯ• ʮΘʔ͍ʂʯ• …Έ͍ͨͳͷ͕ཧ58
ϑΟʔυόοΫۦಈ։ൃ• ར• ΔؾͷॠؒՐྗΛ։ൃʹ׆͔ͤΔ• ૣ͚Εૣ͍΄Ͳɺͼͬ͘Γͨ͠ΓتΜͩΓͯ͠Β͑ΔͷͰɺ࣍ͷ։ൃͷϞνϕʔγϣϯʹͳΔ59
esaͱϞνϕʔγϣϯ60
Ϟνϕʔγϣϯ• Ϟνϕʔγϣϯࣗମ੍ޚͰ͖ͳ͍• ੍ޚͰ͖ͳ͍ͷٕज़ͰͲ͏ʹͳΒͳ͍?• esaͰ։ൃεέδϡʔϧΛ΄ͱΜͲΒͣϊϧϚͳ͍ͷͰɺϞνϕʔγϣϯ͕Լ͢Δͱ։ൃ͕Δ61
Ϟνϕʔγϣϯ• ϞνϕʔγϣϯΛੜΈग़͠͏ΔڥΠϕϯτ(ΛੜΈग़͠͏ΔԿ͔…)Λ੍ޚ͢Δ͜ͱͰɺؒతʹϞνϕʔγϣϯΛߴΊΔྗΛ͢Δ• “ΔؾΛग़͢” Ͱͳ͘ɺ “Δؾ͕ग़ͦ͏ͳԿ͔” ʹ࠷ળΛਚ͘͢62
Ϟνϕʔγϣϯ͕ग़ͦ͏ͳԿ͔• Ϣʔβʔ͞ΜʹՁΛಧ͚ΒΕ͍ͯΔ• Ϣʔβʔ͞Μ͔Β͋Γ͕ͱ͏ͱݴͬͯΒ͑Δ• Ϣʔβʔ͞Μͷձ্͕ࣾख͍͘͘• ৭ΜͳਓʹesaάοζΛָ͠ΜͰΒ͍͑ͯΔ63
Ϟνϕʔγϣϯ͕ग़ͦ͏ͳԿ͔• ࣗࣾαʔϏεͷऩӹ͚ͩͰձࣾΛӡӦͰ͖Δ• ඞཁेͳڅ༩ΛಘΒΕΔ• Α͘৸Δ / ݈߁Ͱ͍Δ• Γ͍ͨࣄΛΓ͍ͨ࣌ʹΔ64
Α͍॥1. αʔϏεΛ࡞Δ2. Ϣʔβʔ͞Μ͕ͬͯ͘ΕΔ/تΜͰ͘ΕΔ3. զʑͷϞνϕʔγϣϯ(ͱച্)্͕͕Δ4. ߋʹྑ͍αʔϏεΛ࡞Δ65
esaͱϞνϕʔγϣϯ• esaͷ։ൃʹͱͬͯϞνϕʔγϣϯඇৗʹॏཁ• ੍ޚͰ͖Δ෦ͱ੍ޚͰ͖ͳ͍෦ͱΛݟۃΊͯɺ੍ޚͰ͖Δ෦ʹྗ͢Δ• ྑ͍॥Λૉૣ͘ࡉ͔͘ճ͍ͯ͘͜͠ͱΛҙࣝ͢Δ66
·ͱΊ67
·ͱΊ• esaͷγεςϜ࣮ʹ͍ͭͯ͝հ͠·ͨ͠• খ͘͞ϦϦʔεͯ͠ɺϢʔβʔ͞Μ͔ΒϑΟʔυόοΫϞνϕʔγϣϯΛ͍ͳ͕ΒαʔϏεࣗͨͪΛҭ͍ͯͯ͘ͷͱָ͍ͯ͜͠ͱͩͬͨ• ͦͷΑ͍॥Λճ͢͜ͱΛҙ͍ࣝͯͨ͠Β͍ͭͷؒʹ͔͜͜·Ͱདྷ͍ͯͨ68
ࢀߟ69
χʔόʔͷفΓ• ʮئΘ͘Θͨ͠ʹɺม͑Δ͜ͱͷͰ͖ͳ͍ࣄΛड͚ೖΕΔམͪண͖ͱɺม͑Δ͜ͱͷͰ͖ΔࣄΛม͑Δ༐ؾͱɺͦͷҧ͍Λৗʹݟ͚ΔܙͱΛ͚ͣͨ͞·͑ʯ70ja.wikipedia.org/wiki/χʔόʔͷفΓ