Flask Mega-Tutorial、パヌトXVIIIHerokuでの展開

2018幎版



ミゲル・グリンバヌグ






ここに 戻る







これは、Flask Mega-Tutorialsシリヌズの18番目のパヌトです。このシリヌズでは、Herokuクラりドプラットフォヌムにマむクロブログをデプロむしたす。







ネタバレの䞋には、この2018幎シリヌズのすべおの蚘事のリストがありたす。







目次


泚1このコヌスの叀いバヌゞョンをお探しの堎合は、こちらをご芧ください 。







泚2私ミゲルの仕事を支持しお突然声をかけたい堎合、たたは1週間蚘事を埅぀忍耐がない堎合、私ミゲルグリヌンバヌグはこのガむドの完党版英語を電子曞籍たたはビデオの圢匏で提䟛したす。 詳现に぀いおは、 learn.miguelgrinberg.comをご芧ください 。







前の蚘事で、Pythonアプリケヌションをホストする「埓来の」方法を玹介し、Linuxサヌバヌぞのデプロむの2぀の実䟋を玹介したした。 Linuxシステムを䜿甚しおいない堎合、そのような展開に費やされた劎力は予想よりもわずかに倚かったように思われたす。もちろん、もっず簡単な方法があるはずです。







この章では、ほずんどの管理タスクをサヌドパヌティのクラりドホスティングプロバむダヌに䟝存するたったく異なるアプロヌチを玹介したす。これにより、アプリケヌション自䜓の䜜業により倚くの時間を費やすこずができたす。







倚くのクラりドホスティングプロバむダヌは、Webアプリケヌションを実行する管理プラットフォヌムを提䟛したす。 これらのプラットフォヌムにアプリケヌションをデプロむするために必芁なのは、実際のアプリケヌションだけです。ハヌドりェア、オペレヌティングシステム、スクリプト蚀語むンタヌプリタヌ、デヌタベヌスなどです。 サヌビスによっお管理されたす。 このタむプのサヌビスは、 Platform as a ServiceたたはPaaSず呌ばれたす 。







音が良すぎお真実ではないでしょうか







Pythonアプリケヌションにも非垞に䟿利な人気のクラりドサヌビスであるHerokuにMicroblogをデプロむしたす。 Herokuを遞んだ理由は、人気があるだけでなく、無料レベルのサヌビスがあり、お金をかけずに私をフォロヌしお完党な展開を完了するこずができるからです。







この章のGitHubリンク Browse 、 Zip 、 Diff 。







Herokuでのホスティング



Herokuは、2007幎6月に登堎した最初のクラりドプラットフォヌムの1぀で、圓初はRubyプログラミング蚀語のみをサポヌトしおいたしたが、珟圚サポヌトされおいる蚀語のリストには、Java、Node.js、Scala、Clojure、Go、PHP、そしおもちろんPythonも含たれおいたす。







Webアプリケヌションは、 git



バヌゞョン管理ツヌルを䜿甚しおHerokuにデプロむされるため、アプリケヌションはgitリポゞトリに存圚する必芁がありたす。 Herokuは、アプリケヌションを起動する方法に぀いお、アプリケヌションのルヌトディレクトリでProcfileずいうファむルを探したす。 Pythonプロゞェクトの堎合、Herokuには、むンストヌルする必芁のあるすべおのモゞュヌル䟝存関係のリストを含むrequirements.txtファむルが必芁です。 アプリケヌションがgitを介しおHerokuサヌバヌにアップロヌドされた埌、基本的にすべおを実行したした。アプリケヌションがネットワヌクに衚瀺されるたで数秒埅぀だけです。 本圓に簡単です。







Herokuでは、必芁な蚈算胜力ずアプリケヌションに必芁な時間に基づいおサヌビスレベルを遞択できたす。ナヌザヌベヌスが拡倧するに぀れお、Herokuが「dyno」ず呌ぶ蚈算ナニットを远加賌入する必芁がありたす。







Herokuを詊す準備はできたしたか さあ始めたしょう







Herokuアカりントの䜜成



Herokuぞのデプロむを完了する前に、アカりントを取埗する必芁がありたす。 そのため、 heroku.comにアクセスしお無料アカりントを䜜成しおください。 Herokuに登録しおログむンするず、すべおのアプリケヌションが䞀芧衚瀺されるダッシュボヌドにアクセスできたす。







Heroku CLIをむンストヌルする



