Slide 1

Slide 1 text

࣮ફHexaville Yuki Takei@Tokyo Server Side Swift Meetup #8 27 Jun, 2017 ʙ 5෼Ͱ࡞ΔαʔόʔϨεͳSwift੡SNSೝূαʔόʔ ʙ

Slide 2

Slide 2 text

ࣗݾ঺հ

Slide 3

Slide 3 text

• Hexavilleͷ঺հ • 5෼Ͱ࡞ΔSwift੡SNSೝূαʔόʔ • HexavilleͰwebαʔϏεΛ࡞Δ্Ͱͷϊ΢ϋ΢ • CIɺσϓϩΠͷࣗಈԽ • ࠓޙͷϩʔυϚοϓ ΞδΣϯμ

Slide 4

Slide 4 text

Hexavilleͷ঺հ

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

ࠓྲྀߦΓͷαʔόʔϨε αʔόʔϨείϯϐϡʔςΟϯάͱ͸ɺΫϥ΢ υϓϩόΠμʔ͕ΞϓϦέʔγϣϯʹඞཁͳϚ γϯϦιʔεͷׂΓ౰ͯΛಈతʹ؅ཧ͠ɺࣄલ ʹߪೖ͞Εͨ͜ͱʹجͮ͘੥ٻͰ͸ͳ͘ɺ֤Ξ ϓϦέʔγϣϯཁٻΛຬͨͨ͢Ίʹ࢖༻͞ΕΔ ݸʑͷϦιʔεྔʹج͍ͮͨ੥ٻΛߦ͏Α͏ͳ Ϋϥ΢υίϯϐϡʔςΟϯάϞσϧɻ wikipedia αʔόϨεɾίϯϐϡʔςΟϯά ΑΓ

Slide 7

Slide 7 text

Hexavilleͱ͸ • Swift੡ͷαʔόʔϨε؀ڥΛߏங͢ΔϑϨʔϜϫʔΫͱͦͷ πʔϧ܈ (ݱࡏ͸AWS Lambda + API GatewayͷΈ) • ίʔυϕʔε͕SwiftͷͨΊɺiOSΞϓϦέʔγϣϯΛॻ͘Ԇ௕ ͰαʔόʔϓϩάϥϜΛهड़Ͱ͖Δɻ • ී௨ͷwebΞϓϦέʔγϣϯΛ࡞ͬͯσϓϩΠ͢Δ͚ͩ • ίϚϯυҰͭͰΫϥ΢υ্ʹσϓϩΠ͞Εɺαʔόʔӡ༻ͳ ͠ͰαʔϏεΛ։࢝Ͱ͖Δ • XcodeͰͷ։ൃ؀ڥΛఏڙɺInstrumentsɺLLDBΛ࢖ͬͨσ όοά΋Մೳ

Slide 8

Slide 8 text

Πϯετʔϧ

Slide 9

Slide 9 text

1ίϚϯυͰΠϯετʔϧՄೳ

Slide 10

Slide 10 text

HexavilleͷϓϩδΣΫτΛ࡞੒͢Δ

Slide 11

Slide 11 text

HexavilleͷϓϩδΣΫτΛ࡞੒͢Δ

Slide 12

Slide 12 text

ઃఆϑΝΠϧ(Hexavillefile.yml)

Slide 13

Slide 13 text

HexavilleΛ࢖ͬͨWebΞϓϦέʔγϣϯͷهड़ํ๏

Slide 14

Slide 14 text

HexavilleΛ࢖ͬͨWebΞϓϦέʔγϣϯͷهड़ํ๏ ϑϨʔϜϫʔΫͷΠϯελϯεΛ࡞੒

Slide 15

Slide 15 text

HexavilleΛ࢖ͬͨWebΞϓϦέʔγϣϯͷهड़ํ๏ Middlewareͷొ࿥ʢඞਢͰ͸ͳ͍ʣ

Slide 16

Slide 16 text

