Azureにコンテナで作ったWebアプリを公開する
はじめに
Azureで比較的モダンなアーキテクチャでWebアプリを公開します。
下記のマインドで書きます。
- Azureは世の中の情報が少なすぎるので、少しでも情報を残したい。
- VMを立ち上げて自力でサーバー構築とか今どきのクラウドでやることではないので、モダンな方法でアプリを構築したい。
- しかし、Azureでサーバレスはあり得ないレベルで難易度が高いので死ねる。
- なので、間を取って(?)コンテナで開発する。
シリーズもの第1回になる予定です。
この記事でやること
コンテナで作ったWebアプリをAzureで公開します。
最終的に目指すもの
下記の思想で設計しています。
- それなりの柔軟性を持たせつつ、それなりのセキュリティは確保したいが、その為に糞みたいに高いリソース(例えば最低月10万円のAzure Firewall等)は使いたくない。
- といってもAzureなのでそれなりの金額になります。課金しないと、それなりの柔軟性もそれなりのセキュリティも確保できないです。Azureなので。
- 安くWebアプリを構築したい時はAWS Amplify等の他サービスを使おう(本末転倒)
本シリーズのほか記事へのリンク
- Azureにコンテナーで作ったWebアプリを公開する ← いまココ
- Azure WebAppsの手前にApplication Gatewayを設置する
- Azure WebAppsとAzure SQL Databaseをセキュアに接続する
- Azure WebAppsにAzure Storageをセキュアにマウントする
- (番外編)Django + SQLServer(Azure SQL Database) + SQLAlchemyで、Webアプリを構築
コンテナのデプロイ先にAzure WebAppsを選択している理由
Azureで使えるContainerのサービスは複数あるので迷う方も多いかと思います。
Azure公式ドキュメントにContainerサービスをまとめたページがあるのでこちらをご参照ください。
今回はWebアプリになりますのでWebApps(Web App for Containers)を使うのが無難です。
不採用にしたサービスに対する、個人的なコメントは下記です。
- AKS : K8sやりたいならありだが、単純にwebアプリ作るだけだと学習コスト的にツライ
- Red Hat OpenShift : OpenShiftやりたいならありだが、単純にwebアプリ作るだけだと学習コスト的にツライ
- Container Apps : 現時点(2022/04)でプレビューなので本格的に使うにはまだ早い
- Functions : イベントドリブンならありだが、Webアプリには向かない
- Container Instances : 使いにくいのでお勧めしない
- Service Fabric : 知らない
実際に構築する
コンテナで作ったアプリを用意する
用意しました!!
- djangoで書きました。本記事ではアプリ自体の中身には触れません。
- 別途書きます。
- コンテナ化するので
Dockerfile
をこんな感じで書いています。
FROM python:3.8-slim-buster
ENV PYTHONUNBUFFERED=1
EXPOSE 8000
WORKDIR /app
COPY . .
RUN pip install poetry
RUN poetry config virtualenvs.create false
RUN poetry update
RUN chmod 744 ./startup.sh
ENTRYPOINT ["./startup.sh"]
- 起動時のコマンドをDockerfile内に書くのが面倒なので、.shファイルに書いてます。
#!/bin/bash
#python manage.py runserver 0.0.0.0:8000
python manage.py migrate
gunicorn sampleProject.asgi:application -w 2 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
Azure Container Registryを作る
コンテナ化したアプリを用意したので、コンテナイメージを格納する場所をAzure上に用意します。
価格
月額600円!!
リソースを作る
Azureのコンソールから画面に従って、リソースを作ります。
設定
Container Registryの管理ユーザーを有効化します。これをしないとデプロイ時のログインで困ります。
(2022/04/16 追記)
deploy時にdocker login
ではなく、az acr login
を使うと管理ユーザーなしにできるようです。
詳細はほりひろさんがコメントに書いてくれているので、そちらをご参照ください。
Github Actionsで、Github→Container Registryのデプロイを自動化する
デプロイなんで人がやることじゃないので自動化します。
Github Actions用のyamlを書く
書きました。
Githubのシークレットに下記を設定すれば動きます。- REGISTRY_NAME
- REGISTRY_USERNAME
- REGISTRY_PASSWORD
ユーザー名とパスワードは、ContainerRegistryの管理ユーザーを有効化した時点でAzureのコンソールで確認できます。
Azure Container RegistryにContainer ImageがPushされていることを確認
正常に動作していれば、Container Registryのリポジトリにイメージが追加されるはずです。
Azure App Service Planを作る
作りたいのはWeb Apps(Webアプリ)なのですが、Web Appsを動かす土台としてApp Service Planが必要になります。ですのでApp Service Planを作ります。
この構造、Azureに慣れないと非常に分かりにくいです。改善してほしい。
価格
https://azure.microsoft.com/ja-jp/pricing/details/app-service/windows/#pricing
最終的にはPremium(P1V2)が必要になりますが、今回はBasic(B1)にします。高いので。
なお上記のページだとBasicプランが月額約8000円と読めますが、
B1であれば月額約1600円で作れます。
意味不明です。Azureどうなってるの?
(2022/04/16 修正)
すいません。windowsの価格ページ見てました。そりゃ値段違うよ。。。
(ほりひろさん、指摘ありがとうございます。)
リソースを作る
Azureのコンソールから画面に従って、リソースを作ります。
Azure Web Appsを作る
Web Apps(Webアプリ)をつくります。
価格
先程作ったApp Service Planの中にWeb Appsを作ることになりますので、Web Appsとしての費用は発生しません。
リソースを作る
-
Azureのコンソールから画面に従って、リソースを作ります。
-
先程作ったApp Service Planを選択します。
-
先程作ったContainer Registry&イメージを指定します
設定
継続的デプロイ
Azureのコンソールから、作成されたAzure Web Appsに行き、デプロイセンター
で継続的デプロイ
をオン
にしてください。
これをしておかないと、Container Imageが更新されても自動で反映してくれません。
デフォルトがオンにして欲しいのですが、継続的デプロイに必要なウェブフックが課金アイテムなのでデフォルトがオフなのだと思います。
(安いプランだと2個しかついてきませんが、今回は1個しか使わないので気にせず使います。)
ログ
App Servic ログ
で、ログ記憶をファイル システム
に変更してください。
これをしておかないとログが出力されません。デフォルトオンにして欲しい。
環境変数
アプリに環境変数の設定が必要な場合は、構成
->アプリケーション設定
で環境変数を設定してください。
補足
上の方に貼ったアプリをとりあえず動かしたい時は、このあたりの環境変数を設定してください。
-
SECRET_KEY
: Djangoのシークレットキー。本来は非公開にするべきですが、サンプルなのでgitに上げちゃいました。そのまま入れれば動きます。 -
ALLOWED_HOSTS
: Djangoアプリが許可されるHOST名。(アプリ名).azurewebsites.net
に変更して設定してください。 -
DEBUG
:True
にするとDjangoがデバッグモードになります。本番では設定しないこと推奨ですが、とりあえず設定しておくとエラー時にいろいろ表示されて分かりやすいです。 -
DB_ENGINE
: サンプルアプリでDBに繋ぐ設定まで作ってしまったのですが、この記事の時点だとDBが無いのでエラーになってしまいます。ごまかすためにsqlite
を指定したらローカルのsqliteで動くようにしました。- なおContainerなので、リブートするとデータが消えます。DB作るまでの間に合わせの対応です。
接続確認
作成されたAzure Web AppsのURLに接続すれば、アプリが動いているはずです。
以上で、Azureにコンテナで作ったWebアプリを公開できました。
Azure費用(月額)
約2200円/月
- Azure Container Registry : 約600円/月
- Azure App Service Plan : 約1600円/月
次の記事
NCDC株式会社( ncdc.co.jp/ )のエンジニアチームです。 募集中のエンジニアのポジションや、採用している技術スタックの紹介などはこちら( github.com/ncdcdev/recruitment )をご覧ください! ※エンジニア以外も記事を投稿することがあります
Discussion
価格について。
今回の構成は Linux コンテナーを使用していると思うので、記載いただいた通り、約 1600 円/月で正しいと思います。
こちらでタブの切り替えができます。
あと、GitHub Actions で
azure/login
とaz acr login
を使うと、OIDC が使えるので、ACR の管理ユーザーを有効にする必要はなくなります。ご参考に。
情報ありがとうございます。
ご指摘ありがとうございます。Windowsの方を見ていたみたいですね。
恥ずかしい。。。
デプロイ時に
az
コマンド使うのは考えてなかったです。なるほどです。勉強になります。