Open1

FastAPI + Docker + EC2

us-east-7us-east-7

機能

  • 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
      
  • ログイン後初回のみ
    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 
    
  • コンテナ実行
    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