HexavilleΛ࢖ͬͨWebΞϓϦέʔγϣϯͷهड़ํ๏ RoutingͱͦͷURIͷϓϩάϥϜͷ࣮૷

Slide 17

Slide 17 text

HexavilleΛ࢖ͬͨWebΞϓϦέʔγϣϯͷهड़ํ๏ ΞϓϦέʔγϣϯͷىಈ

Slide 18

Slide 18 text

$ hexaville deploy Hello σϓϩΠ

Slide 19

Slide 19 text

$ hexaville deploy Hello Start to build swift... Building application.... Generating Routing Manifest file.... Sending build context to Docker daemon 176 MB Step 1/11 : FROM ubuntu:14.04 ---> 132b7427a3b4 Step 2/11 : RUN apt-get update -y ---> Using cache ---> fd9a040329d6 Step 3/11 : RUN apt-get install -y clang libicu-dev libbsd-dev uuid-dev git libxml2-dev libxslt1-dev python-dev libcurl4-openssl-dev wget ---> Using cache ---> c4890f13de61 Step 4/11 : ENV SWIFT_DOWNLOAD_URL https://swift.org/builds/swift-3.1-release/ ubuntu1404/swift-3.1-RELEASE/swift-3.1-RELEASE-ubuntu14.04.tar.gz ---> Using cache ---> a5ac353284e3 Step 5/11 : ENV SWIFTFILE swift-3.1-RELEASE-ubuntu14.04 ---> Using cache Ϗϧυ։࢝ σϓϩΠ

Slide 20

Slide 20 text

σϓϩΠͷ׬ྃ Deploying to staging ###################################################### Information ApplicationName: AuthService Endpoint: https://bma4gjwu36.execute-api.ap-northeast-1.amazonaws.com/staging Stage: staging ###################################################### All Done.

Slide 21

Slide 21 text

Routingͷ֬ೝ $ hexaville routes

Slide 22

Slide 22 text

Routingͷ֬ೝ $ hexaville routes Endpoint: https://bma4gjwu36.execute-api.ap-northeast-1.amazonaws.com/staging Routes: GET /auth/twitter/callback GET /auth/twitter GET / GET /auth/facebook GET /auth/facebook/callback

Slide 23

Slide 23 text

XcodeΛ࢖ͬͨɺMac্Ͱͷ։ൃͱDebugαʔόʔͷىಈ https://youtu.be/Lj7Jg_XlmIU σϞ

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

5෼Ͱ࡞ΔSwift੡SNSೝূαʔόʔ

Slide 26

Slide 26 text

webαʔϏεΛ࡞Δ্ͰɺSNSΞΧ΢ϯτΛ࢖ͬͨ ϩάΠϯػೳ͸ࠓ΍ແͯ͘͸ͳΒͳ͍΋ͷʹ…

Slide 27

Slide 27 text

ͨͩɺຖ౓ຖ౓࡞Δͷ͸໘౗

Slide 28

Slide 28 text

֤αʔϏε͕SNSೝূػೳΛ͍࣋ͬͯΔέʔε Service 1 Service 2 DB DB

Slide 29

Slide 29 text

Service3, Service4ͱ૿͍͑ͯͬͨΒͲ͏ͳͬͪΌ͏ʁ

Slide 30

Slide 30 text

ͦΜͳͱ͖͸ɺαʔόʔϨεͷग़൪

Slide 31

Slide 31 text

HexavilleΛ࢖ͬͯೝূαʔϏεΛαʔόʔϨεԽ DB Hexaville Auth Service Service 2 DB Service 1

Slide 32

Slide 32 text

DB Hexaville Auth Service Service 2 DB Service 1 ֤αʔϏε͕ೝূϓϩάϥϜΛ࣋ͨͳ͍͍ͯ͘ HexavilleΛ࢖ͬͯೝূαʔϏεΛαʔόʔϨεԽ

Slide 33

Slide 33 text

