2019年8月2日に #serverlessosaka で発表したスライドです。
ϋοΧιϯత ʹ ࡞ͬͨϓϩμΫτΛվળ͠ɺFirebaseΛʮͪΌΜͱʯ͍ͬͯ͘2019.08.01 #serverlessosaka Takuma HANATANI (@potato4d)
View Slide
HANATANI Takuma(@potato4d)• Ֆ୩ຏ / @potato4d• Web Application Developer• Work at...• LINE Corp: UIT dept. Frontend Engineer / Developer Relations• ElevenBack: President, Technical Advisor, Web Engineer• ౦ژࡏॅ͚ͩͲؔग़ͳͷͰͳ͠ʹདྷ·ͨ͠
Agenda1. ࠓ͢Ϟϊͱίτͷհ2. Firebase ʹدͤ͗͢ͳ͍ 1st release ʹ͚ͨ։ൃํ๏ʹ͍ͭͯ3. Firebase ΛʮΒ͘͠ʯΘͳ͍͜ͱʹΑΔ՝ʹ͍ͭͯ4. ঃʑʹ Firebase Λ׆༻͢Δํ๏Ҡߦ͢ΔதͰͬͨ͜ͱ5. ·ͱΊ
ࠓ͢Ϟϊͱίτͷհ
JSLounge Archives/https://jslounge-archives.elevenback.jp/
Nuxt.js, Firebase, Stripe Λϑϧ׆༻ͯ͠αʔόʔϨεͰJAMStackͳECαΠτΛ2Ͱ։ൃͨ͠https://qiita.com/potato4d/items/13050d5934ff592dc539
Agenda1. ࠓ͢Ϟϊͱίτͷհ2. 1st release ʹ࠷దԽͨ͠։ൃͱ Firebase Β͘͠ͳ͞ɾͦͷ՝3. Cloud Firestore ͱ Cloud Functions ͷ͍͚έʔεελσΟ4. ࠓ࡞ΔͳΒࣄલʹ͓͖ͬͯ͘͜ͱɾճΓέʔεελσΟ5. ·ͱΊ
1st release ʹ࠷దԽͨ͠։ൃελΠϧʹ͍ͭͯ
1st release ͷͱ͖ͷঢ়ଶ• ࣮࣭తͳ 2 day ϋοΧιϯ• ʮϋϯζΦϯͷڭࡐΛΦϯϥΠϯֶशʹར༻Ͱ͖Δମݧʯ͕ΰʔϧ• SPA / API + Firebase ߏ• SPA Nuxt.js Ͱ API Firebase Cloud Functions, ೝূ Firebase Auth• ܾࡁ͕ؔΘΔγεςϜͷͨΊɺશମతʹ҆શʹ͢ํʹ• ෆ߹͕ى͜Βͳ͍ɺى͖ͨ߹ӡӦଆ͕ෆརӹΛඃΔܗͰͷઃܭ• ͦͷͨΊ Firestore ͷΞΫηεΛ෧ҹ Ͱ࣮
1st release ͷͱ͖ͷঢ়ଶ• MVP Λߴʹಧ͚ΔͨΊͷ DX ڥʹࣄલࢿ• CircleCI ʹΑΔ CI / CD• TypeScript Ͱهड़͞Εͨ Functions ͷιʔείʔυ• ͦͷଞࡉ͔ͳٕज़બఆʹΑΔվળ͍͢͠• ҰํͰύϑΥʔϚϯε Firebase ͰͷϦϦʔεʹ͚ͯଥڠ• Firestore Regional ͳ US Region (αʔϏεຊ͚)• ҰԠҰճషͬͨίωΫγϣϯΛ࠶ར༻͢ΔͳͲͰ͖Δखଧ͓ͬͯ͘
ӡ༻ޙʹݦࡏԽ͖ͯͨ͠՝ (Ұ෦)
Cloud Functions ͷ HTTP ϑοΫ ͍͗͢• ͍͍ͩͨ Functions ͳͷͦΕͦΕͰͭΒ͍• ొਓ͕Ϣʔβʔใ(ܾࡁ͋Γ), ڭࡐαϚϦ(public), ڭࡐৄࡉ(private), ܾࡁϩάͷ 4 ͭ• ۪ʹεΩʔϚఆٛ͢ΔͱϦεΩʔͱ͍͑ Firebase Β͘͠࡞Δͱ͕͔͔࣌ؒΔ• ݁Ռେମ Functions ʹͳͬͨܦҢ• ϑϩϯτΤϯυͷ Firebase Auth Ͱ JWT ΛͱΔ → Authorization ϔομʔʹͿͪ͜Ή• JWT Λͬͯೝূͯ͠ऴΘΓͳͷͰָͳͷָ• ग़ͨ͘͠ͳ͍ใΛؾܰʹϚεΫͰ͖Δͷศར
Cloud Functions ͷ HTTP ϑοΫ ͍͗͢• ͨͩҰɺͨͩͨͩແବ͕ଟ͍• ͦͦಈ࡞͕ॏ͍• ਓ͕ଟ͔ͬͨΓίʔϧυελʔτͻ͍ͨͱ͖• ඇಉظͰྑ͍ॴ͕ಉظతʹͳͬͯ͠·͏• Functions Ͱ Promise.all ඦ྾ݓͬͯඍົ• ͕σΧ͍• ૄ݁߹Ͱͳ͍ܗͰͷػೳఏڙ FaaS ʹΒͤΔ͜ͱͰͳ͍
ٯʹ Firestore ͷϧʔϧ͕ࡶ͗͢service cloud.firestore {match /databases/{database}/documents {}}ຊʹԿڐՄ͍ͯ͠ͳ͍ঢ়ଶ͔Βελʔτ
ٯʹ Firestore ͷϧʔϧ͕ࡶ͗͢• Admin SDK Ҏ֎ͩͱԿͱΕͳ͍• ઌఔͷϧʔϧΛࢀর• Firebase Admin SDK Λ͑ͳ͍έʔε͕ग़͖ͯͨ• ͷͪʹཧը໘ SPA ͕ര • ݁Ռཧऀͨͪͷ uid ͷϋʔυίʔσΟϯάΛ͢Δ͜ͱʹ• Firestore ͔ΒऔΕྑ͍ใΛऔΒͣɺٯʹແବ͕૿͍͑ͯΔ• ී௨ʹΊ͍ͨ
ͦͷଞଟ͘ͷΈঃʑʹղফ……࣮ Admin SDK ͷ TS ͷܕ͕ҧ͏ࢥͬͨΑΓਓ͕͖ͨΒ Functions ΓଟগؾʹͳΔͦͦใͷऔಘΛશ෦ೝূલఏʹ͚ͯͨ͠ͲγΣΞ URL ࡞ͬͨཧγϦΞϧΩʔͱͷඥ͚ཧ͍ͨ͠
͔࣍Β Firebase Βͨ͘͠͠෦Λ͝հ
Cloud Firestore ͱ Cloud Functions ͷ͍͚έʔεελσΟ
ϢʔβʔใΛׂͯ͠ Functions ͷར༻ΛݮΒ͢• ೝূࡁϢʔβʔ͕ࣗͷใΛऔΔ࣌ʹ Firestore ͔ΒऔΔ• ઌड़ͷ௨Γܾࡁσʔλͷ߹Ͱ Functions ͔Βऔಘ͍ͯͨ͠• ܾࡁؔ࿈ͷσʔλͷϚεΫͷͨΊɺ Functions Ͱऔͬͯফ͢• ·ͣϢʔβʔใΛ public Ͱྑ͍ͷͱྑ͘ͳ͍ͷʹׂ• ओʹϩάΠϯޙͷϑΝʔετϏϡʔͷඳըύϑΥʔϚϯε্ͷͨΊ• Ͳ͏ͯ͠ಉظతͳ͕ͪൃੜ͢Δ• Πϯελϯε͕มΘΔͱ͖ͷίʔϧυελʔτඍົ
ϢʔβʔใΛׂͯ͠ Functions ͷར༻ΛݮΒ͢Ϣʔβʔ͕ಡΜͰ͍͍ܾࡁϑϥάใͱߪೖ݁ՌͷΈΛׂͯ͠
ͪͳΈʹܾࡁͷ෦ Functions ʹՄೳͳݶΓཔΔ• ݁Ռతʹେ෦ Firestore ʹ͕ͨ͠ɺܾࡁίʔυ Functions• ܾࡁͷϦΫΤετࣗମͲͷΈͪ HTTP τϦΨʔͰ࣮͢Δ• ٯʹݴ͑͜͜Ҏ֎ HTTP τϦΨʔ͕ͳͯ͘ྑ͍• ͱ͍ܾ͑ࡁΤϥʔ࣌ͷΓ͠ɺޙॲཧࣦഊ࣌ͷ߹ੑΛߟྀ͢ΔͱҰͭͷ Function Ͱ௨͠Ͱ࣮ߦͯ͠͠·͏΄͏͕ྑ͍• Firestore ͷτϥϯβΫγϣϯར༻ՄೳʹͳΔͳͲϝϦοτେ͖͍
ࠓ࡞ΔͳΒࣄલʹ͓͖ͬͯ͘͜ͱɾճΓέʔεελσΟ
ཧը໘ͷݖݶཧΛϚελσʔλ͔ΒҾ͘• ։ൃॳظͷ CLI ཧʹݶք͕དྷΔ• ΪϦΪϦ·ͰGit ཧͨ͠ JSON Λॻ͖·ͬͯ͘ sync ͢Δӡ༻Λͨ͠• ӡ༻͢ΔʹͭΕͯ DB Λ৮Εͯཉ͍͠ਓ͕ෳਓʹͳͬͨ• ͦΕʹͬͯཧը໘Λ༻ҙ͢Δ͜ͱʹ• ݱ࣮ͷϋϯζΦϯͱ࿈ಈ͢ΔͨΊʹγϦΞϧΩʔͷൃߦݖݶ͕ཉ͍͠• ࣗҎ֎͕ߨࢣΛΔ࣌ʹڭࡐσʔλ͚ͩॻ͖ࠐΈݖݶΛ͍ͨ͠
ཧϢʔβʔͷVJEϕʔεͰΨοπϦϋʔυίʔσΟϯάཧը໘ͷݖݶཧΛϚελσʔλ͔ΒҾ͘
• ઐ༻ͷ masterdata/permissions Λ࡞• string[] ͳ editor ͱ string[] ͳ admin Λ༻ҙ• ݖݶൣғʹ͋ΔϢʔβʔʹ͍ͭͯ୭Ͱ৮ΕΔΑ͏ʹվળ• Firestore ͷϧʔϧΛมߋ͠ɺݖݶΛಡΈࠐΉํ๏ʹมߋ• get(/databases/$(database)/documents/masterdata/permissions)• rules ͷ get Λ͏͜ͱͰ Firestore ͷσʔλ͔ΒݖݶΛ༩Ͱ͖Δ• ࠓճ request.token.uid in get() ͱ͢Δ͜ͱͰରԠཧը໘ͷݖݶཧΛϚελσʔλ͔ΒҾ͘
Ұ൪ύϑΥʔϚϯεͷग़ΔϦʔδϣϯʹ͢Δ• ͜ΕΛϦϦʔεͨ࣌͠ Firestore ͷ౦ژϦʔδϣϯ͕ͳ͔ͬͨ• ݁ՌͦͦϨΠςϯγ͕͋Δ͔ΒͰ Functions Λڐ༰ͨ͠ܦҢ• ͷͪ(2019/03)ʹશҠߦΛ࣮ࢪ• ࠓ global ͳΒ౦ژϦʔδϣϯͷϓϩδΣΫτʹҠߦਪ• ϓϩδΣΫτ͔Β৽͘͠࡞Γ͢ඞཁ͕͋ΓɺAuth Ҡߦ͕ͭΒ͍ͷͰҙ• ࣌ Google Cloud ͷϓϩδΣΫτʹมߋ → GCS ʹు͖ग़͢ → GCS͔ΒΠϯϙʔτͷඞཁ༗(࠷৽ͷঢ়گະΩϟονΞοϓ)
Ұ൪ύϑΥʔϚϯεͷग़ΔϦʔδϣϯʹ͢ΔଞͷӡӦϝϯόʔ͕ؒҧ͑ͳ͍Α͏ʹࠓͻͲ͘ࡶͳ໊લͰଘ໋த
·ͱΊ• ॳظ։ൃʹ͓͍ͯ Functions ʹد͖ͤΔͷଥੑ͕͋ͬͨ• ࣮ࡍʹ Firestore ʹҠߦ࣌ϧʔϧͷߟྀ࿙ΕͷσάϨͰҰॠμϯϩʔυ͠์ʹͳΓ͔͚ͨ͜ͱ• ݁ߏ Firestore ͷςετࡶ͔ͭ؆୯Ͱͳ͍……• ҰํͰ Functions པΓ ͷͪͷଥੑύϑΥʔϚϯεʹ՝• Web ͷ߹ΦϑϥΠϯͷ Firestore ʹ͍ͭͯߟ͑ͳ͍͍ͯ͘ͷ͕ٹ͍• ͱ͍͑ Firestore Ͱ݁Ͱ͖Δͱ͜Ζॱ࣍Ҡߦ͠Α͏
·ͱΊ• ཧը໘ͷ Web UI Λ࡞ΔετʔϦʔग़ͯ͘ΔͷͰߟྀ͢Δ• RDB ͳͲͱҧͬͯγεςϜͷϢʔβʔͰݖݶΛཧͰ͖ͳ͍ͷͰ͡Ί͔Βઃܭ͓ͯ͘͜͠ͱ• ࠷ݶ member / admin ͘Β͍࡞͓ͬͯ͘ͱָ• DX Λ্ͤ͞Δ͕͋ΔͷεϜʔζͳҠߦʹܨ͕ΔͷͰ ˕• CI / CD ڥ͕Ͱ͖͍ͯΔͱվળָ͕ • Functions ͕ TypeScript Ͱॻ͔Ε͍ͯΔͱҠߦָ͕ ͳͲ