Slide 1

Slide 1 text

AWS Λ࢖ͬͨγεςϜͷςετํ਑ (αʔόαΠυ) 2019/6/22 @nemuzuka ୈ60ճ ௕ԬITٕज़ऀษڧձ

Slide 2

Slide 2 text

ॳΊͯͷํ΋ͦ͏Ͱͳ͍ํ΋ • ยۅ Ұफ (͔ͨ͗Γ ͔ͣΉͶ) • id: nemuzuka / @nemuzuka • Java / Scala / Kotlin(࠷ۙ࢝Ίͨ) • ݸਓࣄۀओ • 95 % ͘Β͍ϦϞʔτ(௕Ԭ)ͰϫʔΫ

Slide 3

Slide 3 text

ࠓ೔ͷษڧձͰ AWS ࢖ͬͨγεςϜ։ൃ͍ͨ͠ʂ ͱࢥͬͨํ΋ଟ͍ͱࢥ͍·͢

Slide 4

Slide 4 text

ͱ͸͍͑ γεςϜ։ൃΛ͢Δ্Ͱ͸ ςετ͸ආ͚ͯ௨Ε·ͤΜ

Slide 5

Slide 5 text

Unit Test ͷஈ֊Ͱ ϩʔΧϧ͔Β AWS ࢖͍·͔͢ʁ (࣮֬Ͱ͚͢Ͳ Slow Test ʹͳΓ΍͍͢Ͱ͢ΑͶ)

Slide 6

Slide 6 text

ࠓճͷ͓୊ AWS Λ࢖ͬͨγεςϜͷ ςετํ਑

Slide 7

Slide 7 text

ݴ༿ͷఆٛ • Unit Test (UT) • ର৅ͷΫϥε(ϝιου)ͷৼΔ෣͍ͷςετ • Integration Test (IT) • API ͷݺͼग़͠ͷৼΔ෣͍ͷςετ • System Test (ST) • ෳ਺ͷ API ͷݺͼग़͠΍ AWS ͷػೳΛ࢖ͬͯϢʔεέʔε͕ ຬ͍ͨͤͯΔ͔ͷςετ

Slide 8

Slide 8 text

͋ΔγεςϜͷߏ੒ ALB Fargate RDS SNS1 SQS1 SNS2 subscribe ը໘ଆͷ௨஌༻ Controller Service Repository EventPublisher MessagePolling Service EventPublisher Repository ఆظతʹ polling ExternalClient ֎෦αʔϏε

Slide 9

Slide 9 text

͊͞ɺςετ͍͖ͯ͠·͠ΐ͏ʂ

Slide 10

Slide 10 text

Unit Test • ґଘ͢Δ class ͸ Mock Խ • e.g. Controller ͷςετͰ͸ Service ͸ Mock Խ͢Δ • Mock ࢖ͬͨՕॴ͸ݺΜͩ͜ͱ + Ҿ਺ͷ assert Λߦ͏ • Repository ࣮૷ͷςετ͸ H2 ౳࢖ͬͯɺSQL ͷςετΛߦ͏ • AWS / ֎෦αʔϏεΛҙࣝ͢ΔՕॴ͸ແཧʹςετ͠ͳ͍ • AWS ͷ SDK Λ࢖͏ՕॴΛہॴԽ͢Δ • EventPublisher / MessagePolling • Mock αʔόతͳ΋ͷΛཱͯͯ΋͍͍͚Ͳɺ࣮ػͰ֬ೝͨ͠ํ͕࣮֬ • AWS / ֎෦αʔϏεΛҙࣝ͢Δͷ͸ class ͷ࣮૷ଆ • ݺͼग़͠ݩ͸ interface ͚ͩ஌͍ͬͯΕ͹ྑ͍ • ֎෦αʔϏε͕ Test ϞʔυͰςετͰ͖ΔͳΒ΍ͬͨํ͕ྑ͍ Controller Service Repository EventPublisher MessagePolling ExternalClient ɹɹɹ : ςετΫϥεΛ࡞Δ୯Ґ DomainModel ValueObject

Slide 11

Slide 11 text

Integration Test • جຊతʹ͸࣮ࡍͷ object Λ࢖͏ • Repository ͸ H2 ͱ͔࢖͏ • ςετέʔεͷதͰ table ͷ assert ΋ߦ͏ • AWS / ֎෦αʔϏεΛҙࣝ͢ΔՕॴ͸ Mock Խ • ֎෦αʔϏε͕ Test ϞʔυͰςετͰ͖ΔͳΒ࣮ࡍ ͷ object Λ࢖ͬͯ௨৴ͯ͠΋ྑ͍ • γφϦΦͬΆ͘ API Λ૊Έ߹ΘͤͨςετέʔεΛ࡞ͬ ͯ΋ྑ͍ • Controller ݺͼग़͠ -> (SQS ͔ΒͷϝοηʔδΛऔͬ ͖ͯͨςΠͰ) Service ݺͼग़͠ Controller Service Repository EventPublisher MessagePolling Service EventPublisher Repository ExternalClient ɹɹɹ : ςετΫϥεΛ࡞Δ୯Ґ : ςετΫϥεͷ։࢝Ґஔ

Slide 12

Slide 12 text

