概要
FastAPIのコンテナイメージをAppRunnerにデプロイしてみたのだが、案外簡単だったので振り返りがてら記事を書いてみます!
個人
実行環境
docker --version
> Docker version 24.0.5,
poetry --version
> Poetry (version 1.5.1)
aws --version
> aws-cli/2.13.5 Python/3.11.4 Darwin/22.1.0 source/arm64 prompt/off
FastAPIコンテナイメージの作成
ライブラリのインストール
poetry init
poetry add fastapi uvicorn
pyproject.tomlとpoetry.lockが生成されます
pyproject.toml
[tool.poetry]
name = "fastapi-apprunner"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]
readme = "README.md"
packages = []
[tool.poetry.dependencies]
python = "^3.11"
fastapi = "^0.101.0"
uvicorn = "^0.23.2"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
動作ファイルの作成
app/main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_main():
return {"msg": "Hello World"}
Dockerfileの作成
# AppRunnerが対応しているPlatformを明示的に指定する
FROM --platform=linux/x86_64 python:3.11
WORKDIR /app
COPY pyproject.toml poetry.lock main.py /app/
# 必要なシステムパッケージをインストール
RUN apt-get update && apt-get install -y curl \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# Poetryをダウンロードしてインストール
RUN curl -sSL https://install.python-poetry.org | python -
# Pathを通す
ENV PATH /root/.local/bin:$PATH
# 仮想環境をたてない
RUN poetry config virtualenvs.create false
## アプリケーションの依存関係をインストール
RUN poetry install
EXPOSE 8080
CMD ["uvicorn", "main:app", "--reload", "--host", "0.0.0.0", "--port", "8080"]
動作確認
docker build -t fastapi-apprunner .
docker run -d --name fastapi-apprunner -p 8080:8080 fastapi-apprunner
※ M1 Macを使用していると警告が出る。こちらは指定したplatformが異なるため出ている。
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
疎通確認
curl localhost:8080
> {"msg":"Hello World"}
ECRにpush
リポジトリを作成
ECRにpush
プッシュコマンドの表示に記載されているコマンド通りにCLI上でコマンドを実行
AppRunnerへデプロイ
コンテナイメージのURIに先ほど作成したECRに登録されているイメージを指定する
あとはデフォルトのままで作成とデプロイボタンをポチッと押すと...
数分後にデプロイが無事完了します!
払い出されたデフォルトドメインにアクセスすると、サンプルコードで定義したリクエスト結果が返ってきます!
かなり簡単にコンテナイメージがデプロイできてしまってびっくり!
皆さんもAppRunnerをぜひ使ってみてください!