@chichi1091 の 雑記

主に技術系のネタを

AppServiceにPython(Bottle)アプリを手動デプロイする

Azure App ServiceにはGitからデプロイすると必要なモジュールも入ってくれてるのですが、諸事情でGit経由でのデプロイが行えないので手動デプロイを行いました
若干ハマったので忘れないようにメモを残しておきたいと思います
手動デプロイに関しては公式情報も少なく試行錯誤した結果の手順ですのでもっと簡単な方法があるかもしれませんのであしからず。。。

App Serviceの用意

まずはデプロイ先となるAppServiceを用意します
Azureの指示に従っていけば簡単に作れるので細かい説明は端折ります

  1. Azureダッシュボード:メニューのApp Serviceをクリック
  2. 追加をクリック
  3. Web Appをクリック(今回はSQLは使わないので)
  4. 作成をクリック
  5. アプリ名等々を入力して作成をクリック

デプロイするアプリ

App Serviceでアプリを動かすにはweb.configが必要になるので今回はこちらのソースをベースにデプロイを行います(またBottle^^;)
github.com

ただ、残念ながらこのソースのままでは静的ファイルの読み込みが行えないのでcloneしたファイルのapp.pyを修正します

"""
This script runs the application using a development server.
"""

import bottle
import os
import sys

# routes contains the HTTP handlers for our server and must be imported.
import routes

if '--debug' in sys.argv[1:] or 'SERVER_DEBUG' in os.environ:
    # Debug mode will enable more verbose output in the console window.
    # It must be set at the beginning of the script.
    bottle.debug(True)

def wsgi_app():
    """Returns the application to make available through wfastcgi. This is used
    when the site is published to Microsoft Azure."""
    return bottle.default_app()

@bottle.route('/static/<filepath:path>')
def server_static(filepath):
    """Handler for static files, used with the development server.
    When running under a production server such as IIS or Apache,
    the server should be configured to serve the static files."""
    return bottle.static_file(filepath, root=STATIC_ROOT)

if __name__ == '__main__':
    PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
    STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static').replace('\\', '/')
    HOST = os.environ.get('SERVER_HOST', 'localhost')
    try:
        PORT = int(os.environ.get('SERVER_PORT', '5555'))
    except ValueError:
        PORT = 5555

    # Starts a local test server.
    bottle.run(server='wsgiref', host=HOST, port=PORT)

server_staticメソッドを移動しただけです
今回はPython3.4を使うのでweb.3.4.configweb.configにrenameします
ソース一式をAppServiceのrootwww配下にFTP転送しましょう

Python仮想環境の準備

Pythoneerには当たり前なんでしょうがグローバル環境を汚さないようにするため、仮想環境を作りそこに必要なモジュールをインストールします
(AppServiceのグローバルに入れようとするとPermission deniedがでます)

作ったAppServiceのメニューからコンソールを開き、コマンドを実行します

$ python -m venv env
$ cd env/Scripts
$ python -m pip install -r requirements.txt

これで仮想環境を作り、そこに必要なモジュールがインストールされました

以上で、手動デプロイは完了です
AppServiceにアクセスするとアプリが動きます