Slide 1

Slide 1 text

900ສμ΢ϯϩʔυΞϓϦ ʰGunosyʱΛࢧ͑Δ େن໛ϞόΠϧϓογϡ௨஌ج൫ 2015.6.3(AWS(Summit(Tokyo(2015(DevCon 1

Slide 2

Slide 2 text

ࣗݾ঺հ • ӿຊ"හؙ"(@toshimaru_e) • WEBΤϯδχΞˏGunosy • GunosyͰ͸Railsॻ͍ͯ·͢ • ޷͖ͳAWS"Service:"OpsWorks 2

Slide 3

Slide 3 text

ΞδΣϯμ • ୈҰ෦"Gunosyͷϓογϡج൫ • ୈೋ෦"GunosyͰͷAmazon"SNSར༻ࣄྫ 3

Slide 4

Slide 4 text

Gunosy • χϡʔεΞϓϦʢiPhone/Andoidʣ • 900ສμ΢ϯϩʔυ • ʮ৘ใΛੈքதͷਓʹ࠷దʹಧ͚Δʯ • ʲએ఻ʳઌ೔-gunosy.com-ΛେܕϦ χϡʔΞϧ 4

Slide 5

Slide 5 text

Gunosyͱϓογϡ௨஌'! • ϞόΠϧϓογϡ௨஌͸DAUΛࢧ͑Δॏཁཁૉ • ϓογϡ௨஌͸GunosyΞϓϦΛ։͖͔͚ͬ͘Λ༩͑Δ+→+Ϣʔ βʔɾϦςϯγϣϯ • ϓογϡ௨஌݁Ռ͕DAUΛࠨӈ͢Δ 5

Slide 6

Slide 6 text

̎ͭͷϓογϡ௨஌ 1. ఆ࣌ϓογϡ • ேɾனɾ༦ɾ໷ͷܾ·ͬͨ࣌ؒͷϓογϡ௨஌ 2. ଎ใϓογϡ • ଎ใੑͷ͋Δଈ࣌ૹΓ͍ͨϓογϡ௨஌ • ྫ:&େ͖ͳ஍਒ɺେ͖ͳࣄ݅ 6

Slide 7

Slide 7 text

ఆ࣌ϓογϡ!! • ʲ͍ͭ❓ʳ"Ϣʔβʔ͕ઃఆͨ࣌ؒ͠ʹʢேɾனɾ༦ɾ໷ͷ̐ε ϩοτʣɺ • ʲ୭ʹ❓ʳʢϓογϡ௨஌ઃఆࡁΈͷʣϢʔβʔʹɺ • ʲͲΕ͘Β͍Ͱ❓ʳ"ʢAPIαʔόʔʹෛՙΛ͔͚ͳ͍ఔ౓Ͱʣ Ͱ͖Δ͚ͩ୹࣌ؒͰɺ • ʲԿΛ❓ʳ"ద੾ͳλΠτϧɾ಺༰Ͱϓογϡ௨஌ΛૹΔ 7

Slide 8

Slide 8 text

଎ใϓογϡ!! • ʲ͍ͭ❓ʳ"େ͖ͳࣄ݅ɾࣄނ͕ىͬͨ͜ॠؒʹɺ • ʲ୭ʹ❓ʳʢϓογϡ௨஌ઃఆࡁΈͷʣϢʔβʔʹɺ • ʲͲΕ͘Β͍Ͱ❓ʳ"Ͱ͖Δ͚ͩ୹࣌ؒͰɺ • ʲԿΛ❓ʳ"ద੾ͳλΠτϧɾ಺༰Ͱϓογϡ௨஌ΛૹΔ 8

Slide 9

Slide 9 text

Gunosyϓογϡ௨஌ͷྺ࢙ͱมભ • ୈҰظ"~ϩʔΧϧϓογϡ࣌୅~ • ୈೋظ"~ϦϞʔτϓογϡҠߦظ~ • ୈࡾظ"~ຊ֨ϦϞʔτϓογϡ࣌୅~ • ୈ࢛ظ"~ύʔιφϥΠζυϓογϡ࣌୅~ 9

Slide 10

Slide 10 text

ϓογϡୈҰظ ~ϩʔΧϧϓογϡ࣌୅~ • ϩʔΧϧϓογϡ࣌୅ • ઃఆ͞Εͨ࣌ؒʹʮχϡʔε͕ಧ͖· ͨ͠ʯͱ͍͏ఆܕจͰͷ௨஌ • ΫϥΠΞϯτଆʢiOS/AndroidʣͰ࣮૷ 10

Slide 11

Slide 11 text

݁Ռ • ϩʔΧϧϓογϡ௨஌Λ͖͔͚ͬʹΞϓϦΛ্ཱͪ͛ΔϢʔ βʔ͕૿Ճ • ·ͣ·ͣͷ։෧཰ 11

Slide 12

Slide 12 text

ϓογϡୈೋظ ~ϦϞʔτϓογϡҠߦظ ~ • Amazon(SNSʢϞόΠϧϓογϡϝο ηʔδϯάػೳʣͷಋೖ • ʰχϡʔε͕ߋ৽͞Ε·ͨ͠ʮχϡʔ ελΠτϧʯ΄͔ʱͱ͍͏௨஌ • ϩʔΧϧϓογϡ(➡(ϦϞʔτϓογϡ ΁ͷҠߦ 12

Slide 13

Slide 13 text

݁Ռ • ϓογϡ։෧཰Ξοϓ • ϓογϡ௨஌"➡"DAU޲্ 13

Slide 14

Slide 14 text

໰୊!⾠ ࡶͳϓογϡ௨஌ӡ༻ 14

Slide 15

Slide 15 text

໰୊ • ։ൃऀ͕αʔόʔʹSSHϩάΠϯͯ͠ϓογϡͷͨΊͷίϚϯ υΛଧͬͯϓογϡ௨஌...%㽊 • ϓογϡ௨஌؅ཧը໘͕ෆ҆ఆ...%! 15

Slide 16

Slide 16 text

ϓογϡୈࡾظ ~ຊ֨ϦϞʔτϓογϡ࣌ ୅~ • Amazon(SNSΛ༻͍ͨϦϞʔτϓογϡ ௨஌ͷຊ֨ӡ༻࣌୅ • େن໛ϓογϡʹ଱͑͏ΔΞʔΩςΫ νϟΛ͖ͪΜͱθϩ͔Βߟ͑ͯ࠶ઃܭ 16

Slide 17

Slide 17 text

ϓογϡΞʔΩςΫνϟ ʢఆ࣌ϓογϡͷ৔߹ʣ 17

Slide 18

Slide 18 text

18

Slide 19

Slide 19 text

ఆ࣌ϓογϡ 1. ϞόΠϧΤϯυϙΠϯτऔಘ 2. RedisʹΤϯΩϡʔ 3. ϫʔΧʔ͕σΩϡʔ 4. SNSʹPublish 19

Slide 20

Slide 20 text

• Ϛελʔαʔόʔ • ϞόΠϧΤϯυϙΠϯτऔಘɺΤϯΩϡʔ • Redis • ϞόΠϧΤϯυϙΠϯτΛετΞ • ϫʔΧʔ • ϞόΠϧΤϯυϙΠϯτΛσΩϡʔɺSNS)Publish 20

Slide 21

Slide 21 text

1Πϯελϯε͋ͨΓͷ ϓογϡੑೳ 400#Pushes#/#Sec 21

Slide 22

Slide 22 text

1Πϯελϯε͋ͨΓͷՁ֨ $0.02%/%hour%(t2micro) 22

Slide 23

Slide 23 text

࣌ؒଳͰ૿ݮ͢Δ Πϯελϯε! (powered!by! OpsWorks) 23

Slide 24

Slide 24 text

ϓογϡΞʔΩςΫνϟ • RedisΛ༻͍ͨγϯϓϧͳPub/Sub • εέʔϥϒϧͳϓογϡϫʔΧʔ • λΠϜϕʔεͳΠϯελϯεͰ௿ίετӡ༻ 24

Slide 25

Slide 25 text

ϓογϡΞʔΩςΫνϟ ʢ଎ใϓογϡͷ৔߹ʣ 25

Slide 26

Slide 26 text

26

Slide 27

Slide 27 text

଎ใϓογϡ 1. ϓογϡ؅ཧը໘ʢRailsʣͰϓογϡΛઃఆ 2. ϞόΠϧΤϯυϙΠϯτऔಘ 3. RedisʹΤϯΩϡʔ 4. ϓογϡϫʔΧʔ͕σΩϡʔ 5. SNSʹPublish 27

Slide 28

Slide 28 text

• Rails • ϞόΠϧΤϯυϙΠϯτऔಘɺΤϯΩϡʔ • Redis • ϞόΠϧΤϯυϙΠϯτΛετΞ • ϓογϡϫʔΧʔ • ϞόΠϧΤϯυϙΠϯτΛσΩϡʔɺSNS+Publish 28

Slide 29

Slide 29 text

ϓογϡ؅ཧը໘ • ϓογϡ಺༰ɾλΠτϧΛઃఆ͢Δ؅ཧը໘ • Rails'ʴ'Sidekiq • SidekiqϫʔΧʔ͕ΤϯυϙΠϯτऔಘɺRedisʹΤϯΩϡʔ 29

Slide 30

Slide 30 text

໰୊!⾠ ϞόΠϧΤϯυϙΠϯτऔಘSQL ➡!͑ͬɺࢲͷΫΤϦ஗͗͢... 30

Slide 31

Slide 31 text

ߴ଎Խରࡦ!⚡ endpoint(arnΛS3ϩʔυԽ 31

Slide 32

Slide 32 text

32

Slide 33

Slide 33 text

݁Ռ Android/iOS 10෼#➡#15ඵ 33

Slide 34

Slide 34 text

ϓογϡୈ࢛ظ ~ύʔιφϥΠζυɾϓογϡ࣌୅~ • Ϣʔβʔͷᅂ޷ʹԠͨ͡ϓογϡ௨஌ • ઈࢍ։ൃத"! 34

Slide 35

Slide 35 text

35

Slide 36

Slide 36 text

৽ϓογϡΞʔΩςΫνϟ • Django(ͰϓογϡϦΫΤετड͚෇͚ • CeleryͰλεΫΩϡʔΠϯά • ૄ݁߹ͳϫʔΧʔ܈ 36

Slide 37

Slide 37 text

To#be#con(nued 37

Slide 38

Slide 38 text

ୈೋ෦ GunosyͰͷAmazon+SNSར༻ࣄྫ 38

Slide 39

Slide 39 text

39

Slide 40

Slide 40 text

SNS༻ޠ • Device'Token:'ΞϓϦέʔγϣϯͷࣝผࢠɻ֤ϓϥοτϑΥʔϜ ͕ൃߦ • Endpoint'Arn:'Device'Token͔Βੜ੒͞ΕΔϞόΠϧͷΤϯυϙ Πϯτ.'SNSͰ͸͜ͷϞόΠϧϙΠϯτΛ࢖ͬͯϓογϡ͕ૹΒ ΕΔ 40

Slide 41

Slide 41 text

Amazon'SNSͷϝϦοτ • APNS/GCMͷ֤ϓϥοτϑΥʔϜͷAPIΛந৅Խɺϓϥοτ ϑΥʔϜຖͷҧ͍Λҙࣝ͢Δඞཁ͕ͳ͍ 41

Slide 42

Slide 42 text

Ձ֨ • 100ສϦΫΤετ/݄%͕ແྉ • ௒ա͢Δ৔߹%100ສϦΫΤετຖʹ%$0.5 42

Slide 43

Slide 43 text

σόΠετʔΫϯͷ؅ཧͷ೉͠͞ 1. σόΠετʔΫϯ͕มΘΔ 2. Enable/Disable੍ޚ 3. DisableͳEndpoint3Arnͷ࡟আ 43

Slide 44

Slide 44 text

σόΠετʔΫϯ͕มΘΔ(Android) Q.σόΠετʔΫϯͬͯͲΜͳͱ͖ʹมΘΔͷʁ 1. ΞϓϦΛ࠶Πϯετʔϧͨ͠ͱ͖ 2. ʮσʔλΛ࡟আʯ͞Εͨͱ͖ 3. ΞϓϦΛόʔδϣϯΞοϓͨ͠ͱ͖1 1"Ҿ༻ݩ:"ʲAndroidʳGCMͷregistra2onIdͷҰҙੑ"|"Monstar"Lab,"Inc. 44

Slide 45

Slide 45 text

σόΠετʔΫϯ͕มΘΔ Q.͍ͭɺͳΜͰϦϑϨογϡ͢Δͷʁ A.#google༷ͷؾ෼࣍ୈɻɻɻ2 2"Ҿ༻ݩ:"ʲAndroidʳGCMͷregistra2onIdͷҰҙੑ"|"Monstar"Lab,"Inc. 45

Slide 46

Slide 46 text

InstanceID Instance(ID(is(stable(but(may(become(invalid,(if: • App$deletes$Instance$ID • Device$is$factory$reset • User$uninstalls$the$app • User$clears$app$data0 0"InstanceID"""|"""Google"APIs"for"Android"""|"""Google"Developers 46

Slide 47

Slide 47 text

ϙΠϯτ!✔ • σόΠετʔΫϯΛఆظతʹߋ৽ • ߋ৽͞ΕͨσόΠετʔΫϯΛݩʹόονଆͰ࠶౓ϞόΠϧΤ ϯυϙΠϯτੜ੒ 47

Slide 48

Slide 48 text

Enable/Disable੍ޚ CreatePla(ormEndpoint0͸0Pla(ormEndpoint0͕طʹଘࡏ͢Δ৔ ߹ɺ੒ޭ͠·͕͢0Enabled0ʹ͠·ͤΜɻͦͷͨΊɺ݁ՌΛฦ͢લ ʹ0Pla(ormEndpoint0͕0Enabled0ʹͳ͍ͬͯΔ͔Ͳ͏͔νΣοΫ͢ Δඞཁ͕͋Γ·͢ɻ3 3"Ҿ༻ݩ:"Amazon"SNS"ͷϞόΠϧτʔΫϯ؅ཧʹ͍ͭͯͷϕετϓϥΫςΟε"ʛ"Developers.IO 48

Slide 49

Slide 49 text

SNSͰ͸ɺԿ౓͔௨஌ʹࣦഊͨ͠৔߹ɺendpoint͕disableʹͳΔ ※Ұ౓disableʹͳͬͯ͠·ͬͨendpoint͸ɺҎ߱ͲΕ͚ͩpublish ͯ͠΋APNS͕ୟ͔ΕΔ͜ͱ͸ͳ͍4 4"Ҿ༻ݩ:"iOS8ΞοϓσʔτͰΞϓϦ΁ͷϓογϡ௨஌ͰϋϚΔ఺"("Qiita 49

Slide 50

Slide 50 text

৸ͯΔEndpointArnΛى͜͢(Re-enableॲཧ) def reenable_endpoints(endpoint_arn) # client = AWS::SNS.new ###লུ### attributes = client.get_endpoint_attributes(endpoint_arn: endpoint_arn)[:attributes] if attributes['Enabled'] == 'false' # re-enable endpoint client.set_endpoint_attributes(endpoint_arn: endpoint_arn, attributes: {'Enabled' => 'true'}) end end 50

Slide 51

Slide 51 text

DisableͳEndpoint.Arnͷ࡟আ • ϞόΠϧΤϯυϙΠϯτͷϜμͳPublish͸ͨ͘͠ͳ͍ • SNS΁ͷPublish࣌ʹdisableͳEndpointArn͸࡟আ 51

Slide 52

Slide 52 text

!!SNS!ϕετɾϓϥΫςΟε!! • σόΠεຖ(iPhone/Android)ʹσόΠετʔΫϯΛ؅ཧ • ఆظతʹσόΠετʔΫϯΛνΣοΫͯ͠ߋ৽ • ϞόΠϧΤϯυϙΠϯτͷRe/enableॲཧ • disableͳEndpointArn͸࡟আͯ͠ϜμͳPublish͸߇͑Δ 52

Slide 53

Slide 53 text

͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ We're%hiring!! 53

Slide 54

Slide 54 text

ࢀߟ৘ใ • ʲAndroidʳGCMͷregistra0onIdͷҰҙੑ2|2Monstar2Lab,2Inc. • Amazon2SNS2ͷϞόΠϧτʔΫϯ؅ཧʹ͍ͭͯͷϕετϓϥΫ ςΟε2ʛ2Developers.IO • ؾܰͳSNS2Mobile2Push2ͷ࿩ • iOS8ΞοϓσʔτͰΞϓϦ΁ͷϓογϡ௨஌ͰϋϚΔ఺2F2Qiita 54