小規模ながらDjangoアプリケーションをAzureにデプロイする機会がありましたので、備忘録も兼ねて勘所をまとめました。
本記事では次のAzureサンプルDjangoアプリケーションを、Github Actionsを用いてAzure App Serviceにデプロイします。
- リポジトリのフォーク
- Azure App Service Webアプリの作成
- デプロイセンターを使用してワークフローを自動で作成する
- デプロイされたアプリケーションの確認
- 設定されたGithub Actionsの確認
- post-buildスクリプトの追加
- gunicornの実行設定
- まとめ
リポジトリのフォーク
リポジトリをフォークします。
Azure App Service Webアプリの作成
今回はDockerコンテナではなく、Pythonコードによるデプロイの例を示します。
公開:コードを選択し、適切なランタイムスタック(Pythonバージョン)を選択します。
デプロイ/ネットワーク/監視の設定はデフォルトのままとします。
デプロイセンターを使用してワークフローを自動で作成する
作成したリソース内のデプロイセンターから、コードソースとして「継続的デプロイ(CI/CD)Github」を選択します。
リポジトリをフォークしたGithubアカウントを選択し、リポジトリとブランチを選択します。Organizationのリポジトリの場合は、適切な組織を選択します。
「保存」を押下すると、Github Actionsの設定が自動的に始まり、さらにActionsが実行されてアプリケーションがデプロイされます。
デプロイされたアプリケーションの確認
「Hello Azure - Python Quickstart」がデプロイされました。
設定されたGithub Actionsの確認
さて、それでは自動的に作成されたGithub Actionsを確認してみましょう。「.github/workflows/{ブランチ名}_{Azureリソース名}.yml」が追加されているはずです。
# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy
# More GitHub Actions for Azure: https://github.com/Azure/actions
# More info on Python, GitHub Actions, and Azure App Service: https://aka.ms/python-webapps-actions
name: Build and deploy Python app to Azure Web App - yowatanabe-django-sample
on:
push:
branches:
- main
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python version
uses: actions/setup-python@v1
with:
python-version: '3.9'
- name: Create and start virtual environment
run: |
python -m venv venv
source venv/bin/activate
- name: Install dependencies
run: pip install -r requirements.txt
# Optional: Add step to run tests here (PyTest, Django test suites, etc.)
- name: Upload artifact for deployment jobs
uses: actions/upload-artifact@v2
with:
name: python-app
path: |
.
!venv/
deploy:
runs-on: ubuntu-latest
needs: build
environment:
name: 'Production'
url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}
steps:
- name: Download artifact from build job
uses: actions/download-artifact@v2
with:
name: python-app
path: .
- name: 'Deploy to Azure Web App'
uses: azure/webapps-deploy@v2
id: deploy-to-webapp
with:
app-name: '****-django-sample'
slot-name: 'Production'
publish-profile: ${{ secrets.AZUREAPPSERVICE_PUBLISHPROFILE_*********************** }}
yamlファイルの中はBuildジョブとDeployジョブに分かれています。yaml中にもコメントがある通り、Buildジョブの中で自動テストの実行などを追記することができます。
また、Deployジョブでは発行プロファイルをリポジトリに設定されたSecretsから読みだしています。今回のように自動でワークフローを作成しなくても、手動やコマンドラインでAzureから発行プロファイルを入手し、ワークフローに組み込むこともできます。
post-buildスクリプトの追加
さて、Azureにコードをデプロイした後、データベースのmigrateなどを行いたいことがあります。そのような場合には次の方法でコマンドを実行します。
まず、「msdocs-python-django-webapp-quickstart/script.sh」をmainに追加します。
#!/bin/sh
python manage.py migrate
コマンドの実行設定は、構成タブから新しいアプリケーション設定を追加することによって行います。
先ほど追加した「script.sh」が実行されるよう「POST_BUILD_COMMAND」を設定します。
これで次回のデプロイ時から、デプロイ後にscript.shが実行され、djangoのmigrateが行われます。
gunicornの実行設定
今回のようにAzure AppsにDjangoをデプロイされた場合、デフォルトでgunicornがWSGIサーバーとして使用されます。
そのgunicornの起動オプションを細かく指定したい場合は以下のように構成->全般設定->スタートアップコマンドに設定します。
タイムアウト値、ワーカーの数や種類、ログファイルの指定などを行っています。
gunicorn --bind=0.0.0.0 --timeout 600 --workers=3 quickstartproject.wsgi -k sync --access-logfile '-' --error-logfile '-'
まとめ
Github Actionsを用いて、Github上のDjangoプロジェクトをAzureにデプロイする方法を紹介しました。
実際のプロジェクトでは、さらにRDBのデプロイや、テストの実行などのステップも必要になるはずです。
今後の投稿でそのあたりもご紹介できればと思います。