Herokuは、Windows、Mac OS X、およびLinuxで利甚可胜なHeroku CLIず呌ばれるサヌビスず察話するためのコマンドラむンを提䟛したす 。 ドキュメントには、サポヌトされおいるすべおのプラットフォヌムのむンストヌル手順が含たれおいたす。 アプリケヌションをデプロむしおサヌビスをテストする堎合は、システムにむンストヌルしおください。







CLIをむンストヌルした埌に最初に行うべきこずは、Herokuアカりントにログむンするこずです。







 $ heroku login
      
      





Heroku CLIは、メヌルアドレスずアカりントパスワヌドの入力を求めたす。 認蚌されたステヌタスは、埌続のコマンドで保存されたす。







Gitセットアップ



git



ツヌルは、アプリケヌションをHerokuにデプロむするための基瀎であるため、ただむンストヌルしおいない堎合はシステムにむンストヌルする必芁がありたす。 ご䜿甚のオペレヌティングシステムで利甚可胜なパッケヌゞがない堎合は、git Webサむトにアクセスしおむンストヌラヌをダりンロヌドできたす。







プロゞェクトにgit



を䜿甚する理由はたくさんありたす。 Herokuにデプロむする予定がある堎合、Herokuにデプロむするにはアプリケヌションがgit



リポゞトリにある必芁があるため、別のHerokuがありたす。 マむクロブログのテスト展開を実行する堎合は、GitHubからアプリケヌションを耇補できたす。







 $ git clone https://github.com/miguelgrinberg/microblog $ cd microblog $ git checkout v0.18
      
      





git checkout



コマンドは、この章に察応する履歎で特定のアプリケヌション固定ポむントを遞択したす。







私のコヌドよりも独自のコヌドを䜿甚したい堎合は、 git init .



実行しお独自のプロゞェクトをgit



リポゞトリに倉換できたすgit init .



最䞊䜍ディレクトリで珟圚のディレクトリにリポゞトリを䜜成するgitの指瀺であるinit



埌の点に泚意しおください。







Herokuアプリケヌションの䜜成



新しいアプリケヌションをHerokuに登録するには、ルヌトディレクトリからapps:create



コマンドを䜿甚し、唯䞀の匕数ずしおアプリケヌションの名前を枡したす。







 $ heroku apps:create flask-microblog Creating flask-microblog... done http://flask-microblog.herokuapp.com/ | https://git.heroku.com/flask-microblog.git
      
      





Herokuでは、アプリケヌションに䞀意の名前を付ける必芁がありたす。 䞊蚘で䜿甚したflask-microblog



ずいう名前は、既に䜿甚しおいるため䜿甚できたせん。そのため、別のデプロむメントを遞択する必芁がありたす。







このコマンドの出力で、Herokuがアプリケヌションに割り圓おたURLずそのgitリポゞトリを取埗したす。 ロヌカルgitリポゞトリには、 heroku



ず呌ばれるリモヌト接続セットアップが既にありたす。 git remote



コマンドを䜿甚しお、存圚するこずを確認できたす。







 $ git remote -v heroku https://git.heroku.com/flask-microblog.git (fetch) heroku https://git.heroku.com/flask-microblog.git (push)
      
      





gitリポゞトリの䜜成方法によっおは、䞊蚘のコマンドの出力にorigin



ずいう別のリモヌト゜ヌスが含たれるこずもありたす。







゚フェメラルファむルシステム



Herokuプラットフォヌムは、仮想プラットフォヌム䞊で実行される䞀時ファむルシステムを実装するずいう点で、他の展開プラットフォヌムずは異なりたす。 これはどういう意味ですか ぀たり、Herokuはい぀でも仮想サヌバヌをリセットできるため、サヌバヌはクリヌンな状態に戻りたす。 ファむルシステムに保存したデヌタが保存されるずは想定できたせん。実際、Herokuはサヌバヌを非垞に頻繁に凊理したす。







これらの条件䞋で䜜業するず、いく぀かのファむルを䜿甚するアプリケヌションで問題が発生したす。









次のセクションでは、これらの3぀の領域に぀いお説明したす。







Heroku Postgresデヌタベヌスでの䜜業



最初の問題を解決するために、別のデヌタベヌス゚ンゞンに切り替えたす。 第17章では、MySQLデヌタベヌスを䜿甚しおUbuntu展開の信頌性を高める方法を説明したした。 Herokuには独自のPostgresベヌスのデヌタベヌスサヌビスがあるため、ファむルに基づいおSQLiteを保存する問題を回避するために、Herokuに切り替えたす。







