目次
こんにちは。sinyです。
この記事では、djangoアプリケーションをAzure App Service上にデプロイしてAzure上でWEBサービスを稼働させる方法について紹介します。
前提環境
この記事では以下の環境を前提にしています。
環境 | ローカルPC | Azure |
OS | Windows10 | linux |
データベース | PostgresSQL | PostgresSQL |
python | 3.6 | 3.7 |
その他モジュール | Django==2.1.2 django-bootstrap-form==3.4 django-extensions==2.2.3 psycopg2-binary==2.7.5 pytz==2018.5 whitenoise==4.1 |
ローカル環境にPostgresSQLをインストール
まず、最初にローカル環境にPostgresSQLをインストールします。
PostgreseSQLはこちらからダウンロードできます。
今回は、リンクのWindows x86-64のバージョン10.10を利用します。
インストーラ「postgresql-10.10-2-windows-x64.exe」をダウンロードしたらダブルクリックでインストールします。
特段難しい点はないので詳細の手順は省略します。
また、pythonとgitは導入済みの前提で説明しますので、導入していない人は適宜インストールしておいてください。
PostgresSQLの導入が終わったら、Windowsの環境変数「PATH」にpostgresSQLのbinのパスを追加しておきます。
通常だと「C:\Program Files\PostgreSQL\10\bin」という感じです。
Powershellを起動したら以下のコマンドでデータベースに接続します。
psql -U postgres -d postgres
パスワードを聞かれるので、インストール時に設定したパスワードを入力しましょう。
DBに接続すると以下のように「postgres=#」と表示されます。
今回は家計簿アプリを作成するので、kakeibodbというデータベースを作ります。
ついでに管理ユーザと権限設定も行っておきます。
CREATE DATABASE <データベース名>;
CREATE USER <ユーザ名> WITH PASSWORD '<パスワード>';
GRANT ALL PRIVILEGES ON DATABASE <データベース名> TO <ユーザ名>;
postgres=# create database kakeibodb; CREATE DATABASE postgres=# create user manager with password 'supersecretpass'; CREATE ROLE postgres=# grant all privileges on database kakeibodb to manager; GRANT postgres=#
「\l」コマンドを実行するとデータベースの一覧が表示されるのでkakeibodbが作成されているのを確認します。
postgres=# \l データベース一覧 名前 | 所有者 | エンコーディング | 照合順序 | Ctype(変換演算子) | アクセス権限 -----------+----------+------------------+--------------------+--------------------+----------------------- kakeibodb | postgres | UTF8 | Japanese_Japan.932 | Japanese_Japan.932 | =Tc/postgres + | | | | | postgres=CTc/postgres+ | | | | | manager=CTc/postgres postgres | postgres | UTF8 | Japanese_Japan.932 | Japanese_Japan.932 | template0 | postgres | UTF8 | Japanese_Japan.932 | Japanese_Japan.932 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | Japanese_Japan.932 | Japanese_Japan.932 | =c/postgres + | | | | | postgres=CTc/postgres
以上でデータベースの初期設定は完了です。
「\q」コマンドを実行して終了しておきましょう。
ローカルでDjangoアプリを作成
続いて、ローカルのWindows10環境でDjangoアプリを作成します。
git clone
今回は、本ブログの管理人(siny)が下記のNoteで配信している家計簿アプリのdjangoリポジトリをcloneします。
以下のコマンドでcloneしましょう。
cd C:\Users\sinfo\Desktop\Azure\django git clone https://github.com/sinjorjob/kakeibo_app.git
仮想環境を作成
続いて、pythonの仮想環境(myenv)を作成してアクティベートします。
アクティベート後kakeibo_appフォルダに移動しておきます。
cd kakeibo_app\tutorial python -m venv myenv .\myenv\scripts\activate
Djangoアプリをローカルで実行
続いて、djangoアプリをローカルで実行します。
kakeibo_app\tutorialフォルダ直下にenv.ps1ファイルを作成して以下の設定(データベース接続に必要な情報)を記述します。
$Env:DBHOST = "localhost" $Env:DBUSER = "manager" $Env:DBNAME = "kakeibodb" $Env:DBPASS = "supersecretpass"
powershellの画面でkakeibo_appフォルダ上で以下のコマンドを実行してenv.ps1の設定をロードします。
.\env.ps1
また、settings.pyを開いてデータベースの設定でpostgresSQLを利用するように変更します。
※この設定により先ほど作成したenv.ps1の設定情報をロードするようになります。
※変更前
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
※変更後
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': os.environ['DBNAME'], 'HOST': os.environ['DBHOST'], 'USER': os.environ['DBUSER'], 'PASSWORD': os.environ['DBPASS'] } }
ここまでできたら、kakiebo_app\tutorialフォルダ直下にて以下のコマンドを実行し必要なモジュールのインストールとマイグレーションを行います。
pip install -r requirements.txt python manage.py migrate python manage.py createsuperuser python manage.py runserver
http://127.0.0.1:8000/adminにアクセスして、家計簿データをいくつか登録します。
http://127.0.0.1:8000/kakeibo/kakeibo_list/にアクセスして以下のような家計簿アプリ画面が表示されればOKです。
以上でローカル環境でDjangoアプリ作成が完了です。
Azure に PostgreSQL データベースを作成
現状はすべてローカル環境でDjangoアプリが動いていますが、Djangoアプリはローカル、データベースだけAzure上のPostgresSQLを使う構成に変更してみます。
まずはAzure上にPostgreSQLデータベースを作成します。
※Azureのアカウント準備などの説明は割愛します。
Azure CLI のインストール
まずは、ローカルのWindows10からAzureに対してコマンド発行できるようにするためAzure CLIをインストールします。
リンク先から「MSIインストーラのダウンロード」ボタンを押してazure-cli-2.x.xx.msiをダウンロードしたらインストーラをダブルクリックでインストールします。
インストールが終わったら、最新バージョンの Windows 用 Azure CLI をインストールするため、以下のコマンドを実行管理者として PowerShell を開始し、次のコマンドを実行します。
Invoke-WebRequest -Uri https://aka.ms/installazurecliwindows -OutFile .\AzureCLI.msi; Start-Process msiexec.exe -Wait -ArgumentList '/I AzureCLI.msi /quiet'
実行が終わるとPowershellの画面が自動的に終了するので、再度Powershellの画面を起動します。
azureにサインインする
つづいて、Azure CLIを使ってazureにサインインします。
サインインするには「az login」コマンドを実行します。
すると、以下のようなAzureの認証画面がでるのでユーザを選択して認証します。
認証が完了すると以下のような画面が表示されます。
認証が完了すると、Powershell画面には認証されたAzureのサブスクリプション情報が表示されます。
以上で、Azureへのログオンが完了です。
リソースグループの作成
まずは、azure上にリソースグループを作成します。
今回は、以下のコマンドで「DjangoAppResourceGroup1」という名前のリソース グループを "西日本" の場所(リージョン)に作成します。
az group create --name DjangoAppResourceGroup1 --location "Japan West"
リソースグループの作成が完了すると以下のような情報が表示されます。
{ "id": "/subscriptions/**********-aef155eeb305/resourceGroups/DjangpAppResourceGroup1", "location": "japanwest", "managedBy": null, "name": "DjangpAppResourceGroup1", "properties": { "provisioningState": "Succeeded" }, "tags": null, "type": "Microsoft.Resources/resourceGroups" }
ちなみに、作成したリソースグループはAzure portal上のリソースグループアイコンをクリックすると確認できます。
Azure Database for PostgreSQL サーバーの作成
続いて、az postgres server createコマンドでPostgresSQLサーバを作成します。
az postgres server create --resource-group DjangoAppResourceGroup1 --name postgres-db --location "Japan West" --admin-user manager --admin-password Djangoapp#1234 --sku-name B_Gen5_1
オプションの意味は以下の通りです。
- --resource-group:割り当てるリソースグループ名
- --name:作成するデータベースサービスの名前
- --location:サービスを作成するロケーション
- --admin-user:データベース管理ユーザ名
- --admin-password:データベース管理ユーザのパスワード
- --sku-name:SKU の名前で作成する環境のスペックを指定します。
B_Gen5_1="Basic、Gen 5、および 1 個の仮想コア" にマップするという意味。
各skuの価格はこちらを参照。
データベースの作成完了後、azure portalでDjangoAppResourceGroup1リソースを確認すると、以下のようにDjangoPostgresSQLのサービス「postgres-db」が作成されているのが確認できます。
PostgreSQL サーバー向けのファイアウォール規則を作成
Azure リソースからデータベースにアクセスできるようにファイアウォールの設定を追加します。
ファイアウォールの設定はaz postgres server firewall-rule createコマンドで行います。
ローカルPCのIPアドレスを確認したら、以下のコマンドでローカルPCからAzureに作成したPostgresSQLに接続できるようにします。
az postgres server firewall-rule create --resource-group DjangoAppResourceGroup1 --server-name postgres-db --start-ip-address=<IPアドレス> --end-ip-address=<IPアドレス> --name AllowLocalClient
追加したファイアウォール規則はazure portalの「ホーム→リソース グループ→DjangoAppResourceGroup1→postgres-db - Connection security」で確認できます(下図)。
psql: FATAL: no pg_hba.conf entry for host "<IPアドレス>", user "manager", database "postgres", SSL on
FATAL: SSL connection is required. Please specify SSL options and retry.
ローカルのDjangoアプリをAzureに作成したPostgresSQLデータベースに接続する
続いて、Azure上に作成したPostgreSQL サーバーにローカルのDjango Webアプリを接続します。
まずは、ローカル環境からazure CLIを使ってazure上のPostgresSQLに接続します。
psql -h postgres-db.postgres.database.azure.com -U manager@postgres-db postgres
「ユーザー manager@postgres-db のパスワード:」と表示されたら管理ユーザのパスワードを入力してデータベースに接続します。
psql: FATAL: no pg_hba.conf entry for host "153.163.33.128", user "manager", database "postgres", SSL on
FATAL: SSL connection is required. Please specify SSL options and retry.
ローカル Postgres サーバーで実施したのと同様に、Azure Postgres サーバー側でもデータベースの作成と権限設定を行います。
CREATE DATABASE kakeibodb; GRANT ALL PRIVILEGES ON DATABASE kakeibodb TO manager;
以上で、azure上にpostgresSQLサービスとデータベースの作成は完了です。
「\q」コマンドで終了しておきます。
続いて、ローカルに存在するDjangoアプリケーションをazureのデータベースに接続させるためにenv.ps1 の設定を以下の通り修正します。
$Env:DBHOST = "postgres-db.postgres.database.azure.com" $Env:DBUSER = "manager@postgres-db" $Env:DBNAME = "kakeibodb" $Env:DBPASS = "Djangoapp#1234"
Powershellコンソール上で「.\env.ps1」を実行して再度データベース接続に関する設定情報をロードします。
次に、以下のコマンドを実行してローカルからAzureのPostgresSQLデータベースに対してdjangoのマイグレーションを実行し、管理ユーザも作成しておきます。
python manage.py migrate python manage.py createsuperuser
管理者ユーザーが作成されたら、python manage.py runserverコマンドでDjango サーバーを実行します。
Azure側のデータベースにはデータが登録されていないため、http://localhost:8000/adminにアクセスして再度家計簿データをいくつか登録しておきます。
その後、http://127.0.0.1:8000/kakeibo/kakeibo_list/にアクセスして家計簿データ一覧画面が表示されるのを確認しておきます。
以上で、「djangoはローカルPC,データベースはAzure」という構成のWEBアプリの完成です。
Deploy to Azure (Azure へのデプロイ)
最後に、ローカルにあるDjangoプロジェクトをAzureにデプロイして完全にAzure上で稼働するDjangoアプリケーションを構築します。
具体的には、ローカルにあるDjangoアプリケーションを Azure App Service にデプロイします。
settings.pyの設定変更
Django では運用環境での静的ファイルの使用はサポートされないため、これを手動で有効にする必要があります。
そのため、settings.pyのMIDDLEWAREにエントリー「'whitenoise.middleware.WhiteNoiseMiddleware',」を追加します。
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'whitenoise.middleware.WhiteNoiseMiddleware', #add 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
続いて、ALLOWED_HOSTSの設定を以下のように変更します。
ALLOWED_HOSTS = [os.environ['WEBSITE_SITE_NAME'] + '.azurewebsites.net', '127.0.0.1'] if 'WEBSITE_SITE_NAME' in os.environ else []
次に、settings.py の末尾に次の行を追加します。
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' #add STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') #add
続いて、kakeibo_app\tutorialフォルダ直下で以下のコマンドを実行して必要なモジュールだけコミットします。
git init git add ./kakeibo git add ./manage.py git add ./requirements.txt git add ./tutorial git add ./env.ps1 git commit -am "configure for App Service"
この場所にrequirements.txtがないと、後程実行するgit pushでrequrements.txtが見つからず、自動でpip installしてくれません。
(myenv) PS C:\Users\sinfo\Desktop\Azure\django\kakeibo_app> git commit -am "configure for App Service" [master 980bcb3] configure for App Service 14 files changed, 9 insertions(+), 4 deletions(-) rewrite tutorial/tutorial/__pycache__/settings.cpython-36.pyc (71%)
デプロイ ユーザーを構成する
続いて、azureにデプロイするためのユーザを作成します。
デプロイ ユーザーを構成するには、Azure Cloud Shell で az webapp deployment user set コマンドを使います。
az webapp deployment user set --user-name <username> --password <password>
作成が完了すると以下のようなメッセージが表示されます。
App Service planの作成
az appservice plan create コマンドを使用して、リソース グループに App Service プランを作成します。
次の例では、DjangoAppResourceGroup1リソースグループ内にBasic 価格レベル (--sku B1) の myAppServicePlan という名前の App Service プランを Linux コンテナー (--is-linux) に作成します。
az appservice plan create --name myAppServicePlan --resource-group DjangoAppResourceGroup1 --sku B1 --is-linux
作成が完了すると、DjangoAppResourceGroup1内にmyAppServicePlan という名前の App Service プランが作成されます。
※以下の通りazure Portalで確認できます。
Web アプリを作成する
次に、先ほど作成したmyAppServicePlanに「kakeibo-app」というWEBアプリを作成します。
WEBアプリの作成はaz webapp create コマンドを使います。
az --% webapp create --resource-group DjangoAppResourceGroup1 --plan myAppServicePlan --name kakeibo-app --runtime "PYTHON|3.7" --deployment-local-git
作成が完了すると、Git デプロイ可能な空の新しい Web アプリが作成されます。
azure portal上にもDjangoAppResourceGroup1内にkakeibo-appというApp Serviceが追加されます。
また、作成が完了すると「deploymentLocalGitUrl」の値が表示されるので控えておきます。
環境変数を構成
先ほど作成したkakeibo-app(App Service)とデータベース(postgres-db)を関連付けるために以下のコマンドを実行します。
az webapp config appsettings set --name kakeibo-app --resource-group DjangoAppResourceGroup1 --settings DBHOST="postgres-db.postgres.database.azure.com" DBUSER="manager@postgres-db" DBPASS="db管理ユーザのパスワード" DBNAME="kakeibodb"
コマンドが正常終了すると以下のようなメッセージが表示されます。
Git から Azure へのプッシュ
まずは、以下のコマンドを実行してローカル Git リポジトリに Azure リモートを追加します。
git remote add azure deploymentLocalGitUrl
deploymentLocalGitUrlには先ほど控えておいたURL「https://xxxx@kakeibo-app.scm.azurewebsites.net/kakeibo-app.git」を設定します。
次に以下のコマンドで Azure リモートにローカルのdjangoリポジトリをプッシュします。
git push azure master
コマンドを実行するとデプロイユーザの認証画面が表示されるのでパスワードを入力してOKをおすとローカルのdjangoリポジトリがAzure側にgit pushされます。
ここでは、azure側にソースファイルコピー、antenvという仮想環境の生成、requirements.txtを元にpip installなどの処理が自動で実行されていきます。
pushが完了したら、djangoアプリのadminサイトにアクセスできることを確認しましょう。
今回のケースではhttp://kakeibo-app.azurewebsites.net/adminです。
※アプリケーションのURLはazure portalのアプリケーションのURLでも確認できます。
ここで以下のようなエラーが表示された場合は、表示されているhostのIPアドレスをファイアウォールの規則設定で実施したのと同じ手順で許可してあげます。
FATAL: no pg_hba.conf entry for host "104.215.xx.xxx", user "manager", database "postgres-db", SSL on
FATAL: SSL connection is required. Please specify SSL options and retry.
さらにhttps://kakeibo-app.azurewebsites.net/kakeibo/kakeibo_listにアクセスして、以下の通り家計簿アプリ画面が表示されることを確認します。
以上で、Azure上でPostgresSQLとDjangoアプリケーションが稼働している状態が出来上がります。
補足
環境構築に失敗したりやり直したい場合は、以下のコマンドでリソースグループ毎削除すれば最初からやり直せます。
az group delete --name DjangoAppResourceGroup1
以上、「djangoアプリ(database)を Azure App Serviceに構築する方法」でした。