GCP サーバーレス サービスについて / アーキテクチャ / メリット / ハマりどころ / 今後の課題
($1αʔόʔϨεαʔϏεʷগνʔϜʹΑΔࣄۀ্ཱͪ͛4FSWFSMFTTٕज़ษڧձʙϑϧϚωʔδυαʔϏε׆༻ࣄྫʙ%40$%FWFMPQNFOU(SPVQΤϯδχΞా༔Ұ4BOTBOגࣜձࣾ
View Slide
Agenda- ࣗݾհ- Sansan αʔϏεհ- ߴਫ਼ͳσʔλԽΛࢧ͑Δϊϋ- GCP αʔόʔϨε αʔϏεͷ׆༻ࣄྫ ʙ৽ͨͳσʔλԽαʔϏεͷݕূʙ2
ࣗݾհ- ా ༔Ұ- Sansanגࣜձࣾ DSOC Development GroupΤϯδχΞ- αʔόʔαΠυΛத৺ʹϑϩϯτΤϯυɾΠϯϑϥʹڵຯ͕͋Γ·͢- Sansan Tech Podcast ͬͯ·͢ʂ3
Agenda- ࣗݾհ- Sansan αʔϏεհ- ߴਫ਼ͳσʔλԽΛࢧ͑Δϊϋ- GCP αʔόʔϨε αʔϏεͷ׆༻ࣄྫ ʙ৽ͨͳσʔλԽαʔϏεͷݕূʙ4
๏ਓ͚Ϋϥυ໊ཧαʔϏε ݸਓ໊͚ΞϓϦ
6
Agenda- ࣗݾհ- Sansan αʔϏεհ- ߴਫ਼ͳσʔλԽΛࢧ͑Δϊϋ- GCP αʔόʔϨε αʔϏεͷ׆༻ࣄྫ ʙ৽ͨͳσʔλԽαʔϏεͷݕূʙ7
ߴਫ਼ͳσʔλԽΛࢧ͑ΔϊϋػցͷྗͱਓͷྗΛΈ߹ΘͤΔ8
ϛεςΠΫσΟςΫλʔ9ޡΓͷΛֶशͯ͠ϛεͷՄೳੑΛ༧ଌ͜ΕʹΑΓɺΦϖϨʔλʔޮతʹ࠷ऴνΣοΫΛߦ͏͜ͱ͕ՄೳʹͳΓ·͢ɻ
ݴޠॲཧఆ10໊ը૾͔ΒݴޠΛఆ• ̐ݴޠʢӳதؖʣʹରԠ • σʔλԽϑϩʔͷޮԽ • ΦϖϨʔλͷৼΓ͚ͷࣗಈԽ • ਫ਼ 98 %
߲ηάϝϯςʔγϣϯ11จࣈΛಡΈऔΒͣʹɺ໊ͷσβΠϯ͔Β߲Λݟ͚Δ• ߲ผͷ݁ՌΛֶश • ୯ମϞσϧͰ߲ۣܗɺ໊߲ͷਪఆ • ਫ਼ 98 %
ΦϖϨʔλʔʹΑΔೖྗ- Ұͭͷ߲ʹର͢ΔɺෳͷΦϖϨʔλʹΑΔଟॏೖྗ- ೖྗ༰ʹର͢ΔࢹνΣοΫ- ೖྗϧʔϧτϨʔχϯάͷ࡞12
৽ͨͳσʔλԽαʔϏεͷݕূຊɺߴਫ਼ͳσʔλԽϊϋΛ׆༻ͨ͠ʮٻॻͷσʔλԽʯʹؔ͢ΔऔΓΈΛ͝հ※ ਖ਼ࣜͳ৽αʔϏεͷൃදͰ͍͟͝·ͤΜ13
Agenda- ࣗݾհ- Sansan αʔϏεհ- ߴਫ਼ͳσʔλԽΛࢧ͑Δϊϋ- GCP αʔόʔϨε αʔϏεͷ׆༻ࣄྫ ʙ৽ͨͳσʔλԽαʔϏεͷݕূʙ14
GCP αʔόʔϨε αʔϏε׆༻ࣄྫʙ৽ͨͳσʔλԽαʔϏεͷݕূʙ
GCP αʔόʔϨε αʔϏεͷ׆༻ࣄྫ ʙ৽ͨͳσʔλԽαʔϏεͷݕূʙ- GCP αʔόʔϨε αʔϏεʹ͍ͭͯ- ΞʔΩςΫνϟ- ϝϦοτ- ϋϚΓͲ͜Ζ- ࠓޙͷ՝- ·ͱΊ16
GCP αʔόʔϨε αʔϏεͷ׆༻ࣄྫ ʙ৽ͨͳσʔλԽαʔϏεͷݕূʙ- GCP αʔόʔϨε αʔϏεʹ͍ͭͯ- ΞʔΩςΫνϟ- ϝϦοτ- ϋϚΓͲ͜Ζ- ࠓޙͷ՝- ·ͱΊ17
GCP αʔόʔϨε αʔϏεʹ͍ͭͯ- Google App Engine- Cloud Firestore- Cloud Tasks- Stackdriver- Cloud Storage- Cloud Functions18
GCP αʔόʔϨε αʔϏεʹ͍ͭͯ- Google App Engine- Cloud Firestore- Cloud Tasks- Stackdriver- Cloud Storage => AWS S3- Cloud Functions => AWS Labmda19
Google App EnginePaaSʢPlatform as a Serviceʣ- εέʔϧΞτɾσϓϩΠ͕ߴ- Πϯελϯε͕θϩ·ͰεέʔϧΠϯ- αϙʔτϥϯλΠϜ- Java, Python, Go, PHP, Node.js, Rubyʢbetaʣ20
Cloud FirestoreαʔόʔϨεͳυΩϡϝϯτࢦ NoSQL σʔλϕʔε- ΞϓϦέʔγϣϯͷෛՙʹԠͯࣗ͡ಈతʹਫฏεέʔϦϯά- ڧ߹ੑ- ߴ͍Մ༻ੑ- ϚϧνϦʔδϣϯͰ 99.999% Ҏ্- ϦʔδϣϯͰ 99.99% Ҏ্21
Cloud Firestore ͷ֊σʔλྫʣͦΕͧΕͷνϟοτϧʔϜʹෳͷϝοηʔδ͕͋Δ- rooms- room-A- messages- message-1- message-2- …- room-B- …22name: “։ൃϧʔϜ”from: “ଠ”, msg: “͜Μʹͪʂ”from: “࣍”, msg: “Hello!”
Cloud Firestore ͷ֊σʔλྫʣͦΕͧΕͷνϟοτϧʔϜʹෳͷϝοηʔδ͕͋Δ- rooms- room-A- messages- message-1- message-2- …- room-B- …23name: “։ൃϧʔϜ”from: “ଠ”, msg: “͜Μʹͪʂ”from: “࣍”, msg: “Hello!”← ʢϧʔτʣίϨΫγϣϯ← υΩϡϝϯτ← rooms ͷαϒίϨΫγϣϯ← υΩϡϝϯτ
Cloud Firestore ͷσʔλܕ- Map- JavaScript ͷΦϒδΣΫτɺRuby ͷϋογϡɺPython ͷࣙॻܕͷΑ͏ͳΛೖΕΒΕΔ- Array- Boolean- Date and time- String- …ࢀߟ: https://firebase.google.com/docs/firestore/manage-data/data-types24
Cloud TasksϑϧϚωʔδυͳλεΫΩϡʔαʔϏε- ॲཧΛඇಉظͰ࣮ߦͰ͖Δ- HTTP Target λεΫʢbetaʣ- App Engine λεΫ- ಉ࣌λεΫͷ࠷େϨʔτ࠷େΛઃఆͰ͖Δ25
StackdriverΞϓϦέʔγϣϯɺΠϯϑϥετϥΫνϟͷϞχλϦϯάͱཧ- ϩΪϯά => Stackdriver Logging- Τϥʔ௨ => Stackdriver Error Reporting- ϞχλϦϯά => Stackdriver Monitoring26
GCP αʔόʔϨε αʔϏεͷ׆༻ࣄྫ ʙ৽ͨͳσʔλԽαʔϏεͷݕূʙ- GCP αʔόʔϨε αʔϏεʹ͍ͭͯ- ΞʔΩςΫνϟ- ϝϦοτ- ϋϚΓͲ͜Ζ- ࠓޙͷ՝- ·ͱΊ27
༻ݴޠ28Cloud FunctionsNode.jsόοΫΤϯυNode.js, TypeScript, ExpressࣗಈԽΤϯδϯC#ϑϩϯτΤϯυReact, Redux, TypeScript
αʔϏεͷશମ૾29ٻॻը૾σʔλԽ݁Ռೖྗ / σʔλԽγεςϜࣾΦϖϨʔλʔࣗಈԽΤϯδϯϢʔβʔଆγεςϜσʔλԽٻॻσʔλԽγεςϜΞοϓϩʔυ
αʔϏεͷશମ૾30ٻॻը૾σʔλԽ݁Ռೖྗ / σʔλԽγεςϜࣾΦϖϨʔλʔࣗಈԽΤϯδϯϢʔβʔଆγεςϜΞοϓϩʔυσʔλԽٻॻσʔλԽγεςϜ
ΞʔΩςΫνϟKPI ج൫ϩΪϯά / Τϥʔ௨StackdriverϢʔβʔଆγεςϜBigQueryCloudPub/SubࣗಈԽΤϯδϯCloudDataflowAppEngineCloudFunctionsCloudStorageCloudFirestoreComputeEngineCloudTasksೖྗ / σʔλԽγεςϜ
ΦϖϨʔλʔ͔ΒͷೖྗΛड͚͚Δ3App Engine ʢNode.jsʣCloud TasksCloud FirestoreࣾΦϖϨʔλʔ App EngineʢSPA ΞϓϦέʔγϣϯʣඇಉظॲཧ
ϑΝΠϧΞοϓϩʔυͰಛఆͷॲཧΛߦ͏- Cloud Functions ͷ Cloud Storage τϦΨʔ- Cloud Tasks ͷ App Engine λεΫ34Cloud Storage Cloud Functions App EngineCloud Tasks
ࣗಈԽΤϯδϯ - Compute Engine35ٻॻը૾ͱΦϖϨʔλʔͷೖྗσʔλͷηοτΛֶशগͣͭࣗ͠ಈԽ͍ͯ͘͠※ Web API ͱͯ͠࿈ܞ
KPI ج൫- Google App Engine ͔Β Cloud Pub/Sub ܦ༝ͰϩάΛૹ৴- Tableau ͰՄࢹԽ36App Engine BigQueryCloud Pub/Sub Cloud Dataflow
GCP αʔόʔϨε αʔϏεͷ׆༻ࣄྫ ʙ৽ͨͳσʔλԽαʔϏεͷݕূʙ- GCP αʔόʔϨε αʔϏεʹ͍ͭͯ- ΞʔΩςΫνϟ- ϝϦοτ- ϋϚΓͲ͜Ζ- ࠓޙͷ՝- ·ͱΊ37
ϝϦοτ- ᶃ ΞϓϦέʔγϣϯͷίʔυʹूதͰ͖Δ- ᶄ αʔόʔཧෆཁ- ᶅ ίετ࠷దԽ38
ϝϦοτᶃɿΞϓϦέʔγϣϯͷίʔυʹूதͰ͖Δ- ඇಉظ࣮ߦ- ఆظ࣮ߦ- σϓϩΠ- IPΞυϨε੍ݶ- τϥϑΟοΫׂ39App Engine
ϝϦοτᶃɿΞϓϦέʔγϣϯͷίʔυʹूதͰ͖Δ- ඇಉظ࣮ߦ- ఆظ࣮ߦ- σϓϩΠ- IPΞυϨε੍ݶ- τϥϑΟοΫׂ40Cloud TasksApp Engine Crongcloud ίϚϯυApp Engine ϑΝΠΞ ΥʔϧTraffic SplittingApp Engine
ϝϦοτᶃɿΞϓϦέʔγϣϯͷίʔυʹूதͰ͖Δ- ඇಉظ࣮ߦ- ఆظ࣮ߦ- σϓϩΠ- IPΞυϨε੍ݶ- τϥϑΟοΫׂ41Cloud TasksApp Engine Crongcloud ίϚϯυApp Engine ϑΝΠΞ ΥʔϧTraffic SplittingApp Engine
τϥϑΟοΫׂ - Traffic Splitting- ෳόʔδϣϯͷΠϯελϯεΛಉ࣌ʹಈ͔ͤΔ - IP ΞυϨε Cookie ͰτϥϑΟοΫΛׂͰ͖Δ - ཧը໘͔ΒΠϯελϯεͷόʔδϣϯΛมߋͰ͖Δ42App Engine
τϥϑΟοΫׂ - Traffic Splitting- ෳόʔδϣϯͷΠϯελϯεΛಉ࣌ʹಈ͔ͤΔ => ಈ࡞֬ೝςετ- IP ΞυϨε Cookie ͰτϥϑΟοΫΛׂͰ͖Δ => A/B ςετ- ཧը໘͔ΒΠϯελϯεͷόʔδϣϯΛมߋͰ͖Δ43App Engine
τϥϑΟοΫׂ - Traffic Splitting- ෳόʔδϣϯͷΠϯελϯεΛಉ࣌ʹಈ͔ͤΔ => ಈ࡞֬ೝςετ- IP ΞυϨε Cookie ͰτϥϑΟοΫΛׂͰ͖Δ => A/B ςετ- ཧը໘͔ΒΠϯελϯεͷόʔδϣϯΛมߋͰ͖Δ44App Engine
τϥϑΟοΫׂ - Traffic Splitting- ෳόʔδϣϯͷΠϯελϯεΛಉ࣌ʹಈ͔ͤΔ => ಈ࡞֬ೝςετ- IP ΞυϨε Cookie ͰτϥϑΟοΫΛׂͰ͖Δ => A/B ςετ- ཧը໘͔ΒΠϯελϯεͷόʔδϣϯΛมߋͰ͖Δ=> ϩʔϧόοΫ45App Engine
ϝϦοτᶄɿαʔόʔཧෆཁ- ෛՙʹԠͯ͡Φʔτεέʔϧ- αʔόʔͷϓϩϏδϣχϯά͕ෆཁ46App Engine Cloud Firestore
ίετ࠷దԽ- جຊ͚ͬͨͩ՝ۚ- Πϯελϯε͕θϩ·ͰεέʔϧΠϯͳͲ- Google App Engine / Standard Environment- Cloud Run47
ϝϦοτʢ;Γ͔͑Γʣ- ᶃ ΞϓϦέʔγϣϯͷίʔυʹूதͰ͖Δ- ᶄ αʔόʔཧෆཁ- ᶅ ίετ࠷దԽ48
ϝϦοτʢ;Γ͔͑Γʣ- ᶃ ΞϓϦέʔγϣϯͷίʔυʹूதͰ͖Δ- ᶄ αʔόʔཧෆཁ- ᶅ ίετ࠷దԽ49=> ݶΒΕͨϦιʔεͰεϐʔυײΛ࣋ͬͯ։ൃͰ͖Δ
GCP αʔόʔϨε αʔϏεͷ׆༻ࣄྫ ʙ৽ͨͳσʔλԽαʔϏεͷݕূʙ- GCP αʔόʔϨε αʔϏεʹ͍ͭͯ- ΞʔΩςΫνϟ- ϝϦοτ- ϋϚΓͲ͜Ζ- ࠓޙͷ՝- ·ͱΊ50
ϋϚΓͲ͜Ζ- ᶃ Google App Engine ڥ- ᶄ App Engine ϑΝΠΞΥʔϧ- ᶅ Cloud Firestore ͷσʔλϕʔεઃܭ51
ϋϚΓͲ͜ΖᶃɿGoogle App Engine ڥ- ελϯμʔυڥ or ϑϨΩγϒϧڥ=> ՄೳͳݶΓελϯμʔυڥΛ͏- σϓϩΠεέʔϦϯά͕ߴ- Πϯελϯε͕θϩ·ͰεέʔϧΠϯ- ެࣜυΩϡϝϯτࢀর- https://cloud.google.com/appengine/docs/flexible/java/flexible-for-standard-users?hl=ja52App Engine
GAE/FE Λ͏໘ - Google App Engine / Flexible Environment -- GAEΠϯελϯεΛ VPC ωοτϫʔΫʹඥ͚͍ͨ࣌- AWS ্ͷࣾαʔϏεͱ VPN Ͱଓ͔ͨͬͨ͠ͷͰɺҰ෦ GAE/FE Λ༻- ݱࡏ Serverless VPC Access Λ͑ɺελϯμʔυڥ͔Β VPC ϦιʔεʹΞΫηεՄೳ- Γ͑Λݕ౼த53App Engine
GAE/FE Λ͏໘ - Google App Engine / Flexible Environment -- ಛఆͷϥΠϒϥϦΛ͍͍ͨ࣌- ผαʔϏεʹΓग़ͯ͠ Docker ΠϝʔδΛ༻- ݱࡏ Cloud Run Λ༻͢Δ͜ͱͰɺGAE/SE ͷΑ͏ͳεέʔϥϏϦςΟΛอͪͭͭɺDocker ΠϝʔδΛͬͨߏʹͰ͖Δ54App Engine
ϋϚΓͲ͜ΖᶄɿApp Engine ϑΝΠΞΥʔϧGCP αʔϏεؒͷ௨৴ϒϩοΫ͞ΕΔ͜ͱ͕͋Δ- Cloud Pub/Sub άϩʔόϧͳαʔϏεͰ͋ΔͨΊɺ ϗϫΠτϦετՃͰ͖ͳ͍- Cloud Tasks ෦తʹ URL ϑΣον αʔϏεΛ͍ͬͯΔͨΊɺ URL ϑΣον αʔϏεͷ IP ΞυϨεΛڐՄ͢Δ55CloudStorageCloudFunctionsApp EngineCloud TasksApp EngineCloud Pub/SubCloudStorageApp Engine
ϋϚΓͲ͜ΖᶅɿCloud Firestore ͷσʔλϕʔεઃܭSQL ͷΑ͏ͳ COUNT ؔͳ͍- υΩϡϝϯτΛΨόͬͱऔ͖ͬͯͯΧϯτ͢Δ͜ͱͰ͖Δ- ࢄΧϯλΛ͏- ੍ɿ1 υΩϡϝϯτ͋ͨΓ 1 ඵؒʹ 1 ճ͔͠ߋ৽Ͱ͖ͳ͍- Χϯλ༻ͷυΩϡϝϯτΛෳ༻ҙͯ͠ɺϥϯμϜʹΠϯΫϦϝϯτ͢Δ- શυΩϡϝϯτΛऔಘͯ͠߹ܭΛܭࢉ͢Δ- FieldValue.increment() Λ͏ʢv1.1.0 ͰϦϦʔεʣ- ཁ݅ʹΑͬͯɺRedis ͳͲͰΧϯτ͢Δͷ͋Γ56CloudFirestore
Firestore Ͱؔ࿈ΛͲͷΑ͏ʹ͔࣋ͭॻ͖ࠐΈಡΈࠐΈͷසͰஅ͢Δ- 1 : N ͷσʔλʹ͍ͭͯ- Ұॹʹѻ͏͜ͱ͕ଟ͍߹ => Array ܕͱͯ͠ϑΟʔϧυʹ࣋ͨͤΔ- 1 υΩϡϝϯτ͋ͨΓ 1 ඵؒʹ 1 ճ͔͠ߋ৽Ͱ͖ͳ͍- ผʑʹѻ͏͜ͱ͕ଟ͍߹ => αϒίϨΫγϣϯʹ࣋ͨͤΔ- ίϨΫγϣϯͱαϒίϨΫγϣϯʹ·͕ͨͬͨΫΤϦͰ͖ͳ͍57CloudFirestore
GCP αʔόʔϨε αʔϏεͷ׆༻ࣄྫ ʙ৽ͨͳσʔλԽαʔϏεͷݕূʙ- GCP αʔόʔϨε αʔϏεʹ͍ͭͯ- ΞʔΩςΫνϟ- ϝϦοτ- ϋϚΓͲ͜Ζ- ࠓޙͷ՝- ·ͱΊ58
ࠓޙͷ՝- ᶃɿ։ൃڥ- ᶄɿಈ࡞֬ೝ- ᶅɿੳܥΫΤϦ- ᶆɿΤϥʔ௨=> ͜Ε͔Β͍͑ͯ͘59
ࠓޙͷ՝ᶃɿ։ൃڥ- Cloud Firestore 1 ϓϩδΣΫτʹ 1 ͔ͭ͠ DB Λ࡞Εͳ͍- ։ൃɾࣗಈςετ- Cloud Tasks Push ͳͷͰɺϩʔΧϧʹ͚ΒΕͳ͍- ։ൃ࣌ Cloud Tasks ΛϞοΫ͢Δ͔60
ࠓޙͷ՝ᶄɿಈ࡞֬ೝ- Heroku Review Apps ͷΑ͏ͳ͜ͱΛ͍ͨ͠- PR ͝ͱʹڥΛཱͯΔ- Google App Engine ෳόʔδϣϯͷΠϯελϯεΛಉ࣌ʹಈ͔͢͜ͱ͕Ͱ͖Δ61
ࠓޙͷ՝ᶅɿੳܥΫΤϦ- SQL ͷΑ͏ʹॊೈͳΫΤϦͳ͍- BigQuery ʹσʔλΛΠϯϙʔτ͢Δ62
ࠓޙͷ՝ᶆɿΤϥʔ௨- Stackdriver Error Reporting ͔Βͷ ϝʔϧ௨Λ Gmail ͷϑΟϧλػೳͰSlack ʹ௨͍ͯ͠Δ- λΠϜϥά͕͋Δ- ςΩετΛΧελϚΠζͰ͖ͳ͍- Datadog ͷूΛݕ౼63
GCP αʔόʔϨε αʔϏεͷ׆༻ࣄྫ ʙ৽ͨͳσʔλԽαʔϏεͷݕূʙ- GCP αʔόʔϨε αʔϏεʹ͍ͭͯ- ΞʔΩςΫνϟ- ϝϦοτ- ϋϚΓͲ͜Ζ- ࠓޙͷ՝- ·ͱΊ64
·ͱΊGCP αʔόʔϨε αʔϏε- ݶΒΕͨϦιʔεͰεϐʔυײΛ࣋ͬͯ։ൃͰ͖Δ- ϑϧϚωʔδυɺΦʔτεέʔϧͷྑ͞ΛڗडͰ͖ΔҰํͰɺ੍Ϋη͕͋Δ- ϝϯόʔ͕૿͑ͯ͘Δͱɺ։ൃڥͳͲͷඋʹ͕ඞཁ65
͍͞͝ʹ
We are hiring!
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