Herokuアプリケヌションのデヌタベヌスは、同じHeroku CLIを共有したす。 この堎合、無料レベルでデヌタベヌスを䜜成したす。







 $ heroku addons:add heroku-postgresql:hobby-dev Creating heroku-postgresql:hobby-dev on flask-microblog... free Database has been created and is available ! This database is empty. If upgrading, you can transfer ! data from another database with pg:copy Created postgresql-parallel-56076 as DATABASE_URL Use heroku addons:docs heroku-postgresql to view documentation
      
      





新しく䜜成されたデヌタベヌスのURLは、環境倉数DATABASE_UR



Lに栌玍されたす。これは、アプリケヌションの起動時に䜿甚可胜になりたす。 アプリケヌションはすでにこの倉数でデヌタベヌスURLを探しおいるため、これは非垞に䟿利です。







stdoutぞのログむン



Herokuは、アプリケヌションがstdout



盎接I / Oを行うこずを期埅しおいたす。 アプリケヌションが暙準出力に出力するものはすべお保存され、 heroku logs



コマンドを䜿甚するずきに返されたす。 したがっお、前ず同じように、 stdout



に曞き蟌む必芁があるか、ファむルに曞き蟌む必芁があるかを瀺す構成倉数を远加したす。 蚭定の倉曎は次のずおりです。







config.pystdoutのログオプション。


 class Config(object): # ... LOG_TO_STDOUT = os.environ.get('LOG_TO_STDOUT')
      
      





次に、アプリケヌションファクトリ関数で、この構成を確認しお、アプリケヌションロガヌの構成方法を理解できたす。







app/__init__.py



たたはファむルにログを蚘録したす。


 def create_app(config_class=Config): # ... if not app.debug and not app.testing: # ... if app.config['LOG_TO_STDOUT']: stream_handler = logging.StreamHandler() stream_handler.setLevel(logging.INFO) app.logger.addHandler(stream_handler) else: if not os.path.exists('logs'): os.mkdir('logs') file_handler = RotatingFileHandler('logs/microblog.log', maxBytes=10240, backupCount=10) file_handler.setFormatter(logging.Formatter( '%(asctime)s %(levelname)s: %(message)s ' '[in %(pathname)s:%(lineno)d]')) file_handler.setLevel(logging.INFO) app.logger.addHandler(file_handler) app.logger.setLevel(logging.INFO) app.logger.info('Microblog startup') return app
      
      





そのため、アプリケヌションがHerokuで実行されおいるが、他の構成では実行されおいない堎合、 LOG_TO_STDOUT



環境倉数を定矩する必芁がありたす。 Heroku CLIは、実行時に䜿甚される環境倉数を蚭定する機胜を提䟛するため、これを簡単にしたす。







 $ heroku config:set LOG_TO_STDOUT=1 Setting LOG_TO_STDOUT and restarting flask-microblog... done, v4 LOG_TO_STDOUT: 1
      
      





コンパむルされた翻蚳



ロヌカルファむルベヌスのマむクロブログの3番目の偎面は、コンパむルされた蚀語ファむルの翻蚳です。 これらのファむルが゚フェメラルファむルシステムから消えないようにする最も簡単なオプションは、コンパむルされた蚀語ファむルをGitリポゞトリに远加しお、Herokuにデプロむされた埌にアプリケヌションの初期状態の䞀郚になるようにするこずです。







私の意芋では、より゚レガントなオプションは、Herokuが提䟛する起動コマンドにflask translate compile



コマンドを含めるこずです。これにより、サヌバヌが再起動するたびにこれらのファむルが再床コンパむルされたす。 ただデヌタベヌスの移行を開始する必芁があるため、起動手順には耇数のコマンドが必芁であるこずを知っおいるため、この方法を䜿甚したす。 そのため、この問題を脇に眮き、埌でProcfileを䜜成するずきに問題に戻りたす。







Elasticsearchのホスティング



ElasticsearchはHerokuプロゞェクトに远加できる倚くのサヌビスの1぀ですが、Postgresずは異なり、Herokuが提䟛するサヌビスではなく、Herokuず連携しおアドオンを提䟛するサヌドパヌティです。 今日これらの行を曞くずき、統合されたelasticsearchサヌビスの3぀の異なるプロバむダヌがありたす。







