Slide 1

Slide 1 text

ϨΨγʔ Django ΞϓϦέʔγϣϯͷݱ୅Խ A Modernization of Legacy Django Based Applications Hayao Suzuki DjangoCongress JP 2018 at Cybozu, Inc. May 19, 2018

Slide 2

Slide 2 text

Contents 1 ֓ཁ 2 ΞϓϦέʔγϣϯલ࢙ 3 Twelve-Factor App 4 Django ͷΞοϓσʔτ 5 ΞϓϦέʔγϣϯͷݱ୅Խ 6 ·ͱΊ 2 / 29

Slide 3

Slide 3 text

Abstract ൃදͷ֓ཁ Ĺ Django 1.7 Ͱॻ͔ΕͨΞϓϦέʔγϣϯ͕ݱ໾ͩͬͨ Ĺ ࣍ظϦϦʔεʹ޲͚ͯ Django 1.11 ʹόʔδϣϯΞοϓͨ͠ Ĺ Twelve-Factor App ͷࢥ૝ΛϕʔεʹΞϓϦέʔγϣϯͷݱ୅ԽΛ࣮ࢪ ͨ͠ ୭޲͚ͷൃදʁ Ĺ ݹ͍ΞϓϦέʔγϣϯΛվળ͢Δඞཁ͕͋ΓɺܦݧஊΛฉ͖͍ͨํ Ĺ Twelve-Factor App ͷࢥ૝ͷ࣮ફྫ͕஌Γ͍ͨํ ஫ҙ ࣮ࡍͷडୗҊ݅ͷࣄྫΛϕʔεʹ࠶ߏ੒ͨ͠΋ͷͰ͢ɻ 3 / 29

Slide 4

Slide 4 text

Who Am I? ͓લ୭Α Name Hayao Suzuki (@CardinalXaro) Blog http://xaro.hatenablog.jp Major Mathematics (Combinatorics, Number Theory) Work Python Programmer at iRidge, Inc. ࠪಡͨ͠ຊʢൈਮʣ Ĺ Effective Python (O’Reilly Japan) Ĺ ΞϧΰϦζϜ ΫΠοΫϦϑΝϨϯε ୈ 2 ൛ (O’Reilly Japan) Ĺ ͢Β͢ΒΘ͔Δ Python ʢᠳӭࣾʣ Ĺ Head First Python ୈ 2 ൛ (O’Reilly Japan) Ĺ Python σʔλαΠΤϯεϋϯυϒοΫ (O’Reilly Japan) 4 / 29

Slide 5

Slide 5 text

ΞϓϦέʔγϣϯલ࢙ ΞϓϦέʔγϣϯͷ֓ཁ Ĺ εϚʔτϑΥϯΞϓϦͷόοΫΤϯυαʔόʔ Ĺ ෳ਺ͷ Django ΞϓϦέʔγϣϯ͔Βߏ੒͞ΕΔ Ĺ BtoC ޲͚ʢΞΫηεͷ೾͕͋Δʣ Ĺ 2017 ೥ 3 ݄ϦϦʔε Ĺ Django 1.7 Ĺ AWS EC2 ্ʹߏ੒ ϓϩδΣΫτ๊͕͍͑ͯͨ໰୊ Ĺ Python 2.7.6ʢUbuntu 14.04 ෇ଐʂʣΛͦͷ··࢖͍ଓ͚͍ͯͨ Ĺ Django 1.7 ͸ 2015 ೥Ͱαϙʔτ͕੾Ε͍ͯͨ Ĺ Management ίϚϯυ͸αʔόʔϩάΠϯޙʹखಈͰ࣮ߦ Ĺ ϩάௐࠪ΋αʔόʔϩάΠϯ͕ඞཁͱͳΔ Ĺ 2 ୆ߏ੒ͰඞཁʹԠͯ͡αʔόʔͷεέʔϧΞοϓɾμ΢ϯ͕ඞཁ 5 / 29

Slide 6

Slide 6 text

ΞϓϦέʔγϣϯલ࢙ ࣍ظେܕΞοϓσʔτ Ĺ 2017 ೥ 8 ݄ελʔτ ! ΋͏͙͢ϦϦʔε Ĺ αʔόʔଆϝϯόʔ͸ 4 ਓ Ĺ ௕೥๊͍͑ͯͨ໰୊Λղܾ͠Α͏ʂ ͳ͕͍ͨͼ͕͸͡·Δ... 6 / 29