DB Hexaville Auth Service Service 2 DB Service 1 ೝূαʔϏε͕Ұͭʹ·ͱ·Δ্ɺӡ༻ෆཁʹʂ HexavilleΛ࢖ͬͯೝূαʔϏεΛαʔόʔϨεԽ

Slide 34

Slide 34 text

ೝূϓϩάϥϜΛ֤αʔϏεʹ࣮૷͢Δ࣌୅͸ɺ ΋͏ऴΘΓͭͭ͋Δ

Slide 35

Slide 35 text

Ͱ͸ૣ଎ɺ5෼Ͱαʔόʔӡ༻͕ෆཁͳೝূαʔϏεΛ ࡞ͬͯΈ·͠ΐ͏

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text

• Hexavilleʹ༷ʑͳೝূػೳΛఏڙ͢ΔϓϥάΠϯ • OAuth1, OAuth2ΫϥΠΞϯτΛఏڙ • FacebookɺGithubɺGoogle, TwitterͷOAuthΛσϑΥϧτͰ ఏڙ • HexavilleͷRouterͱͯ͠ಈ࡞͢Δ • ηογϣϯΛར༻Մೳ(Memory, Redis, Dynamodb(࣮૷த)) • ಠࣗͷOAuthΫϥΠΞϯτΛϓϩτίϧʹԊͬͯ؆୯ʹ࡞੒ Մೳ HexavilleAuth

Slide 38

Slide 38 text

Facebook(OAuth2)ͷྫ

Slide 39

Slide 39 text

HexavilleAuthͷΠϯελϯε࡞੒ Facebook(OAuth2)ͷྫ

Slide 40

Slide 40 text

FacebookAuthorizationProviderͷΠϯελϯε࡞੒ Facebook(OAuth2)ͷྫ

Slide 41

Slide 41 text

PATHɿೝূURL(͜͜ʹདྷͨΒfacebookʹϦμΠϨΫτ) Facebook(OAuth2)ͷྫ

Slide 42

Slide 42 text

consumerKey, SecretɿFBΞϓϦ༻ͷΫϨσϯγϟϧ Facebook(OAuth2)ͷྫ

Slide 43

Slide 43 text

callbackURL: OAuth੒ޭޙͷભҠઌ Facebook(OAuth2)ͷྫ

Slide 44

Slide 44 text

scope: OAuth2ͷείʔϓ Facebook(OAuth2)ͷྫ

Slide 45

Slide 45 text

OAuth2ͷೝՄ͕௨ͬͨ৔߹ͷcallbackɻ credential(access-token)ɺೝՄuserͳͲͷ৘ใ ͕औಘͰ͖Δ Facebook(OAuth2)ͷྫ

Slide 46

Slide 46 text

HexavilleAuthͷΠϯελϯεʹ facebookProviderΛ௥Ճ Facebook(OAuth2)ͷྫ

Slide 47

Slide 47 text

Facebook(OAuth2)ͷྫ HexavilleAuthͷΠϯελϯεΛrouting͢Δ

Slide 48

Slide 48 text

͋ͱ͸hexaville deployίϚϯυͰɺ σϓϩΠ͢Δ͚ͩʂ

Slide 49

Slide 49 text

https://youtu.be/Uv-vma234UQ σϞ

Slide 50

Slide 50 text

5෼ͰೝূαʔϏε͕࡞Εͯ͠·͍·ͨ͠ ͔͠΋SwiftͰʂ

Slide 51

Slide 51 text

https://github.com/Hexaville/HexavilleAuth/blob/master/ Sources/HexavilleAuthExample/main.swift ͦͷଞɺTwitter΍GoogleͳͲͷαϯϓϧ͸ͪ͜Β͔Β

Slide 52

Slide 52 text

• device tokenͳͲͷొ࿥αʔόʔ • CRUDͷAPI΍JSON-RPCαʔόʔ • HTML഑৴αʔόʔ • ը૾ϦαΠζαʔόʔ(SwiftͱCϥΠϒϥϦͱͷ ਌࿨ੑͷߴ͞΋˓) ͦͷଞʹHexaville͕޲͍͍ͯΔαʔϏε