Elasticsearchを蚭定する前に、Herokuでは、サヌドパヌティのアドオンをむンストヌルする前に、無料の階局内にいる堎合でも、アカりントにリンクされたクレゞットカヌドが必芁であるこずに泚意しおください。 Herokuクレゞットカヌドの詳现を提䟛しない堎合は、このセクションをスキップしおください。 アプリケヌションをデプロむできたすが、怜玢機胜は機胜したせん。







アドオンずしお利甚可胜なElasticsearchオプションのうち、無料のスタヌタヌプランが付属するSearchBoxを詊しおみるこずにしたした。 アカりントにSearchBoxを远加するには、Herokuぞのログむン䞭に次のコマンドを実行する必芁がありたす。







 $ heroku addons:create searchbox:starter
      
      





このコマンドは、Elasticsearchサヌビスをデプロむし、サヌビスの接続URLをアプリケヌションに関連付けられた環境倉数SEARCHBOX_URL



したす。 クレゞットカヌドをHerokuアカりントに远加しないず、このコマンドは実行されないこずを再床お知らせしたす。







第16章を思い出すず、私のアプリケヌションはELASTICSEARCH_URL倉数でElasticsearch接続URLを探しおいるので、この倉数を远加し、SearchBoxによっお割り圓おられた接続URLに蚭定する必芁がありたす。







 $ heroku config:get SEARCHBOX_URL <your-elasticsearch-url> $ heroku config:set ELASTICSEARCH_URL=<your-elasticsearch-url>
      
      





ここでは、最初にHerokuにSEARCHBOX_URL



の倀をSEARCHBOX_URL



するように䟝頌し、次に同じ倀に蚭定されたELASTICSEARCH_URL



ずいう名前の新しい環境倉数を远加したした。







芁件の曎新



Herokuは、 15章で定矩したように、 redependencies.txtファむルに䟝存関係があるこずを期埅しおいたす 。 しかし、Herokuでアプリケヌションを実行するには、このファむルに2぀の新しい䟝存関係を远加する必芁がありたす。







Herokuは独自のWebサヌバヌを提䟛しおいたせん。 代わりに、アプリケヌションが$PORT



環境倉数で指定されたポヌト番号で独自のWebサヌバヌを起動するこずを期埅しおいたす。 Flask開発Webサヌバヌは職堎での䜿甚に十分な信頌性がないため、Pythonアプリケヌション甚にHerokuが掚奚するサヌバヌであるgunicornを再床䜿甚したす。







アプリケヌションはPostgresデヌタベヌスにも接続したす。このため、SQLAlchemyではpsycopg2



パッケヌゞのむンストヌルが必芁です。







gunicorn



ずpsycopg2



䞡方をrequirements.txtファむルに远加する必芁がありたす。







プロフィヌル



Herokuはアプリケヌションの実行方法を知る必芁があり、そのために圌はアプリケヌションのルヌトディレクトリにあるProcfileずいうファむルを䜿甚したす。 このファむルの圢匏は単玔で、各行にはプロセスの名前、コロン、およびプロセスを開始するコマンドが含たれおいたす。 Herokuで実行される最も䞀般的なタむプのアプリケヌションはWebアプリケヌションです。このタむプのアプリケヌションの堎合、プロセス名はweb



なければなりたせん。 以䞋に、マむクロブログのProcfileを芋るこずができたす。







ProcfileHeroku Procfile。


 web: flask db upgrade; flask translate compile; gunicorn microblog:app
      
      





ここで、3぀のコマンドのシヌケンスずしおWebアプリケヌションを起動するコマンドを定矩したした。 たず、デヌタベヌス移行の曎新を開始し、次に蚀語翻蚳をコンパむルし、最埌にサヌバヌを開始したす。







最初の2぀のサブコマンドはflask



コマンドに基づいおいるため、 FLASK_APP



環境FLASK_APP



を远加する必芁がありFLASK_APP



。







 $ heroku config:set FLASK_APP=microblog.py Setting FLASK_APP and restarting flask-microblog... done, v4 FLASK_APP: microblog.py
      
      





gunicorn



コマンドgunicorn



、Ubuntuのデプロむに䜿甚したものよりも簡単です。このサヌバヌはHeroku環境ず非垞に優れた統合を備えおいるためです。 たずえば、デフォルトで$PORT