System Test • AWS ্ʹຊ൪ͱಉ͡ ߏ੒ͷ ST ؀ڥΛ࡞Δ • ST ؀ڥʹ Docker Image ΛσϓϩΠ • ST ؀ڥͷ API Λςε τΫϥε͔Βݺͼग़͢ ALB Fargate RDS SNS1 SQS1 SNS2 ֎෦αʔϏε

Slide 13

Slide 13 text

ςετίʔυͷ؅ཧͱ࣮ߦλΠϛϯά • ςετίʔυ͸ϓϩμΫγϣϯίʔυ ͱҰॹͷϦϙδτϦͰ؅ཧ • feature branch Λ push ͨ࣌͠ʹ CircleCI ্Ͱςετ࣮ࢪ • merge ৚݅͸ϨϏϡʔͱ CircleCI ͷςετʹ pass ͢Δ͜ͱ • ςετʹ pass ͢Δͱ Docker Image ͕Ͱ͖Δ • System Test ༻ͷγφϦΦΛ؅ཧ͢ ΔϦϙδτϦΛ༻ҙ • Test Ϋϥε͚ͩͷϦϙδτϦ • System Test ؀ڥʹ Docker Image ΛσϓϩΠͯ͠ɺTest ࣮ߦ(CircleCI) • ຖ೔ఆظతʹ System Test Λ࣮ߦ ͠ɺςετ͕௨Δ͔Λ֬ೝ͢Δ Unit Test / Integration Test System Test

Slide 14

Slide 14 text

ςετ͸όονϦʂ ʴ ۚͰ(Ϧιʔε૿ڧͯ͠)໰୊͸ શͯղܾͰ͖Δ ͱ͍͏༁Ͱ΋ͳ͍ͷͰɺ ࢖͏αʔϏεͷΫη΋ߟ͓͖͑ͯ·͠ΐ͏

Slide 15

Slide 15 text

SQS • ෳ਺ճϝοηʔδ͕औΕΔ͜ͱ͕͋Δ / ॱং͕อূ͞Εͳ͍ • FIFO ΋͋Δ͚Ͳεϧʔϓοτ͕… • ॏෳΛආ͚ΔͷͰ͸ͳ͘ɺෳ਺ճϝοηʔδ͕औΕͯ΋େৎ෉ ͳΑ͏ʹઃܭ͢Δ • e.g. ॲཧΛߦ͏લఏ৚݅Λຬͨ͞ͳ͍৔߹ɺࣺͯΔ • e.g. ॲཧதͷεςʔλεͷ৔߹ɺϦΫΤετΛड͚෇͚ͳ ͍

Slide 16

Slide 16 text

RDS(ͱ͍͏͔ MySQL) • ద੾ʹ index షΖ͏ • Πϯελϯε͋͛ͯ΋ SSD Ͱ΋݅਺૿͑Δͱμϝͳ࣌͸μϝ • τϥϯβΫγϣϯ෼཭Ϩϕϧҙࣝ͠Α͏ • MySQL ͷ REPEATABLE READ Ͱߋ৽ॲཧͷεϧʔϓοτग़ͤΔͷ…͔ʁ • Oracle ͬΆ͘ MySQL ࢖͏ͱେମϠέυ͢Δ ಡΜͩ࣌ؒ͸ଛ͠ͳ͍ˠ

Slide 17

Slide 17 text

SQS + RDS • SQS ͷ enqueue ͱ dequeue + ॲཧͷλΠϛ ϯάʹؾΛ͚ͭͯ • RDS ͷ commit લʹ enqueue ͯ͠͠· ͍ɺ dequeue ͨ͠ଆͷॲཧͰର৅ͷϨίʔ υ͕ͳ͍…ͱ͍͏͜ͱʹͳΒͳ͍Α͏ʹ

Slide 18

Slide 18 text

·ͱΊ • ςετ͸େࣄ͚ͩͲؤுΓ͗͢ͳ͍ • ݕূίʔυͱςετ͸ผɻUT / IT ͰԿͰ΋΍Ζ͏ͱ͠ͳ͍ํ͕ྑ͍ • ੹຿Λ෼͚Ε͹ UT ΋͠΍͘͢ͳΔɻDI ࢖͑Δํ͕ςετ͠΍͍͢(assert ͕࢓ࠐΈ΍͍͢) • JVM ࢖͏ͳΒ SpringBoot + Kotlin ͕ࠓͷॴݸਓతʹੜ࢈ੑߴ͍ؾ͕͢Δ • AWS ࢖͏ͱָʹͳΔͱ͜Ζ͸ੵۃతʹ࢖͍͖ͬͯ·͠ΐ͏ʂ • ஌ͬͯΕ͹େৎ෉ͳ͜ͱ͕ଟ͍Ͱ͢ɻͨͩɺ؂ࢹͱܭଌ͸ॏཁ • ࣄલʹෛՙςετ͓ͯ͘͠ͱۚͰղܾͰ͖ͳ͍͜ͱʹؾ෇͖΍͍͢Ͱ͢ • όʔδϣϯͷԘ௮͚͸Ͱ͖ͳ͍ͷͰɺςετ͕ແ͍ͱόʔδϣϯ UP ͕͠ΜͲ͍Ͱ͢ • UI ଆ(εϚϑΥΞϓϦ / ϒϥ΢β)ͷࠓ࣌ͷςετͬͯͲ͏΍ͬͯΔͷ͔ඇৗʹؾʹͳΓ·͢ʂ