内容
今回は,Azure環境にFastAPIをデプロイするまでの過程で面倒だった仕様がそこそこあったのでメモとして書きました.
ただし,CI/CDは解説していません.
組む場合は,GithubのActionsにAzure container registoryにImageをpushするworkflowを定義しましょう!
(追記:書いても良かったのですが,この時代変化が早くて,自動生成が設定できるようになってました.Azure container registoryにImageをプッシュした後のタイミングで,App ServiceのデプロイセンターからGithubActionsに切り替え,Azure container registoryにリンクさせると完了になります!)
目次
- 注意事項
- 環境説明
- Azureの環境セットアップ
(Azure DB for PosgreSQL, Azure Container Registory, Azure App Service) - 追加で
注意事項
今回の記事の対象となる方は,FastAPIをdockerfileやdockercompose.ymlを用いてローカル環境を構築出来る方になります.
軽くは説明を入れますが,ご了承下さい.
環境説明
- api鯖:FastAPI
- db: PostgreSQL
- dbメンテ:Adminer
FROM python:3.10.6
RUN mkdir -p /api
EXPOSE 80 80
COPY . /api
WORKDIR /api
RUN apt update
RUN apt install -y libpq-dev build-essential
RUN pip install pipenv
RUN pipenv install
version: '3'
services:
db:
container_name: api-db
image: postgres:14
volumes:
- dbdata:/var/lib/postgresql/data/
env_file:
- .env
ports:
- "5432:5432"
api:
container_name: api
build: .
env_file:
- .env
command: pipenv run uvicorn main:app --port 80 --host 0.0.0.0
volumes:
- .:/api
ports:
- '80:80'
tty: true
depends_on:
- db
adminer:
container_name: adminer
hostname: adminer
image: adminer:4.7.5
restart: always
ports:
- "8080:8080"
depends_on:
- db
volumes:
dbdata: null
.env.example
POSTGRES_USER={ユーザー名}@{DBリソース名}
POSTGRES_PASSWORD={パスワード}
POSTGRES_HOST={リソースのURL}
POSTGRES_DB={DBの名前(初期はからなので作る必要がある)}
Azure環境のセットアップ
Azure DB for PosgreSQLの作成
まずはじめに,ResourceGroupeを建てて,その中にAzure DB for PosgreSQLを建てます.
Adminのユーザー名や,Passwordはよしなに決めてください.
https://azure.microsoft.com/ja-jp/products/postgresql
↓ 書き換えてください.
.env
POSTGRES_USER={ユーザー名}@{DBリソース名}
POSTGRES_PASSWORD={パスワード}
POSTGRES_HOST={リソースのURL}
POSTGRES_DB={DBの名前(初期はからなので作る必要がある)}
次に,そのDBリソースの画面に行き「接続のセキュリティ」から下のように「Azureサービスへのアクセスを許可」します.
これは,後々ローカル環境で先に試せるようになるので,一旦許可しています.
開発が終了したら閉じましょう.
そしたら,psqlでCREATE DATABASEしにいきます.
↓の記事マンマなので説明を端折ると,次の順でやればうまくいきます.
https://learn.microsoft.com/en-us/azure/postgresql/single-server/quickstart-create-server-database-portal#connect-to-the-server-with-psql
- Azure CLI 起動(作ってない場合は作成)
- ターミナルでコマンドを実行(上から順に)
psql --host=mydemoserver.postgres.database.azure.com --port=5432 --username=myadmin@mydemoserver --dbname=postgres
CREATE DATABASE test;
\c test
\q(出来たので終了)
DBリソースの設定は完了です.
Azure Container Registoryの作成
上で作った同じリソースグループに作ります.
次に,書いてあるコマンドを実行していきます.
自分の場合,image名が「mysuperimage」だったと仮定して進めます.
※WSL2を使用の方はたまに↓で解決可能なバグが出るので,もし詰まったらどうぞ(僕は出てきました)
https://qiita.com/iwaiktos/items/33ab69a42c3a1cc35dfb
docker login リソースURL
docker tag mysuperimage:latest myresoucename.azurecr.io/mysuperimage:latest
docker push myresoucename.azurecr.io/mysuperimage:latest
これで,Azure container registoryの設定も完了です.
Azure App Serviceの作成
上で作った同じリソースグループに作ります.
さっきのDocker tagコマンドで僕と同じように打った人は,latestが選択できると思います.
あ,あと起動コマンドも後々悪さするので共有しておきます.(後で説明します)
pipenv run uvicorn main:app --port 80 --host 0.0.0.0
作成!!!
そしたら,デプロイセンターから色々設定を追加でいじれたり,ログが見れたりします!
んで,問題ない人はデプロイされたURLから,/docs でSwaggerが見れてるはずです!(FastAPI最高!!!)
見れない人,エラーが出てる人は,さっきのデプロイセンターからログのタブを開いて見に行きましょう!!
設定 の隣に居ます.
追加で
そして,さっきの起動コマンドを指定した件ですが,AppServiceの鬼分かりにくい部分に対処するためです.
端的に言います.
「Azure App ServiceはデフォルトでPort:80しかリッスンしません」
なので,デプロイするたびに内部でport:80にpingを飛ばしてデプロイ出来たかを確認してくれるのですが,このポートが間違っていると,一生うまく行きません.
あ,なのでDockerfileやDockercompose.ymlもそのように設定しておくべきです.
あと,.envが正しいかどうかは,adminer使うと判別できるのでよかったらどうぞ.
また,デフォルトの設定なのでApp Serviceの中でAzure CLIを開いてコマンドを使って設定すると変更できます.
↓参考記事です.
https://learn.microsoft.com/ja-jp/azure/app-service/configure-custom-container?tabs=debian&pivots=container-linux#configure-port-number
追加がすぎるんですが,実際にやって,公式が公開しているようにダメだったんですけど,リッスンするportは変更できても,1つのContainerで1のportしか見れません.(当たり前ですけど.)
以上でオワリです!!
よかったらイイね等お願いします🙇
(ps.メモのつもりが丁寧になってしまった.)