Slide 7

Slide 7 text

Twelve-Factor App Twelve-Factor App Ĺ Heroku ͷΤϯδχΞ͕ఏএͨ͠ SaaS Λͭ͘Γ্͛ΔͨΊͷํ๏࿦ Ĺ https://12factor.net/ 7 / 29

Slide 8

Slide 8 text

Twelve-Factor App ֓ཁ Ĺ ίʔυϕʔε Ĺ ґଘؔ܎ Ĺ ઃఆ Ĺ όοΫΤϯυαʔϏε Ĺ ϏϧυɺϦϦʔεɺ࣮ߦ Ĺ ϓϩηε Ĺ ϙʔτόΠϯσΟϯά Ĺ ฒߦੑ Ĺ ഇغ༰қੑ Ĺ ։ൃ/ຊ൪Ұக Ĺ ϩά Ĺ ؅ཧϓϩηε 8 / 29

Slide 9

Slide 9 text

Twelve-Factor App ຬ͍ͨͯͨ͠ཁૉ Ĺ ίʔυϕʔε (ηϧϑϗεςΟϯάͷ GitLab Ͱ؅ཧʣ Ĺ όοΫΤϯυαʔϏεʢAWS RDS ͳͲʣ Ĺ ϓϩηεʢγϯάϧϓϩηεʣ Ĺ ϙʔτόΠϯσΟϯάʢNginx ͱͷ૊Έ߹Θͤʣ ଍Γͳ͍ཁૉ Ĺ ઃఆʢ؀ڥ͝ͱʹϑΝΠϧ࡞੒ɺϋʔυίʔσΟϯάʣ Ĺ ϏϧυɺϦϦʔεɺ࣮ߦʢ෼཭Ͱ͖͍ͯͳ͍ʣ Ĺ ґଘؔ܎ʢPython ͸ requirements.txt ͕ͩɺOS ͸...ʣ Ĺ ฒߦੑʢ2 ୆ߏ੒ɺεέʔϧΞοϓͷΈՄೳʣ Ĺ ഇغ༰қੑʢഇغͰ͖ͳ͍ʣ Ĺ ։ൃ/ຊ൪Ұகʢαʔόʔ͕ผͳͷͰҰக͠ͳ͍ʣ Ĺ ϩάʢαʔόʔʹอଘɺΤϥʔ͸ϝʔϧ௨஌ɺόονܥ͸ CRON Ͱ Slack ʹ௨஌ʣ Ĺ ؅ཧϓϩηεʢόοναʔόʔͰ࣮ߦɺSSH ϩάΠϯඞཁʣ 9 / 29

Slide 10

Slide 10 text

Django ͷΞοϓσʔτ ຐ๏ͷΑ͏ͳํ๏͸ଘࡏ͠ͳ͍ Ĺ Django ͷυΩϡϝϯτʹԊͬͯॗʑͱ΍Δ΄͔ͳ͍ Ξοϓσʔτखॱ Ĺ ϢχοτςετΛॻ͘ʢॏཁʣ Ĺ Django ͷόʔδϣϯΛ 1 ্ͭͣͭ͛Δ Ĺ python -Wall manage.py test Ͱςετ࣮ߦɺܯࠂΛ 1 ͭͣͭফԽ͢Δ Ĺ Django 1.11 ʹ౸ୡ͢Δ·Ͱ܁Γฦ͢ ࣮ྫ: ৽نࢀըऀʹϢχοτςετ͸ॻ͚Δͷ͔ Ĺ ແཧͰͨ͠ɻೖࣾ 1 ϲ݄ͷਓһͰ͸Ϣχοτςετ͸ॻ͚ͳ͔ͬͨɻ Ĺ ·ͣ͸ϓϩδΣΫτͷ஌ࣝΛਂΊΔ͜ͱ͔Β࢝ΊΔɻ 10 / 29

Slide 11

Slide 11 text

Django ͷΞοϓσʔτ Django ϛυϧ΢ΣΞͷΞοϓσʔτ Ĺ MIDDLEWARE_CLASSES ͔Β MIDDLEWARE ΁มߋ͢Δ͚ͩͰ͸μϝ Ĺ ϛυϧ΢ΣΞΛࣗ࡞͍ͯͨ͠৔߹͸खΛՃ͑Δඞཁ͕͋Δ ࣮ྫ: αʔυύʔςΟϛυϧ΢ΣΞ͕৽ܗࣜະରԠ Ĺ ݪҼڀ໌ʹ͕͔͔࣌ؒͬͨ Ĺ ϛυϧ΢ΣΞ͕ఏڙ͍ͯ͠Δػೳ͸ Django ͕ެࣜʹఏڙ͢ΔΑ͏ʹͳͬͨɻ ࣮ྫ: ࣗ࡞ϛυϧ΢ΣΞͷΞοϓσʔτ Ĺ ެࣜυΩϡϝϯτʹҠߦखॱ͋Γ 11 / 29

Slide 12

Slide 12 text

Django ͷΞοϓσʔτ Figure: Django Middleware Λ৽ܗࣜ΁มߋ͢Δ Commit 12 / 29

Slide 13

Slide 13 text

SQL ΫΤϦνϡʔχϯά ڪාͷ N + 1 ໰୊ Ĺ ෛՙςετͰൃ֮ʂ Ĺ Django ORM ͸؆୯ɺͦ͏ࢥ͍ͬͯͨ࣌ظ΋͋Γ·ͨ͠ɻ SQL ΫΤϦνϡʔχϯά Ĺ ෛՙςετͰଌఆ͢Δ Ĺ AWS X-Ray ͷτϨʔεσʔλΛݩʹ໰୊ՕॴΛಛఆ͢Δ Ĺ Django ͷυΩϡϝϯτΛಡΈͭͭޮ཰ͷΑ͍ΫΤϦΛ࡞Δ ࣮ྫ: ී௨ɺdjango-debug-toolbar ͡Όͳ͍ͷʁ Ĺ API αʔόʔͩͱ django-debug-toolbar ͸࢖͍ͮΒ͔ͬͨ... Ĺ AWS X-Ray ͳΒ͹։ൃ؀ڥͰ΋ຊ൪؀ڥͰ΋τϨʔεͰ͖Δ ࣮ྫ: AWS X-Ray ͷಋೖ Ĺ Django 1.10 Ҏ্Ͱ͋Δཧ༝: ৽ܗࣜͰ࣮૷͞Ε͍͔ͯͨΒɻ 13 / 29

Slide 14

Slide 14 text

SQL ΫΤϦνϡʔχϯά Figure: AWS X-Ray ʹΑΔτϨʔεσʔλ 14 / 29

Slide 15

Slide 15 text

ෛ࠴Λ෷͏ϦϑΝΫλϦϯά ຐ๏ͷΑ͏ͳํ๏͸ଘࡏ͠ͳ͍ʢ2 ճ໨ʣ Ĺ ϢχοτςετΛॻ͍ͯෆಈ఺Λ࡞͔ͬͯΒɻ Ξοϓσʔτखॱ Ĺ ϢχοτςετΛॻ͘ʢॏཁʣ ʢ2 ճ໨ʣ Ĺ ʮ͋ͬ͜Ε͸ʯͱ͍͏෦෼ΛϦϑΝΫλϦϯά Ĺ python -Wall manage.py test Ͱςετ࣮ߦ Ĺ ݟ௨͕͠Α͘ͳΔ·Ͱܧଓ ࣮ྫ: Django ͷ MVT Ϟσϧʹج͍ͮͨ໾ׂͷ෼཭ Ĺ ৭ʑͱؤு͍ͬͯΔ View ͷॲཧΛ Model ʹҠৡ͢Δ Ĺ ༗ೳ͗͢Δ utils.py ͷػೳΛ Model ʹҠৡ͢Δ Ĺ ॏෳͨ͠ Model ΛجఈΫϥεͰ੔ཧ͢Δ Ĺ σίϨʔλͰڞ௨ॲཧΛҰݩԽ͢Δ 15 / 29

Slide 16

Slide 16 text

؀ڥม਺ʹΑΔઃఆ؅ཧ III. ઃఆ Ĺ ઃఆΛίʔυ͔Βݫີʹ෼཭͢Δ Ĺ ઃఆΛ؀ڥม਺ʹ֨ೲ͢Δ ࣮ྫɿdjango-environ ʹΑΔ؀ڥม਺ͷ੔ཧ Ĺ https://github.com/joke2k/django-environ Ĺ settings.py ʹϋʔυίʔσΟϯά͍ͯͨ͠ઃఆΛ؀ڥม਺΁Ҡৡ Ĺ develop.env ϑΝΠϧͰϩʔΧϧͰ΋؀ڥม਺Λѻ͑ΔΑ͏ʹ͢Δɻ 16 / 29

Slide 17

Slide 17 text

؀ڥม਺ʹΑΔઃఆ؅ཧ Figure: ؀ڥม਺΁ͷ੾Γग़͠Λ࣮ݱͨ͠ Merge Request 17 / 29

Slide 18

Slide 18 text

ΞϓϦέʔγϣϯͷ Docker ίϯςφԽ VIII. ฒߦੑ Ĺ ϓϩηε͸ୈҰڃࢢຽͰ͋Δ IX. ഇغ༰қੑ Ĺ ଈ࠲ʹىಈɾऴྃ͢Δ͜ͱ͕Ͱ͖Δ Ĺ ىಈ࣌ؒΛ࠷খԽ͢Δ X. ։ൃ/ຊ൪Ұக Ĺ ܧଓతσϓϩΠ͠΍͍͢Α͏։ൃ؀ڥͱຊ൪؀ڥͷΪϟοϓΛখ͘͞อͭ 18 / 29

Slide 19

Slide 19 text

ΞϓϦέʔγϣϯͷ Docker ίϯςφԽ ΞϓϦέʔγϣϯͷ Docker ίϯςφԽ Ĺ ഇغ༰қੑɺ։ൃ/ຊ൪ҰகΛ࣮ݱ͢Δ༗ྗͳख๏ ࣮ྫɿVagrant ͔Β Docker ΁ Ĺ ։ൃɿVagrantɺຊ൪ɿAWS EC2 ͔Βͷ୤٫ Ĺ ຊ൪؀ڥΛࢀߟʹ Dockerfile Λ૊ΈཱͯΔ Ĺ ࠷ॳ͸։ൃ؀ڥ͔Βར༻։࢝ɺͦͯ͠ AWS ECS ΁ 19 / 29

Slide 20

Slide 20 text

ΞϓϦέʔγϣϯͷ Docker ίϯςφԽ Figure: AWS ECR ʹϓογϡ͞Εͨ Docker Πϝʔδ 20 / 29

Slide 21

Slide 21 text

ܧଓతΠϯςάϨʔγϣϯɺܧଓతσϓϩΠ V. ϏϧυɺϦϦʔεɺ࣮ߦ Ĺ ϏϧυɺϦϦʔεɺ࣮ߦͷ 3 ͭͷεςʔδΛݫີʹ෼཭͢Δ ࣮ྫɿGitLab CI Ĺ ैདྷ͸ίϛοτ࣌ʹϢχοτςετΛ࣮ߦ͢Δ͚ͩ Ĺ ίϛοτ࣌ʹςετɺϚʔδޙʹ Docker ΠϝʔδϏϧυɺσϓϩΠΛ࣮ࢪ Ĺ σϓϩΠ͸ AWS ECR/ECS ΁ߦ͍ɺ࣮ߦ͸ ECS ΁Ҡৡ 21 / 29

Slide 22

Slide 22 text

ܧଓతΠϯςάϨʔγϣϯɺܧଓతσϓϩΠ Figure: GitLab CI ʹΑΔ CI/CD ύΠϓϥΠϯ 22 / 29

Slide 23

Slide 23 text

ϩΪϯάͱ௨஌ XI. ϩά Ĺ ϩάΛΠϕϯτετϦʔϜͱͯ͠ѻ͏ ࣮ྫɿDocker ϩάυϥΠόʔͱ AWS CloudWatch Ĺ ΞϓϦέʔγϣϯ͔Βͷϩάग़ྗ͸͢΂ͯඪ४ग़ྗ or ඪ४Τϥʔ΁ྲྀ͢ Ĺ ϩά͸͢΂ͯ AWS CloudWatch Logs ΁ૹΔ Ĺ Docker ϩάυϥΠόʔʹઃఆ͢Δ͚ͩͳͷͰ؆୯ Ĺ CloudWatch Alarm Λ૊Έ߹ΘͤͯΤϥʔ௨஌ 23 / 29

Slide 24

Slide 24 text

ϩΪϯάͱ௨஌ Figure: AWS CloudWatch Alarm ͷ௨஌Λ Slack ʹ౤Լͯ͠ରԠ͢Δ 24 / 29

Slide 25

Slide 25 text

όονλεΫͷίϚϯυԽ XII. ؅ཧϓϩηε Ĺ ؅ཧλεΫΛ 1 ճݶΓͷϓϩηεͱ࣮ͯ͠ߦ͢Δ ࣮ྫɿDjango ίϚϯυͱ AWS ECS λεΫ Ĺ Django ίϚϯυ୯ҐͰ ECS λεΫΛ࡞Δ Ĺ ΤϯδχΞҎ֎Ͱ΋όονૢ࡞͕ GUI ্Ͱ࣮ݱͰ͖Δ Ĺ Django ίϚϯυͱ ECS λεΫͷ૬ੑ͸ྑ͍ 25 / 29

Slide 26

Slide 26 text

όονλεΫͷίϚϯυԽ Figure: Django ίϚϯυΛ࣮ߦ͢Δ AWS ECS λεΫ 26 / 29

Slide 27

Slide 27 text

؀ڥม਺஍ࠈ ·͔͞ͷ࣌ͷ؀ڥม਺஍ࠈʂ Ĺ 1 ΞϓϦέʔγϣϯ͋ͨΓ਺ेݸͷ؀ڥม਺ Ĺ ։ൃ؀ڥɺݕূ؀ڥɺຊ൪؀ڥɺCI/CD ޲͚ Ĺ ෳ਺ͷΞϓϦέʔγϣϯ͔ΒͳΔϓϩδΣΫτ ؀ڥม਺஍ࠈΛͲ͏੾Γൈ͚Δ͔ Ĺ ʮϓϥΠϕʔτϨϙδτϦ͔ͩΒ҆৺ʯઆ Ĺ AWS S3 ʹผ్อଘͯ҆͠શʹऔΓग़͢ Ĺ ؀ڥม਺ઐ༻ͷϨϙδτϦΛ࡞੒ͯ͠ SSH or HTTPS Ͱ҆શʹऔΓग़͢ Ĺ AWS ͷΫϨσϯγϟϧ͸ IAM Role Ͱ ECS λεΫʹׂΓ౰ͯͯݮΒ͢ ࣮ྫɿAWS Secrets Manager Ĺ ౉Γʹધ Ĺ ؀ڥม਺Λ؀ڥ͝ͱʹผʹͯ҆͠શʹอଘ͢Δ Ĺ Secrets Manager ͷݤ͸ผ్؅ཧ͢Δඞཁ͕͋Δ 27 / 29

Slide 28

Slide 28 text

Twelve-Factor App ຬ͍ͨͯͨ͠ཁૉ Ĺ ίʔυϕʔε (ηϧϑϗεςΟϯάͷ GitLab Ͱ؅ཧʣ Ĺ όοΫΤϯυαʔϏεʢAWS RDS ͳͲʣ Ĺ ϓϩηεʢγϯάϧϓϩηεʣ Ĺ ϙʔτόΠϯσΟϯάʢNginx ͱͷ૊Έ߹Θͤʣ վળͨ͠ཁૉ Ĺ ઃఆʢ؀ڥม਺ʹΑΔ෼཭ʣ Ĺ ϏϧυɺϦϦʔεɺ࣮ߦʢGitLab CI ʹΑΔ CI/CDʣ Ĺ ґଘؔ܎ʢrequirements.txt ͱ dockerfileʣ Ĺ ฒߦੑʢAWS ECS ʹΑΔΦʔέετϨʔγϣϯʣ Ĺ ഇغ༰қੑʢDocker ίϯςφʣ Ĺ ։ൃ/ຊ൪ҰகʢDockerʣ Ĺ ϩάʢAWS CloudWatchʣ Ĺ ؅ཧϓϩηεʢAWS ECS ͷλεΫʣ 28 / 29

Slide 29

Slide 29 text

·ͱΊ ࣍ظϦϦʔεͷ໨ඪ Ĺ Python 3 ΁ͷҠߦ ˍ Django 2.2 LTS ΁ͷҠߦ ·ͱΊ Ĺ Django ͷΞοϓσʔτʹຐ๏͸ଘࡏ͠ͳ͍ɻ஍ಓͳऔΓ૊Έ͕ॏཁɻ Ĺ ݹ͍ΞϓϦέʔγϣϯͰ΋ Django ϕʔεͳΒ͹վળ͸ߦ͍΍͍͢ɻ Ĺ طଘͷΫϥ΢υͷΤίγεςϜʹ৐͔ͬΔͱԿ͔ͱҠৡͰָ͖ͯʹͳΔɻ Ĺ ؀ڥม਺ͷ؅ཧʹ͸ඞͣ௚໘͢Δɻඋ͑Α͏ɻ 29 / 29