7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AzureAppServiceでFastAPIを動かそう!

Last updated at Posted at 2023-03-17

内容

今回は,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サービスへのアクセスを許可」します.
image.png

これは,後々ローカル環境で先に試せるようになるので,一旦許可しています.
開発が終了したら閉じましょう.

そしたら,psqlでCREATE DATABASEしにいきます.
↓の記事マンマなので説明を端折ると,次の順でやればうまくいきます.
https://learn.microsoft.com/en-us/azure/postgresql/single-server/quickstart-create-server-database-portal#connect-to-the-server-with-psql

  1. Azure CLI 起動(作ってない場合は作成)
  2. ターミナルでコマンドを実行(上から順に)
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.png

次に,書いてあるコマンドを実行していきます.
自分の場合,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

完了したら,左の「レポジトリ」から確認できます.
image.png

これで,Azure container registoryの設定も完了です.

Azure App Serviceの作成

上で作った同じリソースグループに作ります.

こんな感じでDockerを選択します.
image.png

次へ!
image.png

これを選択!
image.png

ここはよしなにやってください!
image.png

さっきのDocker tagコマンドで僕と同じように打った人は,latestが選択できると思います.
あ,あと起動コマンドも後々悪さするので共有しておきます.(後で説明します)

pipenv run uvicorn main:app --port 80 --host 0.0.0.0

ネットワークの設定はこう.
image.png

作成!!!

そしたら,デプロイセンターから色々設定を追加でいじれたり,ログが見れたりします!

image.png

んで,問題ない人はデプロイされたURLから,/docs でSwaggerが見れてるはずです!(FastAPI最高!!!)
見れない人,エラーが出てる人は,さっきのデプロイセンターからログのタブを開いて見に行きましょう!!
設定 の隣に居ます.
image.png

追加で

そして,さっきの起動コマンドを指定した件ですが,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.メモのつもりが丁寧になってしまった.)

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?