情報処理学会 2013年度短期集中セミナー「Exiciting Coding! 2013~ITスペシャリストが語るクラウドシステム/アプリ開発の面白さ~」での発表資料
http://www.ipsj.or.jp/event/s-seminar/2013/Exciting_Coding/program.html
ΫϥυΛͬͨϢʔβ͚αʔϏε։ൃͷ໘ന͞ΫοΫύου ؘ༞Ұ 2013/11/29
View Slide
ఏڙ
id:secondlife @hotchpotch ؘ༞Ұ / Yuichi Tateno VP of Enginnering at Cookpad—Ruby
COOKPAD
ຖͷྉཧΛָ͠Έʹ͢Δ͜ͱͰ৺͔ΒͷসإΛ૿͢
PC
εϚʔτϑΥϯϒϥβɾΞϓϦ
ϑΟʔνϟʔϑΥϯ͚
ϢχʔΫϒϥβ 3300ສҎ্݄ؒར༻ऀ 2000ສਓҎ্Ϩγϐ 150ສҎ্
ΤϯδχΞ60ਓ+αʔϏε։ൃ 40ਓ+ٕज़෦ 10ਓ+Πϯϑϥ෦ 5ਓ
Ϋϥυͷಋೖɾݕ౼
Ϋϥυಋೖݕ౼2010಄͔ΒɺΫϥυಋೖݕ౼ όϨϯλΠϯෛՙ 20118݄ɺΫϥυҠߦ(AWS)
όϨϯλΠϯͷෛՙฏৗ࣌ͷೋഒҎ্
ҎલɺόϨϯλΠϯʹ͋ΘͤͯཧαʔόΛ૿͢
ΫϥυҠߦޙඞཁʹԠͯ͡ॊೈͳ૿ݮ
ݱࡏɾಠࣗͷ AUTO SCALING ͰΞΫηεʹԠࣗ͡ಈ૿Ճ
ݱࡏɾಠࣗͷ AUTO SCALING ͰΞΫηεʹԠࣗ͡ಈ૿Ճຊ൪αʔόʹ৽͍͠ίʔυɾػೳΛσϓϩΠ ͦͷঢ়ଶͷεφοϓγϣοτΛ࡞ εφοϓγϣοτ͔ΒɺࣗಈͰαʔόΛ૿͠ىಈ αʔό૿Ճޙଞαʔόͱಉ͡ڥ͕อͯΔ
ࣄྫɿϛυϧΣΞͷόʔδϣϯΞοϓ
ϛυϧΣΞɾϑϨʔϜϫʔΫͷόʔδϣϯΞοϓRuby, Rails Λར༻ ఆظతʹόʔδϣϯΞοϓ͢Δඞཁੑ ݕূΛॏͶͯʮ͔ͨ͠͠ΒൃੜʯͷՄೳੑ
ϛυϧΣΞɾϑϨʔϜϫʔΫͷόʔδϣϯΞοϓϢʔβRails 2.3proxy
ϛυϧΣΞɾϑϨʔϜϫʔΫͷόʔδϣϯΞοϓϢʔβRails 2.3Rails 3.0proxy৽͍͠αʔό܈Λ࡞
ϛυϧΣΞɾϑϨʔϜϫʔΫͷόʔδϣϯΞοϓϢʔβRails 2.3Rails 3.0proxy
ϛυϧΣΞɾϑϨʔϜϫʔΫͷόʔδϣϯΞοϓϢʔβRails 3.0proxyRails 2.3҆ఆӡ༻ޙ আ
ςετ࣮ߦ
ςετ࣮ߦػೳ͕૿͑Δͱɺਵ͢Δςετίʔυ૿͑Δ ੲ3ͰऴΘͬͨςετɺࠓ40…
ςετ࣮ߦػೳ͕૿͑Δͱɺਵ͢Δςετ૿͑Δ ੲ3ͰऴΘͬͨςετɺࠓ40…
ςετ࣮ߦҰ10ճͷσϓϩΠͰػೳө ʮςετ͕ͯ͘σϓϩΠ͕ΕΔʂʯΛ͕ͳ͍ͱ͍͚ͳ͍
ࢄςετڥͷߏஙαʔόͰฒྻࢄςετSync & test
ࢄςετڥͷߏஙαʔόͰฒྻࢄςετSync & test10ഒ
ςετ࣮ߦςετͷฒྻ࣮ߦ ʮͯ͘ࠔΒͳ͍ʯ࣌͘ ʮ͘ऴΘͬͯཉ͍͠ʯ࣌͘
ܧଓతΠϯςάϨʔγϣϯαʔόͷࣗಈ૿ݮ
Bனؒ։ൃ͕ΜͳͨΊɺαʔόଟ͘σϓϩΠՄೳ
Bனؒ։ൃ͕ΜͳͨΊɺαʔόଟ͘σϓϩΠՄೳCؒ։ൃ͕ΜͰͳ͍ɺαʔόݮΒ͢σϓϩΠෆՄ
։ൃऀڥͰͷࢄฒྻςετ։ൃऀϚγϯ αʔόͰฒྻࢄςετSync & test
։ൃऀڥͰͷࢄฒྻςετ
։ൃऀڥͰͷࢄฒྻςετҰਓ͋ͨΓͷ Ϧιʔε͕…
։ൃऀڥͰͷࢄฒྻςετ͍ͨͣΒʹ૿͢ͱ ίετ͕…
։ൃऀڥͰͷࢄฒྻςετίετͰ͖Δ͚͍ͩ͑ͨ ్͠தͰதஅ͞Εͯɺ͋·Γ͕ى͜Βͳ͍
”࣌ؒͷ੍͕ͳ͘ɺதஅ͔ͯ͠·Θͳ͍λεΫͷܭࢉίετΛେ෯ʹݮͰ͖·͢””εϙοτՁ֨ଟ͘ͷ߹ɺಉ͡EC2 ΠϯελϯελΠϓͷΦϯσϚϯυՁ֨Λେ෯ʹԼճΓ·͢”
։ൃऀڥͰͷࢄฒྻςετ௨ৗ Πϯελϯε
։ൃऀڥͰͷࢄฒྻςετ௨ৗ Πϯελϯεεϙοτ Πϯελϯε(ςετத)
༷ʑͳϓϩδΣΫτͰͷςετ
ϓϩδΣΫτ͝ͱʹ…ͬͯΔ Ruby, Rails, MySQL ͷࡉ͔͍όʔδϣϯࠩҟ ϛυϧΣΞΛ͏ɾΘͳ͍ qt-webkit, memcached, redis, solr,elasticsearch…
CI αʔόʹʮϥϕϧʯΛ͚ͭΔ ϥϕϧʹϚονͨ͠ CI Ͱ࣮ߦ͞ΕΔ mysql55 ͷΈඞཁͳΒɺͦͷϥϕϧ͕͍͍ͭͯΔ CI ʹׂΓৼΒΕ࣮ͯߦ͞ΕΔ
WHITESNAKEhttps://github.com/mrkn/whitesnake λάʹԠͨ͡ CI ͷׂΓৼΓ Rails ͷςετʹඞཁͳઃఆΛ؆ܿʹ
৽نࣄۀల։
৽نࣄۀల։طଘͷࢿ࢈Λੜ͔͢ ٕज़ cookpad ͷϢʔβɾσʔλ طଘࣄۀͱ৽نࣄۀͷσʔλͷͭͳ͗ࠐΈ ૉૣ͍ࣄۀ্ཱͪ͛
Ͳ͏ͬͯʁαʔϏεͷ SOA Խ ԣల։Ͱ͖Δ൚༻తͳΈ
αʔϏεͷSOAԽService Oriented Architecture αʔϏεࢦΞʔΩςΫνϟ αʔϏε͝ͱʹඞཁͳσʔλΛ API Λͯ͠ΓͱΓ OAuth2 + RESTful ͳ API Cookpad ID ͰͷݖݶཧɾγϯάϧαΠϯΦϯ
ϩάΠϯσʔλऔಘݕࡧܾࡁ
COOKPAD ͷσʔλΛଞαʔϏεͰ
ଞαʔϏεͷσʔλΛCOOKPADͰ
αʔϏεࢦΞʔΩςΫνϟʮϨʔϧʹࡌͬͨʯநԽ API ͷ࡞Γํ͍͘ΒͰ ͲͷαʔϏεͰɺͰ͖Δ͚ͩ؆୯ʹɺಉ͡ํ๏Ͱ
Ϩʔϧʹࡌͬͨ SOA ԽGarageOAuth2 ೝূɾೝՄͷ࣮ ΠϯλʔϑΣΠεΛ࣮͢Δ͚ͩͰOK ಛఆͷσʔλߏΛग़ྗ PantryGarage ͷ API ΫϥΠΞϯτ
Ϩʔϧʹࡌͬͨ SOA ԽGarage࣮ऀɺGarage Λͬͯ API Λ࣮͢Δ͚ͩ ଞαʔϏεͰར༻͞ΕΔͲΜͲΜ API Խ Pantryར༻ऀ Pantry Ͱ API Λୟ͚ͩ͘
͏ٕज़ͷ౷ҰRuby, Rails, HAML, MySQL, memcached, redis,solr … Ͱ͖Δ͚ͩ߹ΘͤΔ͜ͱͰɺਂ͍ཧղʹͭͳ͕Δ & ଞαʔϏεͷཧղ͕ૉૣ͘ ͪΖΜඞཁʹԠͯ͡৽نٕज़ͷݕূɾಋೖߦ͏
͏ٕज़ͷ౷ҰCPADΫοΫύου։ൃऀ༻ͷϓϩϏδϣχϯάπʔϧ Mac ্ͰඞཁͳҰࣜɺڥߏங $ cpad rails new ৽ن Web αʔϏεʹඞཁͳҰ͕ࣜೖΔ Garage, Pantry, ͦͷଞ SSO / ܾࡁͷϥΠϒϥϦ
͏ٕज़ͷ౷ҰOZEN Rails ΞϓϦαʔό/DBαʔόΛࣗಈߏங COOKPAD ͷΞϓϦ։ൃͳඞཁͳڥॾʑͷߏங “͓હཱͯ” ͯ͘͠ΕΔπʔϧ
৽نαʔϏεߏஙͷྲྀΕ$ cpad rails new Pantry, Garage Λ༻͍ͯ։ൃ ܧଓతΠϯςάϨʔγϣϯ whitesnake ͰαΫͬͱ $ ozen create ඞཁͳαʔόΛ࡞ɻσϓϩΠͯ͠ݕূ
৽نࣄۀల։طଘͷࢿ࢈Λੜ͔͢ ٕज़ cookpad ͷϢʔβɾσʔλ طଘࣄۀͱ৽نࣄۀͷσʔλͷͭͳ͗ࠐΈ ૉૣ͍ࣄۀ্ཱͪ͛Pantry, Garage Ͱ SOA ద༻cpad, ozen Ͱ ڥߏங
αʔόͷڥߏங
αʔόڥͷมߋPuppet ͰαʔόΛઃఆ EC2 ͷλάͰద༻͢ΔઃఆΛมߋ λάྫ: app-cookpad-rails cookpad ༻ͷ rails ΞϓϦέʔγϣϯ
։ൃऀʹΑΔαʔόઃఆมߋGitHub ʹΑΔίʔυϨϏϡʔ ͯ͢ͷίʔυΛίʔυϨϏϡʔ αʔόڥίʔυϨϏϡʔ
։ൃऀʹΑΔมߋGitHub ʹΑΔίʔυϨϏϡʔ ͯ͢ͷίʔυΛίʔυϨϏϡʔ αʔόڥίʔυϨϏϡʔ
αʔόڥίʔυϨϏϡʔ։ൃऀࣗ༝ʹڥߏஙͰ͖Δ puppet Λ༻͍ͯઃఆ ΠϯϑϥνʔϜมߋΛ͔ͬ͠Γͱཧղ͠ڐՄͰ͖Δ ɾݒ೦͕͋Ε։ൃऀʹϑΟʔυόοΫ
αʔόڥίʔυϨϏϡʔ։ൃऀࣗ༝ʹڥߏஙͰ͖Δ puppet Λ༻͍ͯઃఆ ΠϯϑϥνʔϜมߋΛ͔ͬ͠Γͱཧղ͠ OKͰ͖Δ ɾݒ೦͕͋Ε։ൃऀʹϑΟʔυόοΫDevOps
ΫϥυΛͬͨϢʔβ͚αʔϏε։ൃͷ໘ന͞?
ΞΫηεʹԠͨ͡αʔόͷௐ CI ͷঢ়ଶʹԠͨ͡αʔόͷௐɾαʔόͷ࡞ εϙοτΠϯελϯεΛͬͨɺ҆Ձͳςετڥͷߏங cpad / ozen Λͬͨ SOA ͰͷαʔϏεల։
ΞΫηεʹԠͨ͡αʔόͷௐ CI ͷঢ়ଶʹԠͨ͡αʔόͷௐɾαʔόͷ࡞ εϙοτΠϯελϯεΛͬͨɺ҆Ձͳςετڥͷߏங cpad / ozen Λͬͨ SOA ͰͷαʔϏεల։ͯ͢ιϑτΣΞͰ هड़Ͱ͖Δ
ΞΫηεʹԠͨ͡αʔόͷௐ CI ͷঢ়ଶʹԠͨ͡αʔόͷௐɾαʔόͷ࡞ εϙοτΠϯελϯεΛͬͨɺ҆Ձͳςετڥͷߏங cpad / ozen Λͬͨ SOA ͰͷαʔϏεల։✓ αʔόͷىಈɾআ ✓ αʔόڥͷઃఆ ✓ ͦͷଞɺAPI Λ௨ͯ͡΄ͱΜͲ͔࣮ߦՄೳ
ΞΫηεʹԠͨ͡αʔόͷௐ CI ͷঢ়ଶʹԠͨ͡αʔόͷௐɾαʔόͷ࡞ εϙοτΠϯελϯεΛͬͨɺ҆Ձͳςετڥͷߏங cpad / ozen Λͬͨ SOA ͰͷαʔϏεల։✓ʮίʔυʯͷ࠶ར༻ ɹ㾎 αʔόڥɾઃఆͷهड़ ɹ㾎 εϙοτΠϯελϯεͬͨࢄαʔόΛɺCI ͔Βར༻
ΞΫηεʹԠͨ͡αʔόͷௐ CI ͷঢ়ଶʹԠͨ͡αʔόͷௐɾαʔόͷ࡞ εϙοτΠϯελϯεΛͬͨɺ҆Ձͳςετڥͷߏங cpad / ozen Λͬͨ SOA ͰͷαʔϏεల։։ൃऀ͕ ΑΓ༷ʑͳ͜ͱ͕ Ͱ͖ΔΑ͏ʹʂʂʂ
ΞΫηεʹԠͨ͡αʔόͷௐ CI ͷঢ়ଶʹԠͨ͡αʔόͷௐɾαʔόͷ࡞ εϙοτΠϯελϯεΛͬͨɺ҆Ձͳςετڥͷߏங cpad / ozen Λͬͨ SOA ͰͷαʔϏεల։DevOps
͓ΘΓʹΫϥυ͕ιϑτΣΞͷߟ͑ํ ͍··Ͱ͔ͬͨ͠ɺΠϯϑϥͷ੍ޚιϑτΣΞͱͯ͠هड़Ͱ͖Δ ϢʔβʹՁΛಧ͚ΔͨΊͷબࢶ͕૿͑ͨ ΫϥυΛར༻ͨ͠ɺ༷ʑͳ͜ͱʹઓͰ͖ɺ։ൃ͕ΑΓ໘ന͘!!