スポンサードリンク



こんにちは。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を起動したら以下のコマンドでデータベースに接続します。

パスワードを聞かれるので、インストール時に設定したパスワードを入力しましょう。
DBに接続すると以下のように「postgres=#」と表示されます。

今回は家計簿アプリを作成するので、kakeibodbというデータベースを作ります。
ついでに管理ユーザと権限設定も行っておきます。

CREATE DATABASE <データベース名>;
CREATE USER <ユーザ名> WITH PASSWORD '<パスワード>';
GRANT ALL PRIVILEGES ON DATABASE <データベース名> TO <ユーザ名>;

\l」コマンドを実行するとデータベースの一覧が表示されるのでkakeibodbが作成されているのを確認します。

 

以上でデータベースの初期設定は完了です。

\q」コマンドを実行して終了しておきましょう。

ローカルでDjangoアプリを作成

続いて、ローカルのWindows10環境でDjangoアプリを作成します。

git clone

今回は、本ブログの管理人(siny)が下記のNoteで配信している家計簿アプリのdjangoリポジトリをcloneします。

以下のコマンドでcloneしましょう。

 

仮想環境を作成

続いて、pythonの仮想環境(myenv)を作成してアクティベートします。
アクティベート後kakeibo_appフォルダに移動しておきます。

 

Djangoアプリをローカルで実行

続いて、djangoアプリをローカルで実行します。

kakeibo_app\tutorialフォルダ直下にenv.ps1ファイルを作成して以下の設定(データベース接続に必要な情報)を記述します。

 

powershellの画面でkakeibo_appフォルダ上で以下のコマンドを実行してenv.ps1の設定をロードします。

 

また、settings.pyを開いてデータベースの設定でpostgresSQLを利用するように変更します。
※この設定により先ほど作成したenv.ps1の設定情報をロードするようになります。

※変更前

※変更後

 

ここまでできたら、kakiebo_app\tutorialフォルダ直下にて以下のコマンドを実行し必要なモジュールのインストールとマイグレーションを行います。

 

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 を開始し、次のコマンドを実行します。

実行が終わるとPowershellの画面が自動的に終了するので、再度Powershellの画面を起動します。

azureにサインインする

つづいて、Azure CLIを使ってazureにサインインします。
サインインするには「az login」コマンドを実行します。

すると、以下のようなAzureの認証画面がでるのでユーザを選択して認証します。

認証が完了すると以下のような画面が表示されます。

認証が完了すると、Powershell画面には認証されたAzureのサブスクリプション情報が表示されます。

以上で、Azureへのログオンが完了です。

 ちなみに現在ログオンしているazureアカウントの情報はaz account listコマンドで確認できます。

リソースグループの作成

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

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

今回は、以下のコマンドで「DjangoAppResourceGroup1」という名前のリソース グループを "西日本" の場所(リージョン)に作成します。

リソースグループの作成が完了すると以下のような情報が表示されます。

 

ちなみに、作成したリソースグループはAzure portal上のリソースグループアイコンをクリックすると確認できます。

Azure Database for PostgreSQL サーバーの作成

続いて、az postgres server createコマンドでPostgresSQLサーバを作成します。

 

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

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に接続できるようにします。

 

追加したファイアウォール規則は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に接続します。

「ユーザー 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 サーバー側でもデータベースの作成と権限設定を行います。

以上で、azure上にpostgresSQLサービスとデータベースの作成は完了です。
\q」コマンドで終了しておきます。

続いて、ローカルに存在するDjangoアプリケーションをazureのデータベースに接続させるためにenv.ps1 の設定を以下の通り修正します。

 

Powershellコンソール上で「.\env.ps1」を実行して再度データベース接続に関する設定情報をロードします。

次に、以下のコマンドを実行してローカルからAzureのPostgresSQLデータベースに対してdjangoのマイグレーションを実行し、管理ユーザも作成しておきます。

 

管理者ユーザーが作成されたら、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',」を追加します。

 

続いて、ALLOWED_HOSTSの設定を以下のように変更します。

 

次に、settings.py の末尾に次の行を追加します。

 

続いて、kakeibo_app\tutorialフォルダ直下で以下のコマンドを実行して必要なモジュールだけコミットします。

 

 requirements.txtはgitリポジトリフォルダ(.git)が存在するフォルダ直下に配置しておきましょう。(今回の場合はkakeibo_app\tutorial)
この場所にrequirements.txtがないと、後程実行するgit pushでrequrements.txtが見つからず、自動でpip installしてくれません。

 

デプロイ ユーザーを構成する

続いて、azureにデプロイするためのユーザを作成します。

デプロイ ユーザーを構成するには、Azure Cloud Shell で az webapp deployment user set コマンドを使います。

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

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

App Service planの作成

az appservice plan create コマンドを使用して、リソース グループに App Service プランを作成します。

次の例では、DjangoAppResourceGroup1リソースグループ内にBasic 価格レベル (--sku B1) の myAppServicePlan という名前の App Service プランを Linux コンテナー (--is-linux) に作成します。

作成が完了すると、DjangoAppResourceGroup1内にmyAppServicePlan という名前の App Service プランが作成されます。
※以下の通りazure Portalで確認できます。

Web アプリを作成する

次に、先ほど作成したmyAppServicePlanに「kakeibo-app」というWEBアプリを作成します。
WEBアプリの作成はaz webapp create コマンドを使います。

作成が完了すると、Git デプロイ可能な空の新しい Web アプリが作成されます。
azure portal上にもDjangoAppResourceGroup1内にkakeibo-appというApp Serviceが追加されます。
また、作成が完了すると「deploymentLocalGitUrl」の値が表示されるので控えておきます。

環境変数を構成

先ほど作成したkakeibo-app(App Service)とデータベース(postgres-db)を関連付けるために以下のコマンドを実行します。

コマンドが正常終了すると以下のようなメッセージが表示されます。

Git から Azure へのプッシュ

まずは、以下のコマンドを実行してローカル Git リポジトリに Azure リモートを追加します。

deploymentLocalGitUrlには先ほど控えておいたURL「https://xxxx@kakeibo-app.scm.azurewebsites.net/kakeibo-app.git」を設定します。

次に以下のコマンドで Azure リモートにローカルのdjangoリポジトリをプッシュします。

コマンドを実行するとデプロイユーザの認証画面が表示されるのでパスワードを入力して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アプリケーションが稼働している状態が出来上がります。

補足

環境構築に失敗したりやり直したい場合は、以下のコマンドでリソースグループ毎削除すれば最初からやり直せます。

 

以上、「djangoアプリ(database)を Azure App Serviceに構築する方法」でした。

 

おすすめの記事