🍄

Azureにコンテナで作ったWebアプリを公開する

2022/04/15に公開
2

はじめに

Azureで比較的モダンなアーキテクチャでWebアプリを公開します。

下記のマインドで書きます。

  • Azureは世の中の情報が少なすぎるので、少しでも情報を残したい。
  • VMを立ち上げて自力でサーバー構築とか今どきのクラウドでやることではないので、モダンな方法でアプリを構築したい。
    • しかし、Azureでサーバレスはあり得ないレベルで難易度が高いので死ねる。
    • なので、間を取って(?)コンテナで開発する。

シリーズもの第1回になる予定です。

この記事でやること

コンテナで作ったWebアプリをAzureで公開します。

最終的に目指すもの

下記の思想で設計しています。

  • それなりの柔軟性を持たせつつ、それなりのセキュリティは確保したいが、その為に糞みたいに高いリソース(例えば最低月10万円のAzure Firewall等)は使いたくない。
  • といってもAzureなのでそれなりの金額になります。課金しないと、それなりの柔軟性もそれなりのセキュリティも確保できないです。Azureなので。
    • 安くWebアプリを構築したい時はAWS Amplify等の他サービスを使おう(本末転倒)

本シリーズのほか記事へのリンク

  1. Azureにコンテナーで作ったWebアプリを公開する ← いまココ
  2. Azure WebAppsの手前にApplication Gatewayを設置する
  3. Azure WebAppsとAzure SQL Databaseをセキュアに接続する
  4. Azure WebAppsにAzure Storageをセキュアにマウントする
  5. (番外編)Django + SQLServer(Azure SQL Database) + SQLAlchemyで、Webアプリを構築

コンテナのデプロイ先にAzure WebAppsを選択している理由

Azureで使えるContainerのサービスは複数あるので迷う方も多いかと思います。
Azure公式ドキュメントにContainerサービスをまとめたページがあるのでこちらをご参照ください。
https://azure.microsoft.com/ja-jp/product-categories/containers/
今回はWebアプリになりますのでWebApps(Web App for Containers)を使うのが無難です。

不採用にしたサービスに対する、個人的なコメントは下記です。

  • AKS : K8sやりたいならありだが、単純にwebアプリ作るだけだと学習コスト的にツライ
  • Red Hat OpenShift : OpenShiftやりたいならありだが、単純にwebアプリ作るだけだと学習コスト的にツライ
  • Container Apps : 現時点(2022/04)でプレビューなので本格的に使うにはまだ早い
  • Functions : イベントドリブンならありだが、Webアプリには向かない
  • Container Instances : 使いにくいのでお勧めしない
  • Service Fabric : 知らない

実際に構築する

コンテナで作ったアプリを用意する

用意しました!!
https://github.com/k-ibaraki/sample-django-azure-webapps

  • 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ファイルに書いてます。
startup.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上に用意します。

価格

https://azure.microsoft.com/ja-jp/pricing/details/container-registry/
とりあえず、日額20円の一番安いプランを使います。
月額600円!!

リソースを作る

Azureのコンソールから画面に従って、リソースを作ります。

設定

Container Registryの管理ユーザーを有効化します。これをしないとデプロイ時のログインで困ります。

(2022/04/16 追記)
deploy時にdocker loginではなく、az acr loginを使うと管理ユーザーなしにできるようです。
詳細はほりひろさんがコメントに書いてくれているので、そちらをご参照ください。

Github Actionsで、Github→Container Registryのデプロイを自動化する

デプロイなんで人がやることじゃないので自動化します。

Github Actions用のyamlを書く

書きました。
https://github.com/k-ibaraki/sample-django-azure-webapps/blob/main/.github/workflows/pushContainer.yml
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の価格ページ見てました。そりゃ値段違うよ。。。
(ほりひろさん、指摘ありがとうございます。)
https://azure.microsoft.com/ja-jp/pricing/details/app-service/linux/

リソースを作る

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 ログで、ログ記憶をファイル システムに変更してください。
これをしておかないとログが出力されません。デフォルトオンにして欲しい。

環境変数

アプリに環境変数の設定が必要な場合は、構成->アプリケーション設定で環境変数を設定してください。

補足

上の方に貼ったアプリをとりあえず動かしたい時は、このあたりの環境変数を設定してください。
https://github.com/k-ibaraki/sample-django-azure-webapps/blob/main/.env.sqlite.sample

  • 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円/月

次の記事

https://zenn.dev/ibaraki/articles/f1d971cd0c7d35

NCDCエンジニアブログ

Discussion

ほりひろほりひろ

価格について。
今回の構成は Linux コンテナーを使用していると思うので、記載いただいた通り、約 1600 円/月で正しいと思います。
https://azure.microsoft.com/ja-jp/pricing/details/app-service/linux/

こちらでタブの切り替えができます。


あと、GitHub Actions で azure/loginaz acr login を使うと、OIDC が使えるので、ACR の管理ユーザーを有効にする必要はなくなります。
ご参考に。

https://uncaughtexception.hatenablog.com/entry/2022/03/22/122911

いばらきいばらき

情報ありがとうございます。

ご指摘ありがとうございます。Windowsの方を見ていたみたいですね。
恥ずかしい。。。

デプロイ時にazコマンド使うのは考えてなかったです。なるほどです。
勉強になります。