FastAPIのコンテナイメージをAppRunnerにデプロイする

## 概要

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の作成

```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

### リポジトリを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330768/a92fe614-1072-2011-a3db-6d085e67f151.png)

### ECRにpush

プッシュコマンドの表示に記載されているコマンド通りにCLI上でコマンドを実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330768/f55c0d1c-6eb4-5efc-a12b-b31ee089bf80.png)


pushできるとdashboardにimageが表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330768/32c5209f-023e-6b04-934c-1bc9ee882565.png)


## AppRunnerへデプロイ


コンテナイメージのURIに先ほど作成したECRに登録されているイメージを指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330768/4f12d1ea-ed55-151a-38ca-e221c19fc1fb.png)




ポートは8080
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330768/82abe1e6-89d1-120c-89c5-f43438eae1c0.png)

あとはデフォルトのままで作成とデプロイボタンをポチッと押すと...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330768/a28e012d-dfc2-374c-0bf9-eb16d2faf128.png)


デプロイ中表示がされて...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330768/9acad7ba-25a6-8d71-1010-a02db325e581.png)

数分後にデプロイが無事完了します！

払い出されたデフォルトドメインにアクセスすると、サンプルコードで定義したリクエスト結果が返ってきます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330768/1b7ad7c3-5d8f-3dd5-2297-409ed09352c2.png)


かなり簡単にコンテナイメージがデプロイできてしまってびっくり！
皆さんもAppRunnerをぜひ使ってみてください！