PyLadies Tokyo 7周年パーティーのLT
Flask + Google App EngineʢGAEʣͰWeb APIΛσϓϩΠ͢Δ·Ͱ - Github ActionsΛఴ͑ͯ -PyLadies Tokyo - 7पه೦ΦϯϥΠϯύʔςΟ 2021/10/3Shinichi [email protected]
View Slide
Happy Birthday🎂PyLadies Tokyo 7प͓ΊͰͱ͏͍͟͝·͢ʂ
ࠓճ࡞ͬͨͷ - AIΦΦλχαϯຊྥଧ༧ଌAPI͛Δʢӈorࠨʣ, ٿʢmile/hʣ, ٿछʢٿ, Χʔϒ, εϥΠμʔ, etc…ʣΛύϥϝʔλͱͯ͠POSTΦΦλχ͞Μ͕ຊྥଧΛଧͯΔ͔Ͳ͏͔ࡶʹ͏Ψνϟ…ͱ͍ਓೳͱࢥ͍ͬͯͩ͘͞.
Who am I ?ʢ͓લ୭Αʣ• Shinichi Nakagawaʢத ৳Ұʣ• େͷSNSͰʮshinyorkeʢ͠ΜΑʔ͘ʣʯͱ໊͍ͬͯ·͢• Software Engineer & Data ScientistʢؚΉ⽁ʣ• ֎ࢿܥاۀͷΤϯδχΞɾϚωʔδϟʔʢࠓ݄͔Βʣ• #Python #DataScience #Baseball⚾ #SABRmetrics
ࠓͷ͓࢈• WebαΠτ͘͠APIΛFlaskͰͭ͘Δͱܾ·͍ͬͯΔલఏͰ• ʮͻͱ·ͣશੈքʹެ։͠ͳ͍ͱ͔͋Μͷʔʯͬͯ࣌ʹ• Google App EngineʢGAEʣ + Github Actions ͰςετˠσϓϩΠΛ͍͍ײ͡ʹΔํ๏ΛαΫοͱ͠·͢• ͳ͓, ͜ͷPyCon JP 2021Ͱ͢༧ఆͷτʔΫ…ͷҰ෦Ͱ͢
ຊͷߏखݩͰͭ͘ΔˠGithub ActionsͰςετ+σϓϩΠˠ༏উ
ཧతͳ։ൃॱং1.ͬ͞͞ͱಈ͘ΞϓϦΛͭ͘ΔʢݪܕΛͭ͘Δʣ2.ͻͱ·ͣಈ͘ͷΛσϓϩΠ͢Δ3.CIʢࠓճGithub ActionsʣΛಈ͘Α͏ʹ͢Δ4.ςετˠσϓϩΠͷྲྀΕΛͭ͘Δ৭ʑͱख๏ɾफ͋Γͦ͏Ͱ͕͢ແͳͷ͜Μͳײͩ͡ͱࢥ͏
FlaskͰͻͱ·ͣ࡞ͬͯGAEͰಈ͔͢·Ͱ• ͡ΊͯGAEΛ৮Δʢorٱ͠ͿΓʹ৮ΔʣํGoogle CloudͷΫΠοΫελʔτΛࢀߟʹΔͱྑ͍Ͱ͠ΐ͏, ࣸܦͯ͠ਅࣅΔͷ͕ͪΐ͏ͲΑ͍͔.• https://cloud.google.com/appengine/docs/standard/python3/quickstart?hl=ja• ্هΛ௨͠ͰΔͱFlaskͷhello world͕ര, ΈཧղͰ͖Δͣ.• ͋ͱ࡞Γ͍ͨϞϊͷ༷ʹ߹ΘͤͯFlaskͷίʔυΛ͍͡ΕOK• ྫ͑RESTfulʹ͢ΔͳΒResponseΛJSONʹม͑Δͱ͔• FastAPIͳͲ, ଞͷFWΛ͏࣌ͦ͜ʹ߹Θͤͯ࡞Γͤ
ʲࡶஊʳGAE ελϯμʔυVSϑϨΩγϒϧ• Python͍తʹ, GAE͏࣌ݪଇελϯμʔυҰͰྑ͍ͱࢥͬͯ·͢• ελϯμʔυڥ, Pythonͷόʔδϣϯ৽͍͠ʢݱࡏ3.9ʣ ͷͱ, scikit-learnͱ͔pandasͳ͘ಈ͘ͷͰେͷࣄͰ͖Δ →AIΦΦλχαϯຊྥଧ༧ଌsklearn + pandasͰಈ͍ͯ·͢, GAEͰͳ͘• σϓϩΠָ͕, ߴෛՙରࡦख͍ؒΒͣͱελϯμʔυͦͷͷͷڧΈଟ͍• ଞͷϓϩάϥϛϯάݴޠ, ෳࡶͳ͜ͱΛ͢Δ࣌ʹϑϨΩγϒϧͰྑ͍ͱࢥ͏ ʢ͕, ࠓCloud Run͋Δ͠…ʣ
ߴෛՙରࡦʢapp.yamlهड़ྫʣruntime: python39automatic_scaling:max_instances: 33 # ࠷େͷΠϯελϯεʢ͜ΕҎ্૿͑ͳ͍ʣmin_instances: 4 # ࠷খͷΠϯελϯεʢ͜ΕҎ্ݮΒͳ͍ʣ• app.yamlͷΦϓγϣϯΛ͍ͬͯ͡deployͨ͠Β͍͍ײ͡ʹ͍͚·͢ʢ্هͷྫελϯμʔυڥʣ• TVʹग़Δ, SNSͰόζΔ͕༧͞ΕΔ࣌ࣄલʹύϥϝʔλΛ͍ͬͯ͡σϓϩΠͯ͠ղܾ ͪͳΈʹ૿͑ͨΠϯελϯεapp.yamlΛͯ͠࠶σϓϩΠ or GCPͷίϯιʔϧͰखಈͰফ͢ͰରԠͰ͖·͢• min_instancesΛ0ʹͨ͠ΒʮϦΫΤετ͕͖ͨΒ্ཱͪ͛ΔʯΈ͍ͨͳײ͡ʹ ʢϨεϙϯε͕དྷΔ·Ͱ͔͔࣌ؒΔ͕ྉۚઅͰ͖Δʣ• max_instancesΛ0ʹͨ͠Βύϥϝʔλ͕ແޮʹͳΓ·͢…͕͓͢͢Ί͠·ͤΜ ࣄ্࣮࠷େΛఆٛ͢Δ͜ͱʹͳΔͨΊʢ㲈ͳʹ͔ͷΞΫγσϯτͰΠϯελϯε͕૿͑Δʣ
Github ActionsͰGAEʹσϓϩΠ• https://github.com/google-github-actions/deploy-appengine• ͜ΜͳศརͳϞϊ͕ग़ͨͷͰඇৗʹָʹͳͬͨ• GCPϓϩδΣΫτIDͱ伴Λࢦఆͨ͠Β͍͍ײ͡ʹͬͯ͘ΕΔ
ʲྫʳActionsͷهड़name: deployon:push:branches:- mainjobs:deploy-gae:name: App Engine Deployruns-on: ubuntu-lateststeps:- uses: actions/[email protected]2- name: Deploy an App Engine appid: deploy-appuses: google-github-actions/[email protected]1with:project_id: ${{ secrets.GCP_PROJECT_ID }}deliverables: app.yamlcredentials: ${{ secrets.GCP_SA_KEY }}version: v1
ςετͲ͏͢Δ🤔# AIΦΦλχαϯຊྥଧ༧ଌͷύοέʔδߏʢΠϝʔδʣapp/!"" entities/!"" interfaces/ # FlaskҎ֎ͷαʔυύʔςΟʔɾϥΠϒϥϦΛimportͯ͠OKͳॴ!"" tests/# !"" dataset/ # testsͰ͏σʔληοτʢ͍ΘΏΔfixtureʣ # !"" entities/ # entitiesͷςετ# !"" interfaces/ # interfacesͷςετ# $"" usecase/ # usecaseͷςετ!"" usecase/main.py # Flaskʹґଘͯ͠OKͳͱ͜Ζ• ͋Δఔ࡞ͬͨΒ༻ҙ͠·͠ΐ͏, σΟϨΫτϦɾύοέʔδ୯ҐͰ͚Δͱϕετ• ࠷ॳಈ͘ͷ͋Γ͖, ঃʑʹTDDʢςετۦಈ։ൃʣͬΆ͘Ͱ͖Δͱ࣭εϐʔυ͍͍ײ͡ʹ• ͋ΔఔͰ͖ͨΒ͜ΕGithub ActionsʹՃ͑Δʢςετͷલʹ࣮ߦͯ͠Τϥʔग़ͨΒσϓϩΠ͠ͳ͍ʣ
ʲྫʳActionsͷهड़ʢςετՃ൛ʣname: CIon: pushjobs:test:name: testruns-on: ubuntu-lateststeps:- uses: actions/[email protected]r- name: Installuses: abatilo/[email protected]0with:python_version: 3.9.7poetry_version: 1.1.7args: install- name: Run mypyuses: abatilo/[email protected]0with:python_version: 3.9.7poetry_version: 1.1.7args: run python -m mypy.- name: Run pytestuses: abatilo/[email protected]0with:python_version: 3.9.7poetry_version: 1.1.7args: run python -m pytest.deploy-gae:name: App Engine Deployneeds: testif: github.ref == 'refs/heads/main'runs-on: ubuntu-lateststeps:- uses: actions/[email protected]2- name: Deploy an App Engine appid: deploy-appuses: google-github-actions/[email protected]1with:project_id: ${{ secrets.GCP_PROJECT_ID }}deliverables: app.yamlcredentials: ${{ secrets.GCP_SA_KEY }}version: v1
݁ͼ• ࠷ॳʹখ͍͞ΞϓϦέʔγϣϯΛ࡞ͬͯσϓϩΠ͢Δ·ͰΛ Δͷ͕࠷खͬऔΓૣ͘ੈͷதʹग़ͤΔ &ਫ਼ਆతෛՙগͳ͍ͱࢥ͏ͷͰڧ͓͘͢͢Ί͍ͨ͠• Github Actions͍ͩͿ৭ʑἧ͖ͬͯͨͷͰྑͦ͞͏ ʢࠓճॳΊͯͪΌΜͱ͕ͬͨࢥͬͨΑΓָͩͬͨʣ• ҎલͷࣄʢAIϫΫνϯछ༧ଌʣࠓճͷαϯϓϧ ͜ͷख๏Ͱര։ൃͰ͖·ͨ͠👍
ʲ༧ࠂʳ2021/10/16 11:40ϓϨΠϘʔϧ⽁https://2021.pycon.jp/PyCon JPຊ൪ͰʮStreamlitͰϓϩτλΠϓ࡞ͬͨޙ, ຊαʔϏεͱ͍͍ͯ͠ײ͡ʹΔʯΛ͠·͢
ήʔϜηοτ⚾͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠.Shinichi Nakagawa(Twitter/Facebook/etc… @shinyorke)