djangoアプリ(database)を Azure App Serviceに構築する方法

スポンサードリンク



こんにちは。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アカウントの情報はaz account listコマンドで確認できます。

リソースグループの作成

まずは、azure上にリソースグループを作成します。

 ※ここで作成したリソースグループに対して、データベースやDjangoアプリケーションを紐づけていきます。

今回は、以下のコマンドで「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

 

オプションの意味は以下の通りです。

az postgres server createオプション
  • --resource-group:割り当てるリソースグループ名
  • --name:作成するデータベースサービスの名前
  • --location:サービスを作成するロケーション
  • --admin-user:データベース管理ユーザ名
  • --admin-password:データベース管理ユーザのパスワード
  • --sku-nameSKU の名前で作成する環境のスペックを指定します。
     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」で確認できます(下図)。

 IPアドレスがよくわからない場合は、「psql -h postgres-db.postgres.database.azure.com -U manager@postgres-db postgres」コマンドでdbにアクセスした際に以下のようなエラーが表示されるので、表示されているIPアドレスを設定すればOKです。
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 のパスワード:」と表示されたら管理ユーザのパスワードを入力してデータベースに接続します。

 

 ファイアウォールの許可設定でクライアントIPアドレスの指定が謝っていると以下のエラーが表示されます。

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リポジトリフォルダ(.git)が存在するフォルダ直下に配置しておきましょう。(今回の場合はkakeibo_app\tutorial)
この場所に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>

作成が完了すると以下のようなメッセージが表示されます。

 ユーザー名は、Azure 内で一意である必要があり、パスワードは長さが 8 文字以上で、文字、数字、記号のうち 2 つを含む必要があります。

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アドレスをファイアウォールの規則設定で実施したのと同じ手順で許可してあげます。

 OperationalError at /admin/login/
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に構築する方法」でした。

 

おすすめの記事