https://pycon.jp/2018/
DjangoΞϓϦέʔγϣϯʹ͓͚ΔτΠϧ໓ઓه
View Slide
ࣗݾհদా ߁ষ (Yasuaki Matsuda)@yacchin0101גࣜձࣾΞΠϦοδαʔόαΠυΤϯδχΞ
ࣗݾհ
ͲΜͳਓ͕ରʁτΠϧ໓ʹڵຯ͕͋ΔݱͰDjangoΛͬͯΔʑͷӡ༻ۀͰർฐ͍ͯ͠Δਓ
࣍લ࢙τΠϧ໓τΠϧͱޮՌ·ͱΊ
େมਃ͠༁͍͟͝·ͤΜτΠϧΛ໓ͨ͠Θ͚Ͱͳ͍
େมਃ͠༁͍͟͝·ͤΜSREʮτΠϧͷ໓ʯ͕ϝΠϯ
τΠϧͱτΠϧʹ͍ͭͯͷհphoto by Yamato Fukui
SREͱGoogle͕ࣾఏএɾ࣮ફ͍ͯ͠ΔγεςϜཧͱαʔϏεӡ༻ͷํ๏
SREͱIUUQTMBOEJOHHPPHMFDPNTSFCPPLJOEFYIUNM5ষ τΠϧͷ໓τΧήʁSREαΠτϦϥΠΞϏϦςΟΤϯδχΞϦϯά
τΠϧͱຊ൪αʔϏεʹؔ͢Δ࡞ۀͰख࡞ۀͰ܁Γฦ͠ߦΘΕࣗಈԽ͢Δ͜ͱ͕ՄೳͰ͋Γઓज़తͰظతͳՁΛ࣋ͨͣ࡞ۀྔ͕αʔϏεͷʹൺྫ͢Δ
৯ثͷखચ͍ۙͳτΠϧ
ۙͳτΠϧख࡞ۀͰ͋Δ܁Γฦ͞ΕΔࣗಈԽͰ͖Δઓज़తͰͳ͍ظతͳՁΛ࣋ͨͳ͍αʔϏεʹରͯ͠O(n)Ͱͳ͍৯ثͷखચ͍
ۙͳτΠϧશࣗಈ৯ચػ
τΠϧ͕ͨΒ͢ͷҰॠͰՔಇΛຒΊਚ͘͞ΕΔϔΠτΛు͘Α͏ʹͳΔΩϟϦΞ͕ఀ͢ΔͳͲ
·ͱΊτΠϧΛ໓ͯ͠PythonͰΠϊϕʔςΟϒͳࣄΛ͠Α͏ʂ
લ࢙τΠϧ໓લͷDjangoΞϓϦέʔγϣϯʹ͍ͭͯͷհphoto by Yamato Fukui
લ࢙Online to Offline
લ࢙དྷళൢଅࢪࡦPush௨ϙΠϯτΫʔϙϯήʔϜ
Push௨͓ɺങ͍ʹߦ͜͏͔ͳɻΫϦΞϥϯεηʔϧ։࠵தʂ
ϙΠϯτϙΠϯτ͑Δ͠ߦ͜͏͔ͳɻདྷళϙΠϯτΩϟϯϖʔϯ࣮ࢪதʂ
Ϋʔϙϯ͋ͷళͷΫʔϙϯ͋Δ͡ΌΜɻ10%OFFΫʔϙϯதʂ
ήʔϜ͓ͬͨͥΊͰͱ͏ʂ100PTήοτʂ
લ࢙hogeΞϓϦPush௨ϙΠϯτΫʔϙϯήʔϜܾࡁ
Offline͓ళͷηʔϧใΛݟΔϙΠϯτߴΛ֬ೝ͢ΔήʔϜΛ࣮ࢪͯ͠ϙΠϯτ֫ಘ
Online͓ళͰΫʔϙϯΛ͏ΞϓϦͰܾࡁ͢Δ
લ࢙hogeΞϓϦͱࢲͷؔαʔόαΠυػೳ࣮Πϯϑϥߏஙӡ༻ɾอक୲ऀ
લ࢙CPU༻Push௨
લ࢙֎࣌ ࣌ τΠϧ໓࣌2015 2016 2018
֎࣌ελʔτΞοϓاۀ։ൃऀෆ֎
ʢ2015.x.xʣߏApp & Batch ServerAdmin ServerCoupon ServerELBELB
֎࣌ຯΘ͍ਂ͍ߏDBಉډSSLূ໌ॻஔ͖σϓϩΠ: SCPͳͲ
ઌํʮΞϓϦͷػೳ֦ு͍ͨ͠ʯ֎࣌Ӧۀʮঝ͍ͨ͠·ͨ͠ʂʯೖࣾͨ͠দాʮΑΖ͓͘͠Ͷ͕͍͠·͢ʂʯPMʮࠓޙͷ֦ுΛߟ͑ͯ͢Δ͔ʯ
࣌ࣾ։ൃPython / Django Ͱ։ൃGitLabͰιʔεཧAWSͰߏங
ʢ2016.x.xʣߏApp ServerAdmin ServerCoupon Server RDSELBELBBatch Server
࣌ଟগվળ͞ΕͨRDS(ϚωʔδυαʔϏε)PHP͔ΒDjangoҠߦσϓϩΠ: Git PullͳͲ
ϩʔϯνޙઌํʮ͜͜ͷจݴमਖ਼Λ͓ئ͍Ͱ͖·͢ʁʯPMʮঝ͠·ͨ͠ɻদా͞Μ͓ئ͍͠·͢ɻʯদాʮ͍ɻʯ
࣌͋Εʁʮ͜ͷલґཔ͞ΕͨΑ͏ͳʯʮ࠷ۙɺ։ൃͰ͖͍ͯͳ͍ʯʮਓ͕Γͳ͍ʯ
࣌τΠϧʹૡ͖ۤ͠Ή࣌ͷ౸དྷ
τΠϧ໓τΠϧ໓ͷաఔʹ͍ͭͯհphoto by Yamato Fukui
ํTwelve-Factor AppΛManaged ServiceΛCI / CD
ํ
Twelve-Factor App࣌ؒɾίετͷ࠷খԽҠ২ੑ্Πϯϑϥཧ͔Βͷ։์ܧଓతσϓϩΠεέʔϧΞοϓIUUQTGBDUPSOFU
Managed ServiceΠϯϑϥཧෆཁӡ༻ϦεΫݮܧଓతվળ
CI / CDख࡞ۀ͔Βͷ։์্࣭
τΠϧ໓Case 1
τΠϧ໓લͷঢ়گڥߏங࡞ۀ৽͍͠ΤϯδχΞ͕ࢀըREADME௨Γʹڥߏஙಈ͔ͳ͍৬ਓͷग़ਞ
ػೳ։ൃ։࢝·Ͱʹ͔͔࣌ؒΔ৬ਓͷՔಇ͕औΒΕΔτΠϧ໓લͷঢ়گ՝
τΠϧ໓ઓུDocker Compose
τΠϧ໓ઓུίϯςφܕԾڥڥࠩҟ͕খ͘͞ͳΔҠ২ੑ͕ߴ͍Docker
τΠϧ໓ઓུDocker ComposeෳίϯςφΛఆٛෳίϯςφΛ࣮ߦdocker-compose up ͷΈ
͙͢։ൃͰ͖ΔΑ͏ʹͳͬͨ৬ਓͷग़ਞ͕͑ΒΕͨڥࠩҟʹΑΔόά͕͑ΒΕͨτΠϧ໓ޙվળޮՌ
τΠϧ໓ޙ
τΠϧ໓Case 2
खॱॻͷ࡞1ͣͭॖୀɾߋ৽νΣοΧʔͱෳਓମ੍σϓϩΠ࡞ۀτΠϧ໓લͷঢ়گ
σϓϩΠखॱࡶʹΑΔώϡʔϚϯΤϥʔϦεΫσϓϩΠʹର͢Δ͕ߴΊτΠϧ໓લͷঢ়گ՝
τΠϧ໓ઓུGitLab CIAmazon ECS
τΠϧ໓ઓུίϯςφΦʔέετϨʔγϣϯαʔόཧෆཁεέδϡʔϧ࣮ߦAmazon ECS
τΠϧ໓ઓུGitϦϙδτϦCI / CDػೳissueཧίʔυϨϏϡʔGitLab
RDSELBX-RayECSApp Server ServiceX-RayBatch TaskELBELBɾɾɾX-RayX-RayCoupon Server ServiceɾɾɾX-RayX-RayAdmin Server ServiceɾɾɾX-RayCloudWatchLogsS3τΠϧ໓ઓུ
ιʔεमਖ਼ϨϏϡʔϙνΔτΠϧ໓ޙσϓϩΠखॱ
ਓҝతϛε͕ൃੜ͠ͳ͘ͳͬͨσϓϩΠʹର͢Δ͕ݮͬͨվળޮՌτΠϧ໓ޙ
/hoge/ͰPOST࣌IP੍ݶ͍ͨ͠τΠϧ໓ޙ
τΠϧ໓ޙSQLΫΤϦվળ
ECRX-RayAPP Server ServiceX-RayNew TaskOld Task1. Image Build & Push New Image2. Create New Task Definition3. Update Service1. Push Source CodeX-RayApp Task: 1X-RayApp Task: 2GitLab2. Create Merge Request(MR)3. Review & LGTM & Accept MRτΠϧ໓ޙ
τΠϧ໓͓·͚
τΠϧ໓લͷঢ়گ੩తϑΝΠϧσϓϩΠιʔεमਖ਼ϨϏϡʔϙνΔ
ɻΛ༩͍ͨ͠τΠϧ໓ޙ
1. npm install & build2. Put Artifacts to S3 Bucket1. Push Source CodeGitLab2. Create Merge Request(MR)3. Review & LGTM & Accept MRAWS CLIτΠϧ໓ޙ
τΠϧ໓ߋʹ͓·͚
ϢχοτςετίʔσΟϯάن֬ೝෳࡶ֬ೝτΠϧ໓લͷঢ়گιʔείʔυϨϏϡ࡞ۀ
1. Unit Test2. Flake83. RadonGitLabςετ࣮ࢪʹΑΔ࣭୲อίʔσΟϯάنͷ֬ೝίʔυͷෳࡶΛ֬ೝ1. Push Source Code2. Create Merge Request(MR)3. Review & LGTM & Accept MRτΠϧ໓ޙ
τΠϧ໓͓·͚(͜ΕͰ࠷ޙ)
τΠϧ໓લͷঢ়گόοναʔόෆཁECSͰఆظతʹ࣮ߦͰ͖Δ͚ͬͨͩͷྉۚ
τΠϧ໓Case 3
τΠϧ໓લͷঢ়گ֤αʔό͔ΒΞΫηεϩάऔಘgrepɾawk৬ਓಛఆϢʔβͷΞΫηεௐࠪ
ௐࠪʹ͕͔͔࣌ؒΔώϡʔϚϯΤϥʔʹΑΔϦεΫτΠϧ໓લͷঢ়گ՝
τΠϧ໓ઓུCloudWatch Logs
τΠϧ໓ઓུϩάͷࢹϩάͷอଘϩάͷΞΫηεCloudWatch Logs
τΠϧ໓ઓུsettings.py
τΠϧ໓ઓུdocker-compose.yml
ͰௐࠪྃਓҝతϛεʹΑΔαʔϏεఀࢭ͕ͳ͍ඇΤϯδχΞͰௐࠪՄೳτΠϧ໓վળޮՌ
τΠϧ໓ޙϩάΛҰՕॴʹूલํҰகݕࡧ࣌ݕࡧ
τΠϧ໓Case 4
τΠϧ໓લͷঢ়گRDSεέʔϧΞοϓ࡞ۀ࣮ߦ͞ΕΔSQL͕ѱ͍CPU༻100%ுΓ͖αʔϏεμϯൃੜۚͰղܾ
αʔϏεμϯͷՄೳੑαʔϏεҡ࣋ʹίετ͕͔͔Δ࣮༧ఆͩͬͨͷ͕ԆτΠϧ໓લͷঢ়گ՝
τΠϧ໓ઓུDjango QuerySet
σʔλϕʔεͷ҆ఆՔಇ༨ܭͳεέʔϧΞοϓΛ͑ΔվળޮՌτΠϧ໓ޙ
ήʔϜ࣮ࢪՄ൱APIήʔϜ11ճ·ͰΞϓϦશମͰ1ʹ10,000ճτΠϧ໓ޙ
PushͰήʔϜར༻ऀ૿ՃϨεϙϯεྼԽΠϯελϯεεέʔϧΞοϓτΠϧ໓ޙ
τΠϧ໓Case 5
τΠϧ໓લͷঢ়گཧαʔόʹϩάΠϯͰ͖ͳ͍ͷௐࠪϩάௐࠪϩάʹు͔Ε͍ͯͳ͍ιʔεΛݟΔ
ղܾʹ͕͔͔࣌ؒΔτΠϧ໓લͷঢ়گ՝
τΠϧ໓લͷঢ়گ
τΠϧ໓લͷঢ়گEffective Python Item 14: Prefer Exceptions to returning NoneνϟϦEffectivePython—
τΠϧ໓લͷঢ়گྑ͘ͳ͍except۟ͰϩΪϯά͍ͯ͠ͳ͍except۟ͰNoneΛฦ٫
τΠϧ໓ઓུDjango Logging
ϩάΛݟΔ͚ͩͰঢ়گѲτΠϧ໓վળޮՌ
ྑ͘ͳͬͨϩάͰঢ়گΛѲͰ͖Δಛผͳྫ֎Λ͛Δ͜ͱͰΓ͍ͨ͜ͱΛ໌֬ʹͨ͠τΠϧ໓ޙ
τΠϧ໓Case 6
τΠϧ໓લͷঢ়گ֤APIͷϨΠςϯγௐ֤ࠪαʔό͔ΒΞΫηεϩάऔಘgrepɾawk৬ਓ
͕͔͔࣌ؒΔϦΞϧλΠϜʹΘ͔Βͳ͍τΠϧ໓લͷঢ়گ՝
τΠϧ໓ઓུAWS X-Ray
τΠϧ໓ઓུϦΫΤετʹؔ͢ΔσʔλऩूσʔλͷදࣔɾϑΟϧλϦϯάதؒͷαʔϏεৄࡉදࣔAWS X-Ray
τΠϧ໓ઓུX-RayX-RayDaemon
τΠϧ໓ઓུDockerfile
ຊ൪ڥͷঢ়گ͕ѲՄೳύϑΥʔϚϯενϡʔχϯά˕োରԠͰʹཱͭվળޮՌτΠϧ໓ޙ
ޮՌτΠϧ໓ʹΑΔޮՌͷհphoto by Yamato Fukui
ޮՌোରԠ͕ݮͬͨख࡞ۀݮʹ͏ώϡʔϚϯΤϥʔ͕গͳ͘ͳͬͨ͜ͱ͕େ͖͍ΤϯδχΞϦϯάʹׂ͚Δ͕࣌ؒ૿͑ͨDjangoΞϓϦέʔγϣϯ։ൃʹྗͰ͖ΔΑ͏ʹͳͬͨΩϟϦΞΞοϓͰ͖ͨϦʔμʹͳΓ·ͨ͠
·ͱΊphoto by Yamato Fukui
·ͱΊʮͦΕτΠϧ͡ΌͶʁʯͷਫ਼ਆτΠϧΛݮΒͤΤϯδχΞϦϯάʹूதͰ͖Δܧଓͯ͠վળͰ͖Δঢ়ଶΛ࡞ΔτΠϧແݶʹ༙͖ଓ͚ΔManaged ServiceɾCI / CDͷ׆༻ཧରΛݮΒ͠ɺࣗಈԽΛਪਐ͢Δ
ࢀߟจݙO'Reilly Japan - SRE αΠτϦϥΠΞϏϦςΟΤϯδχΞϦϯάO'Reilly Japan - Effective Python