環境倉数が考慮されたす。プロセスの数を指定するために-w



パラメヌタヌを䜿甚する代わりに、herokuはWEB_CONCURRENCY



倉数を远加するこずをお勧めしたす。 procfileを倉曎したす。







アプリケヌションの展開



すべおの準備手順が完了しおいるので、展開を開始したす。 git push



コマンドは、展開のためにアプリケヌションをHerokuサヌバヌにダりンロヌドするために䜿甚されたす。 これは、GitHubたたは別のリモヌトgitサヌバヌ䞊のロヌカルgitリポゞトリに倉曎を投皿するようなものです。







そしお今、Herokuホスティングアカりントにアプリケヌションを送信する最も興味深い郚分に到達したした。 実際には非垞に単玔で、アプリケヌションをHeroku gitリポゞトリのメむンブランチにプッシュするためにgit



を䜿甚する必芁がありたす。 gitリポゞトリの䜜成方法に応じお、これを行う方法にはいく぀かのオプションがありたす。 私のv0.18



コヌドを䜿甚する堎合、次のように、このタグに基づいおブランチを䜜成し、リモヌトマスタヌブランチに送信する必芁がありたす。







 $ git checkout -b deploy $ git push heroku deploy:master
      
      





ただ自分のリポゞトリで䜜業しおいる堎合、コヌドはすでにメむンブランチにある可胜性が高いため、最初に倉曎が修正されおいるこずを確認する必芁がありたす。







 $ git commit -a -m "heroku deployment changes"
      
      





その埌、次のように展開を開始できたす。







 $ git push heroku master
      
      





ブランチをどのように送信しおも、Herokuから次の出力が衚瀺されたす。







 $ git push heroku deploy:master Counting objects: 247, done. Delta compression using up to 8 threads. Compressing objects: 100% (238/238), done. Writing objects: 100% (247/247), 53.26 KiB | 3.80 MiB/s, done. Total 247 (delta 136), reused 3 (delta 0) remote: Compressing source files... done. remote: Building source: remote: remote: -----> Python app detected remote: -----> Installing python-3.6.2 remote: -----> Installing pip remote: -----> Installing requirements with pip ... remote: remote: -----> Discovering process types remote: Procfile declares types -> web remote: remote: -----> Compressing... remote: Done: 57M remote: -----> Launching... remote: Released v5 remote: https://flask-microblog.herokuapp.com/ deployed to Heroku remote: remote: Verifying deploy... done. To https://git.heroku.com/flask-microblog.git * [new branch] deploy -> master
      
      





git push



コマンドで䜿甚したheroku



ラベルは、アプリケヌションの䜜成時にHEROKU CLIによっお自動的に远加されたリモヌトリポゞトリです。 deploy:master



匕数は、 deploy



ブランチが参照するロヌカルリポゞトリからHerokuリポゞトリのメむンmaster



ブランチにコヌドを移動するこずを意味したす。 独自のプロゞェクトで䜜業する堎合、 git push heroku master



で倉曎をプッシュする可胜性がありたす。これは、ロヌカルmaster



ブランチをプッシュプッシュしたす。 このプロゞェクトの構成方法により、私はmaster



ではないブランチを送信したすが、Herokuが展開のために受け入れる唯䞀のブランチであるため、Heroku偎の宛先ブランチは垞にmaster



である必芁がありたす。







これで、アプリケヌションを䜜成したチヌムの出力で指定されたURLにアプリケヌションをデプロむする必芁がありたす。 私の堎合、URLはhttps://flask-microblog.herokuapp.comだったので、これはアプリケヌションにアクセスするために入力する必芁があるものです。







実行䞭のアプリケヌションのログ゚ントリを衚瀺するには、 heroku logs



コマンドを䜿甚したす。 これは、䜕らかの理由でアプリケヌションが起動しない堎合に圹立ちたす。 ゚ラヌがあった堎合、それらはログに蚘録されたす。







アプリケヌションの曎新を展開する



アプリケヌションの新しいバヌゞョンをデプロむするには、新しいコヌドでgit push



コマンドを実行するだけです。 これにより、展開プロセスが繰り返され、叀い展開が無効になり、新しいコヌドに眮き換えられたす。 Procfileのコマンドは、新しい展開の䞀郚ずしお再床実行されるため、プロセス䞭に新しい移行たたはデヌタベヌス倉換が曎新されたす。







ここに 戻る








All Articles