Open1
FastAPI + Docker + EC2

機能
- SNSアカウントがある場合:各種SNSアカウントを利用してログインします
- SNSアカウントがない場合:emailアドレスでログインします
手順書
- セキュリティグループ
sg-xxxxxxxxxxxxxxx - FastAPI
のインバウンドルールとしてポート範囲8500を全てのIPアドレスに許可するAWS CLIコマンドaws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxxxxxxxxx - FastAPI --protocol tcp --port 8500 --cidr 0.0.0.0/0
- EC2インスタンスにログイン
cd ~/dev/fastapi/registlogin ssh -i "~/aws/fastapi.pem" ec2-user@ec2-111-11-1-111.compute-1.amazonaws.com
実行結果
A newer release of "Amazon Linux" is available. Version 2023.5.20240722: Version 2023.5.20240730: Version 2023.5.20240805: Version 2023.5.20240819: Version 2023.5.20240903: Run "/usr/bin/dnf check-release-update" for full release and version update info , #_ ~\_ ####_ Amazon Linux 2023 ~~ \_#####\ ~~ \###| ~~ \#/ ___ https://aws.amazon.com/linux/amazon-linux-2023 ~~ V~' '-> ~~~ / ~~._. _/ _/ _/ _/m/' Last login: Wed Jul 24 00:59:01 2024 from 58.70.100.115
- 実装
- Dockerfile
echo 'FROM python:3.12 WORKDIR /code COPY ./requirements.txt /code/requirements.txt RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt COPY ./app /code/app CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8500"]' > Dockerfile
- requirements.txt
echo 'fastapi pydantic uvicorn' > requirements.txt
- main.py
echo 'from typing import Union from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q}' > app/main.py
- Dockerfile
- ログイン後初回のみ
sudo usermod -aG docker $USER
- cicd.sh
docker stop $(docker ps -a -q --filter ancestor=registlogin --format="{{.ID}}") docker rm $(docker ps -a -q --filter ancestor=registlogin --format="{{.ID}}") docker rmi $(docker images registlogin --format "{{.ID}}") docker ps -a;docker images cd ~/dev/app/registlogin; docker build -t registlogin .;docker images;docker run -p 8500:8500 registlogin
chmod +x cicd.sh
- cicd.sh
- コンテナ実行
cd ~/dev/fastapi/registlogin/ && bash cicd.sh
- 実行結果確認
- AWS EC2コンソール以外の別のターミナルで実行
curl http://111.22.0.333:8500/items/777
実行結果
{"item_id":777,"q":null}
- WebブラウザのURLで実行結果を確認
http://111.22.0.333:8500/docs
- AWS EC2コンソール以外の別のターミナルで実行