استفاده از یک برنامه FastAPI در AWS EC2 با CI/CD با استفاده از اقدامات GitHub و NGINX

مقدمه
در این پست وبلاگ ، ما روند استقرار را طی خواهیم کرد فریپی برنامه در AWS EC2 نمونه با چیز کوچک به عنوان یک پروکسی معکوس ، در حالی که اعمال می شود اقدامات GitHub برای ادغام مداوم و استقرار مداوم (CI/CD). این اطمینان حاصل می کند که هر تغییری به سمت main
شعبه به طور خودکار به سرور مستقر می شود.
با پایان این آموزش ، شما یک برنامه کاملاً کاربردی و به طور مداوم مستقر در AWS در حال اجرا خواهید داشت.
بررسی اجمالی پروژه
ما با یک کار خواهیم کرد API کتاب Fastapi و به دنبال این مراحل کلیدی:
- مفقودین را پیاده سازی کنید
GET /api/v1/books/{book_id}
نقطه پایانی - برنامه را به صورت محلی آزمایش کنید.
- برنامه را dockerize کنید.
- آن را در نمونه AWS EC2 مستقر کنید.
- NGINX را به عنوان یک پروکسی معکوس تنظیم کنید.
- اقدامات GitHub را برای خودکار سازی استقرار پیکربندی کنید.
مرحله 1: نقطه پایانی گمشده را پیاده سازی کنید
برنامه در حال حاضر نقاط پایانی برای ایجاد ، به روزرسانی و حذف کتاب ها را فراهم می کند ، اما برای بازیابی یک کتاب توسط شناسه آن باید یک نقطه پایانی اضافه کنیم.
تغییر دادن api/routes/books.py
با افزودن نقطه پایانی گمشده:
from typing import OrderedDict
from typing import Dict
from fastapi import APIRouter, status, HTTPException
from fastapi.responses import JSONResponse
from api.db.schemas import Book, Genre, InMemoryDB
router = APIRouter()
db = InMemoryDB()
db.books = {
1: Book(
id=1,
title="The Hobbit",
author="J.R.R. Tolkien",
publication_year=1937,
genre=Genre.SCI_FI,
),
2: Book(
id=2,
title="The Lord of the Rings",
author="J.R.R. Tolkien",
publication_year=1954,
genre=Genre.FANTASY,
),
3: Book(
id=3,
title="The Return of the King",
author="J.R.R. Tolkien",
publication_year=1955,
genre=Genre.FANTASY,
),
}
@router.post("/", status_code=status.HTTP_201_CREATED)
async def create_book(book: Book):
db.add_book(book)
return JSONResponse(
status_code=status.HTTP_201_CREATED, content=book.model_dump()
)
@router.get("/", response_model=OrderedDict[int, Book], status_code=status.HTTP_200_OK)
async def get_books() -> OrderedDict[int, Book]:
return db.get_books()
@router.put("/{book_id}", response_model=Book, status_code=status.HTTP_200_OK)
async def update_book(book_id: int, book: Book) -> Book:
return JSONResponse(
status_code=status.HTTP_200_OK,
content=db.update_book(book_id, book).model_dump(),
)
@router.delete("/{book_id}", status_code=status.HTTP_204_NO_CONTENT)
async def delete_book(book_id: int) -> None:
db.delete_book(book_id)
return JSONResponse(status_code=status.HTTP_204_NO_CONTENT, content=None)
# Added the missing api endpoint
@router.get("/{book_id}", response_model=Book, status_code=status.HTTP_200_OK)
async def get_book(book_id: int):
book=db.books.get(book_id)
if not book:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Book not found")
return book
این تضمین می کند که یک کتاب توسط شناسه آن بازیابی شود یا برگردد 404 Not Found
اگر وجود نداشته باشد خطا.
مرحله 2: برنامه را به صورت محلی آزمایش کنید
قبل از استقرار ، API را به صورت محلی با استفاده از آن آزمایش کنید پیتست:
pytest
برای اجرای برنامه FastAPI به صورت محلی:
uvicorn api.main:app --host 0.0.0.0 --port 8084 --reload
نقطه پایانی جدید را با:
curl -X 'GET' 'http://127.0.0.1:8084/api/v1/books/1' -H 'accept: application/json'
مرحله 3: dockerizing برنامه
ایجاد a Dockerfile
در فهرست ریشه:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["uvicorn", "api.main:app", "--host", "0.0.0.0", "--port", "8084"]
ظرف Docker را بسازید و اجرا کنید:
docker build -t fastapi-app .
docker run -d -p 8084:8084 --name fastapi-container fastapi-app
مرحله 4: استقرار به AWS EC2
1. یک نمونه EC2 را راه اندازی کنید
- انتخاب کردن اوبونتو 22.04بشر
- گروه های امنیتی را پیکربندی کنید تا اجازه دهید SSH (22)با HTTP (80)وت TCP سفارشی (8084)بشر
2. ssh به عنوان مثال
ssh -i your-key.pem ubuntu@your-ec2-public-ip
3. Docker و Git را نصب کنید
sudo apt update && sudo apt install -y docker.io git
4. مخزن را کلون کرده و برنامه را اجرا کنید
git clone https://github.com/yourusername/fastapi-book-project.git
cd fastapi-book-project
docker build -t fastapi-app .
docker run -d -p 8084:8084 --name fastapi-container fastapi-app
برنامه را از مرورگر خود آزمایش کنید: http://your-ec2-public-ip:8084/api/v1/books/1
مرحله 5: NGINX را به عنوان یک پروکسی معکوس تنظیم کنید
نصب nginx:
sudo apt install -y nginx
پرونده پیکربندی Nginx را اصلاح کنید /etc/nginx/sites-available/default
:
server {
listen 80;
server_name your-ec2-public-ip;
location / {
proxy_pass http://127.0.0.1:8084/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
راه اندازی nginx:
sudo systemctl restart nginx
اکنون ، برنامه FastAPI شما در دسترس است http://your-ec2-public-ip/
بشر
مرحله ششم: استقرار خودکار با اقدامات GitHub
ایجاد کردن .github/workflows/deploy.yml
:
name: Deploy FastAPI to EC2
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Deploy to EC2
uses: appleboy/ssh-action@v0.1.6
with:
host: ${{ secrets.EC2_HOST }}
username: ubuntu
key: ${{ secrets.EC2_SSH_KEY }}
script: |
cd ~/fastapi-book-project
git pull origin main
docker build -t fastapi-app .
docker stop fastapi-container || true
docker rm fastapi-container || true
docker run -d -p 8084:8084 --name fastapi-container fastapi-app
sudo systemctl restart nginx
اسرار GitHub را تنظیم کنید
در مخزن GitHub خود:
- به سمت تنظیمات> اسرار> اقداماتبشر
- اضافه کردن EC2_HOST (IP عمومی EC2) و ec2_ssh_key (کلید خصوصی شما).
استقرار محرک
اجرا:
git add .
git commit -m "Test auto-deploy"
git push origin main
در یک فشار موفق به main
، اقدامات GitHub به طور خودکار برنامه را مستقر می کند!
چالش ها و قطعنامه ها
1. nginx درخواست های پراکسی نیست
سیاهههای NGINX را بررسی کنید:
sudo journalctl -u nginx --no-pager | tail -n 20
2. کانتینر داکر شروع به کار نمی کند
گزارش ها را تأیید کنید:
docker logs fastapi-container
3. اقدامات GitHub SSH موضوعات کلیدی
تضمین کردن EC2_SSH_KEY
راز به درستی در GitHub تنظیم شده است.
پیشرفت های بیشتر
- استفاده کردن AWS ECS به جای EC2 برای مقیاس پذیری بهتر.
- تنظیم کردن https با بیایید رمزگذاری کنیمبشر
- اسرار را با استفاده ایمن ذخیره کنید مدیر اسرار AWSبشر
با این تنظیم ، شما یک خط لوله CI/CD قوی دارید که استقرار یکپارچه از برنامه FastAPI شما را تضمین می کند. 🚀