๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Project ESG+AI/[์‚ผ์ •KPMG]ESG ๋ฐ์ดํ„ฐ ํ™œ์šฉ ํ’€์Šคํ… ๊ฐœ๋ฐœ

49์ผ์ฐจ.

by GreenJin_S2 2025. 12. 19.

 

 

 

AWS์ ‘์†ํ•ด์„œ ์œ„์— ๋กœ๊ทธ์ธ ๋จผ์ €ํ•˜๊ณ  ์ฝ˜์†”๋กœ๊ทธ์ธ ํ•ด์•ผํ•จ!

 

 

๋‹ค์‹œ AWS์— ์˜ฌ๋ ค์„œ ๋ณต์‚ฌ ๋‚ด์šฉ ๋ฐ”๋€œ

 

 

 

 

 

@backend/app ์ด FASTAPI ๋ฅผ EC2์— ์—…๋กœ๋“œํ•ด์„œ, restful api ๋กœ ๋ฐฐํฌํ•˜๊ณ  ์‹ถ์–ด. ๊นƒํ—ˆ๋ธŒ ์•ก์…˜์€ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ์„ค์ •์ด ์™„๋ฃŒ๋˜์—ˆ์–ด. ์ดํ›„ CICD ๋กœ ๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •์„ ์„ค๋ช…ํ•ด์ค˜.

 

 

 

 

์ผ๋‹จ ํ‚ค๊ฐ€ ๋ฐ”๊ปด์„œ ๊ทธ๊ฑฐ ๋จผ์ € ํด๋กœ๋“œํ•œํ…Œ ์ž…๋ ฅํ•˜๊ธฐ!!!

 

ssh -i "labzang.pem" ubuntu@ec2-3-**-233-152.ap-northeast-2.compute.amazonaws.com ์—ฌ๊ธฐ์—์„œ ec2 ํ˜ธ์ŠคํŠธ๋ฅผ ์ถ”์ถœํ•ด์ค˜

 

 

 

ํ•œ์นธ ๋„์šฐ๊ณ  ํ•ด์•ผํ•จ!

 

 

@backend/app ์ด ํ”„๋กœ์ ํŠธ๋ฅผ CPU๋กœ EC2์— ์˜ฎ๊ธฐ๊ณ  ์‹ถ์–ด. ์–ด๋А ํด๋”์— ์œ„์น˜์‹œํ‚ค๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€ ์ „๋žต์ธ๊ฐ€?

 

์บก์ณํ•ด์„œ ๋ฌผ์–ด๋ณด๊ธฐ

 

 

 

 

๋‚˜์˜ค๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•

 

esc-> shift+:->q!

esc-> shift+:->wq!

(๊ณ ์นœ๋‹ค์Œ์— ์ €์žฅํ•˜๊ณ  ๋‚˜๊ฐ€๋ ค๋ฉด w๋ถ™์—ฌ์•ผํ•จ! ์•ˆ ๊ณ ์ณค๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹ค ๋‚ ๋ผ๊ฐ! ์กฐ์‹ฌํ•˜๊ธฐ)

 

์ž˜๋ชปํ•œ๊ฑฐ ๊ฐ™์•„์„œ ๋‹ค์‹œ ํ•จ! 

 

 

@backend/requirements.txt ์—ฌ๊ธฐ์— ์„ค์น˜ํ•  ํŒจํ‚ค์ง€๋ฅผ home/ubuntu ์— ์„ค์น˜ํ•˜๋ ค๊ณ  ํ•ด. vim ์œผ๋กœ ์˜คํ”ˆํ•œ ์ด ํŒŒ์ผ์— ๋“ค์–ด๊ฐˆ ๋‚ด์šฉ์„ ๊ทธ๋Œ€๋กœ ์นดํ”ผํ•ด์„œ ๋ถ™์—ฌ๋„ฃ์„ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค˜. ๊ผญ CPU ๋กœ ์‹คํ–‰ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋งŒ ์ •๋ฆฌํ•ด์ค˜.

 

 

ํด๋กœ๋“œ๊ฐ€ ์ฝ”๋“œ ์ค„๊ฑฐ์ž„ 

๊ทธ๊ฑฐ๋ฅผ vim ๋‹ค์‹œ ๋“ค์–ด๊ฐ€์„œ ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ•˜๊ณ 

esc-> shift+:->wq!

 

 

๋‚˜๋Š” ๋”ฐ๋กœ ํด๋กœ๋“œ๊ฐ€ requirment-cpu.txt ํŒŒ์ผ์„ ๋ฃจํŠธ์— ๋งŒ๋“ค์–ด์คŒ 

์—†์œผ๋ฉด requirment.txt ํŒŒ์ผ ๋ฐ–์œผ๋กœ ๋นผ๊ธฐ -๋ฃจํŠธ๋กœ 

 

 

 

๊นƒ ํ‘ธ์‹œํ•˜๊ธฐ

 

 

 

 

 

ํด๋กœ๋“œํ•œํ…Œ ์—๋Ÿฌ ์žก์•„๋‹ฌ๋ผ๊ณ  ํ•˜๊ธฐ

๋ฐ”๋€œ

 

@.github/workflows/deploy-ec2.yml ์ด ํŒŒ์ผ์„ ๋‚ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ฃจํŠธ ์ž์ฒด๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฑด ์•ˆ ๋˜์ง€๋งŒ, GitHub Actions ์•ˆ์—์„œ

app ํด๋”๋งŒ ๋Œ€์ƒ์œผ๋กœ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ์™€ ๋ฐฐํฌ ๋Œ€์ƒ์„ ์ง€์ •ํ•˜๋Š” ๊ฑด ์ถฉ๋ถ„ํžˆ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ์€ ๋‘ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

 

1. Action ์‹คํ–‰ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ app ์œผ๋กœ ๊ณ ์ •ํ•˜๊ธฐ

 

job ์•ˆ์— http://defaults.run.working-directory ๋ฅผ ์“ฐ๋ฉด, ๊ทธ job ์˜ ๋ชจ๋“  run: ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ app ํด๋”์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

 

# .github/workflows/deploy.yml

name: Deploy app to EC2

 

on:

push:

branches: [ main ]

paths:

- 'app/**' # <- app ํด๋” ๋ณ€๊ฒฝ์‹œ์—๋งŒ ์‹คํ–‰ (์„ ํƒ์‚ฌํ•ญ)

 

jobs:

deploy:

runs-on: ubuntu-latest

 

defaults:

run:

working-directory: app # <- ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ run ์€ ์ „๋ถ€ app/ ๊ธฐ์ค€

 

steps:

- name: Checkout code

uses: actions/checkout@v4

 

- name: Set up Python

uses: actions/setup-python@v5

with:

python-version: '3.12'

 

- name: Install dependencies

run: |

pip install -r requirements.txt # app/requirements.txt ๊ธฐ์ค€์œผ๋กœ ์‹คํ–‰

 

- name: Run tests

run: |

pytest

 

- name: Configure SSH

shell: bash

run: |

mkdir -p "$HOME/.ssh"

echo "${{ secrets.EC2_SSH_KEY }}" > "$HOME/.ssh/id_rsa"

chmod 600 "$HOME/.ssh/id_rsa"

ssh-keyscan -H "${{ secrets.EC2_HOST }}" >> "$HOME/.ssh/known_hosts"

 

- name: Deploy to EC2

shell: bash

run: |

# ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” app/

rsync -avz . ubuntu@${{ secrets.EC2_HOST }}:/home/ubuntu/rag-app

# ๋˜๋Š” ssh ๋กœ ๋“ค์–ด๊ฐ€์„œ app ๊ธฐ์ค€์œผ๋กœ ๋ช…๋ น ์‹คํ–‰

# ssh ubuntu@${{ secrets.EC2_HOST }} "cd /home/ubuntu/rag-app && uvicorn app_server:app --reload"

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด:

 

ํ…Œ์ŠคํŠธ, ๋นŒ๋“œ, ์˜์กด์„ฑ ์„ค์น˜ ๋ชจ๋‘ app ํด๋” ๊ธฐ์ค€์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ฃจํŠธ์— frontend, libs, scripts ๊ฐ€ ์žˆ์–ด๋„ CI๋Š” app ๋งŒ ์‹ ๊ฒฝ ์”๋‹ˆ๋‹ค.

paths: - 'app/**' ๋•๋ถ„์— app ์•„๋ž˜ ํŒŒ์ผ์ด ๋ฐ”๋€” ๋•Œ๋งŒ ๋ฐฐํฌ๊ฐ€ ๋Œ์•„๊ฐ€๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

2. EC2 ์—๋„ app ํด๋”๋งŒ ๋ณด๋‚ด๊ธฐ

์œ„ ์˜ˆ์‹œ์˜ Deploy to EC2 ์ฒ˜๋Ÿผ:

rsync -avz . ubuntu@${{ secrets.EC2_HOST }}:/home/ubuntu/rag-app

ํ˜„์žฌ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ app ์ด๋ผ์„œ, EC2 ์ชฝ์—๋Š” /home/ubuntu/rag-app ์— app ๋‚ด์šฉ๋งŒ ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.

scp -r app ubuntu@... ์ฒ˜๋Ÿผ ๋ฃจํŠธ์—์„œ ๋ช…์‹œ์ ์œผ๋กœ app ๋งŒ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

์ •๋ฆฌํ•˜๋ฉด,

GitHub Actions๋Š” ํ•ญ์ƒ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ฃจํŠธ์—์„œ ์‹œ์ž‘ํ•˜์ง€๋งŒ,

http://defaults.run.working-directory: app ๊ณผ paths: 'app/**' ์„ค์ •์œผ๋กœ

“์ด job ์€ app ์„œ๋ธŒ๋””๋ ‰ํ„ฐ๋ฆฌ๋งŒ ๋‹ค๋ฃฌ๋‹ค” ๋ผ๋Š” ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฐํฌ ๋‹จ๊ณ„์—์„œ rsync / scp ์˜ ๋Œ€์ƒ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ app ์œผ๋กœ ์žก์œผ๋ฉด, EC2 ์ชฝ์—๋„ ๋”ฑ ๊ทธ ๋ถ€๋ถ„๋งŒ ์˜ฌ๋ผ๊ฐ‘๋‹ˆ๋‹ค.

 

์ง€๊ธˆ ์‚ฌ์šฉ ์ค‘์ธ deploy.yml ์„ ๋ณด์—ฌ์ฃผ์‹œ๋ฉด, ์œ„ ๊ตฌ์กฐ๋กœ ๋”ฑ ๋งž์ถฐ์„œ ์ˆ˜์ •๋ณธ๊นŒ์ง€ ๊ฐ™์ด ๋งŒ๋“ค์–ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 


/opt/rag-app/

โ”œโ”€โ”€ main.py

โ”œโ”€โ”€ core/

โ”œโ”€โ”€ models/

โ”œโ”€โ”€ requirements.txt

โ””โ”€โ”€ venv/--ec2๋ฐฐํฌ ์œ„์น˜๋ฅผ home/ubuntu์—ฌ๊ธฐ๋กœ ์„ค์ •ํ•ด์ค˜