Slide 53

Slide 53 text

αʔόʔϨε͸ར఺Λ্͛Ε͹ΩϦ͕ͳ͍Ͱ͕͢ɺ൓໘ɺ ໰୊఺΋͍͔ͭ͘ଘࡏ͠·͢ɻ

Slide 54

Slide 54 text

HexavilleͰαʔόʔϨεΞϓϦέʔγϣϯΛ࡞Δࡍʹɺ ؾΛ͚ͭΔ఺΍ͦͷଞͷϊ΢ϋ΢Λ͝঺հ͠·͢ɻ

Slide 55

Slide 55 text

HexavilleͰwebαʔϏεΛ࡞Δ্Ͱͷϊ΢ϋ΢

Slide 56

Slide 56 text

Server ैདྷͷwebΞϓϦέʔγϣϯͷ࣮ߦϞσϧ DB connection pool

Slide 57

Slide 57 text

Lambda Function Lambda Function Lambda Function Lambda Function Lambda Function αʔόʔϨε ίϯϐϡʔςΟϯάͷ࣮ߦϞσϧ

Slide 58

Slide 58 text

DB Lambda Function Lambda Function Lambda Function Lambda Function Lambda Function αʔόʔϨε ίϯϐϡʔςΟϯάͷ࣮ߦϞσϧ(DB઀ଓ༗Γ)

Slide 59

Slide 59 text

αʔόʔϨε ίϯϐϡʔςΟϯάͷ࣮ߦϞσϧ(DB઀ଓ༗Γ) DB Lambda Function Lambda Function Lambda Function Lambda Function Lambda Function ΫϥΠΞϯτͷίωΫγϣϯ਺ || DBͷίωΫγϣϯ઀ଓ਺

Slide 60

Slide 60 text

αʔόʔϨε ίϯϐϡʔςΟϯάͷ࣮ߦϞσϧ(DB઀ଓ༗Γ) DB Lambda Function Lambda Function Lambda Function Lambda Function Lambda Function DB͸1connection = 1threadͰ ड͚෇͚Δ࣮૷͕ଟ͍

Slide 61

Slide 61 text

αʔόʔϨε ίϯϐϡʔςΟϯάͷ࣮ߦϞσϧ(DB઀ଓ༗Γ) DB Lambda Function Lambda Function Lambda Function Lambda Function Lambda Function ॏ͍ΫΤϦΛ౤͍͛ͯͳͯ͘΋ɺ େͨ͠਺ͷΫΤϦΛ౤͍͛ͯͳͯ͘΋ɺ ͋ͳͨͷDB͸൵໐Λ্͛Δ͜ͱʹͳΓ·͢ɻ

Slide 62

Slide 62 text

αʔόʔϨε ίϯϐϡʔςΟϯάͷ࣮ߦϞσϧ(DB઀ଓ༗Γ) DB Lambda Function Lambda Function Lambda Function Lambda Function Lambda Function RedisͳͲͷϊϯϒϩοΩϯάͳNoSQLσʔλ ϕʔε΋ྫ֎ʹ΋ΕͣɺίωΫγϣϯ਺΍ಉ࣮࣌ ߦ਺͕૿͑Ε͹ͦͷ෼DB΁ͷෛՙ΋্͕Δɻ ·ͨɺ઀ଓՄೳͳΫϥΠΞϯτ਺͸Ϛγϯεϖο Ϋʹґଘ͢ΔͨΊɺແବʹNode͕૿͑ΔՄೳੑ ΋ɻ

Slide 63

Slide 63 text

• ͦ΋ͦ΋ͦͷσʔλ͸ͦͷDBʹอଘ͢Δඞཁ͸͋Δͷ͔ʁ • DynamodbΛར༻͢Δ(ΩϟύγςΟʔϢχοτ͕Φʔτε έʔϧରԠ͠ɺίωΫγϣϯ਺Λجຊతʹؾʹ͢Δඞཁ͕ ແ͘ͳͬͨ) • DBίωΫγϣϯϓʔϧ༻ͷαʔόʔΫϥελʔΛ࡞Γɺ lambda͔Β͸ͦͷΫϥελʔʹ઀ଓ͠ɺΫϥελʔ಺ͷΠ ϯελϯε͕DB΁ͷ௨৴Λ୅ߦ͢Δɻ • SQSΛ࢖ͬͨδϣϒΩϡʔ+ϫʔΧʔύλʔϯͰඇಉظʹ DBΠϯαʔτ(SQSͷฒྻ࣮ޮੑೳະݕূ) ΫϥΠΞϯτͷίωΫγϣϯ਺ = DB઀ଓ਺ͷղܾҊ

Slide 64

Slide 64 text

ίʔϧυελʔτ໰୊ ॳճىಈ࣌΍ɺ͠͹Β͘ΞΫηε͕ແ͍৔߹ɺlambda͸ίʔ ϧυঢ়ଶʹҠߦ͢Δɻ ࣍ͷϦΫΤετͰίʔϧυঢ়ଶ͔Β෮ؼ͢Δ·ͰͷΞΠυϧ࣌ ͕ؒ͜ͷίʔϧυελʔτ໰୊Ͱ͋Δɻ(ίϯςφ΍ωοτ ϫʔΫΠϯλʔϑΣʔεͷηοτΞοϓʹ͕͔͔࣌ؒΔ) ࠷େͷ໰୊͸ɺϦΫΤετ͕λΠϜΞ΢τ͢Δ͔΋ͱ͍͏఺ (10ඵ)

Slide 65

Slide 65 text

ίʔϧυελʔτ໰୊ͷղܾҊ • ͦ΋ͦ΋ਓʹΑͬͯ͸໰୊ʹͳΒͳ͍έʔε΋ • τϥϑΟοΫ͕ৗ࣌͋Δ৔߹͸΄ͱΜͲൃੜ͠ ͳ͍ͱͷ͜ͱʢAWSެࣜεϥΠυΑΓʣ • lambdaͷεέδϡʔϦϯάػೳ(cronʹ૬౰)Λ ࢖ͬͯɺఆظతʹΤϯυϙΠϯτʹϦΫΤετ Λ౤͛Δ͜ͱͰɺ΢ΥʔϜঢ়ଶΛอͭ

Slide 66

Slide 66 text

• Hexaville͸όΠφϦίϯςϯπͷϨεϙϯε͕Մೳɻ= SwiftProtobufͱNSURLSessionͰ؆୯ɺ҆શʹ௨৴ग़དྷΔ • SPM੡ͷϥΠϒϥϦ͕ͦͷ··࢖͑Δ • ΫϥΠΞϯτϥΠϒϥϦ΋ͦͷ··࢖͑Δέʔε΋ (SwiftyJSONɺSwiftProtoBuf etc..) • VPC΍ΧελϜυϝΠϯ͕࢖͑Δ • Session͕࢖͑Δ • Linux͔Β΋deployͰ͖Δ ͦͷଞHexavilleͰग़དྷΔ͜ͱʢൈਮʣ

Slide 67

Slide 67 text

• Hexaville͸όΠφϦίϯςϯπͷϨεϙϯε͕Մೳɻ= SwiftProtobufͱNSURLSessionͰ؆୯ɺ҆શʹ௨৴ग़དྷΔ • SPM੡ͷϥΠϒϥϦ͕ͦͷ··࢖͑Δ • ΫϥΠΞϯτϥΠϒϥϦ΋ͦͷ··࢖͑Δέʔε΋ (SwiftyJSONɺSwiftProtoBuf etc..) • VPC΍ΧελϜυϝΠϯ͕࢖͑Δ • Session͕࢖͑Δ • Linux͔Β΋deployͰ͖Δ ͦͷଞϊ΢ϋ΢

Slide 68

Slide 68 text

ͱ͍͏͜ͱ͸…!

Slide 69

Slide 69 text

CIɺσϓϩΠͷࣗಈԽ

Slide 70

Slide 70 text

ݱࡏCI؀ڥ͸ܶతʹ޲্͠ɺ ແྉαʔϏε͕୆಄͠·͍ͬͯ͘·͢Ͷɻ

Slide 71

Slide 71 text

Hexaville͸ϝδϟʔͳCIαʔϏεͰಈ࡞͢Δ

Slide 72

Slide 72 text

Hexaville͸Linux͔Β΋σϓϩΠՄೳͳͷͰɺ ແྉͰCI؀ڥΛ࡞Δ͜ͱ͕ग़དྷ·͢ɻ

Slide 73

Slide 73 text

Travis͔ΒࣗಈσϓϩΠ͢Δྫ

Slide 74

Slide 74 text

Hexaville͸ϩʔΧϧͰ΋αʔόʔΛىಈͰ͖ΔͷͰɺ APIͷςετίʔυ΋؆୯ʹॻ͚·͢

Slide 75

Slide 75 text

αʔόʔϨεͰ΋؆୯ʹCIΛಋೖՄೳʂ

Slide 76

Slide 76 text

ࠓޙͷϩʔυϚοϓ

Slide 77

Slide 77 text

• Dynamodb΁ͷ؆қΞΫηεAPI • MysqlɺRedisͷίωΫγϣϯϓʔϦϯάαʔόʔΛECSαʔϏεͱ ͯ͠ఏڙ • ϩάू໿ϓϥάΠϯͷ։ൃ • Dockerίϯςφ಺Ͱςετίʔυ࣮ߦͷαϙʔτ(CI؀ڥʹSwiftࣗ ମͷΠϯετʔϧΛ͠ͳͯ͘ࡁΉΑ͏ʹ) • grpcͷΑ͏ͳܗͰΫϥΠΞϯτ <-> αʔόʔؒͷαʔϏεͷΠλʔ ϑΣʔεΛఆٛͰ͖ΔΑ͏ʹʢTLS+http1.1ʣ • SwiftެࣜHTTP APIͱͷ౷߹ ࠓޙͷϩʔυϚοϓ

Slide 78

Slide 78 text

HexavilleΛ࢖ͬͯɺ Server SideͰ΋ΨϯΨϯSwiftॻ͖·͠ΐ͏ʂ

Slide 79

Slide 79 text

ڵຯͷ͋Δํ͸ɺ͓ؾܰʹ։ൃʹ͝ࢀՃԼ͍͞ʂ

Slide 80

Slide 80 text

͓஌Βͤ

Slide 81

Slide 81 text

No content

Slide 82

Slide 82 text

No content

Slide 83

Slide 83 text

builderscon 2017Ͱ࿩͠·͢ʂ 8݄5೔ PM3:50ʙ

Slide 84

Slide 84 text

ઌఔͷϩʔυϚοϓΛؚΊ࣮ͨફతͳ Hexaville։ൃ/ӡ༻ͷ࿩ͷ΄͔ɺHTTP APIͱͷ౷߹΍ Swiftαʔόʔ։ൃͷ࠷લઢʹ͍ͭͯൃද͠·͢ɻ

Slide 85

Slide 85 text

No content

Slide 86

Slide 86 text

νέοτͷൢച͸ऴྃͯ͠͠·ͬͨ໛༷Ͱ͕͢ɺ ௥Ճൢച΋༧ఆ͍ͯ͠ΔʁΈ͍ͨͳͷͰνέοτ ແ͍͚Ͳ౰೔ࢀՃ͍ͨ͠ͱ͍͏ํ͸ɺ #buidersconΛ͚ͭͯTweetͯ͠ΈͯԼ͍͞ʂ

Slide 87

Slide 87 text

͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