برنامه نویسی

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

مقدمه

در این پست وبلاگ ، ما روند استقرار را طی خواهیم کرد فریپی برنامه در AWS EC2 نمونه با چیز کوچک به عنوان یک پروکسی معکوس ، در حالی که اعمال می شود اقدامات GitHub برای ادغام مداوم و استقرار مداوم (CI/CD). این اطمینان حاصل می کند که هر تغییری به سمت main شعبه به طور خودکار به سرور مستقر می شود.

با پایان این آموزش ، شما یک برنامه کاملاً کاربردی و به طور مداوم مستقر در AWS در حال اجرا خواهید داشت.

بررسی اجمالی پروژه

ما با یک کار خواهیم کرد API کتاب Fastapi و به دنبال این مراحل کلیدی:

  1. مفقودین را پیاده سازی کنید GET /api/v1/books/{book_id} نقطه پایانی
  2. برنامه را به صورت محلی آزمایش کنید.
  3. برنامه را dockerize کنید.
  4. آن را در نمونه AWS EC2 مستقر کنید.
  5. NGINX را به عنوان یک پروکسی معکوس تنظیم کنید.
  6. اقدامات 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 شما را تضمین می کند. 🚀

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا