EB
๋ฅผ ์์ฑํ๋ ๊ฒ์ ์์ง ์์ธํ ์ค์ ์ ์ ๋ชฐ๋ผ์ ์คํตํ๊ธฐ ๋๋ฌธ์ ์ด๋ ค์ด ๊ฒ์ด ์์๋ค.
Github Action
์ ์ด์ฉํด์ CI/CD ํ์ดํ๋ผ์ธ
์ ๊ตฌ์ฑํ์ฌ ๋ฐฐํฌ๋ฅผ ํ๋ค. ์ฌ์ค ๋ฐฐํฌ ์คํฌ๋ฆฝํธ๋ ๊ทธ๋๋ก ๊ฐ์ ธ์๋ค..
[ .github/workflows/main.yml ]
name: backend
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout source code.
uses: actions/checkout@master
- name: Set up Python 3.8
uses: actions/setup-python@v1
with:
python-version: "3.8"
- name: Generate deployment package
run: zip -r deploy.zip . -x '*.git*'
- name: Get timestamp
uses: gerred/actions/current-time@master
id: current-time
- name: Run string replace
uses: frabert/replace-string-action@master
id: format-time
with:
pattern: '[:\.]+'
string: "${{ steps.current-time.outputs.time }}"
replace-with: '-'
flags: 'g'
- name: Deploy to EB
uses: einaregilsson/beanstalk-deploy@v16
with:
aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
application_name: python-app
environment_name: Pythonapp-env
version_label: "python-${{ steps.format-time.outputs.replaced }}"
region: ap-northeast-2
deployment_package: deploy.zip
Github์ Repository์์ Secrets๋ฅผ ์ค์ ํด์ฃผ๋ฉด ๊ธฐ๋ณธ์ ์ธ ๋ฐฐํฌ ์ค๋น๋ ๋๋๋ค.
๋ค์์ผ๋ก Flask์ ๊ธฐ๋ณธ ์ํธ๋ฆฌํฌ์ธํธ์ธ app.py
์ ์ด๋ฆ์ application.py
๋ก ๋ณ๊ฒฝํด์ค์ผ ํ๋ค. ๊ทธ๋ฅ ๋ฃฐ์ด๋ผ๊ณ ํ๋ค.
๋ฐฐํฌ๋๋ ํ๊ฒฝ์์ ์ฌ์ฉ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ์ฒ๋ฆฌ๋ ํด์ค์ผ ํ๋ค.
pip freeze > requirements.txt
๊ธฐ๋ณธ์ ์ธ ์ค์ ์ ๋๋ฌ๋ค. ์ด์ ๋ฐฐํฌ๋๋ ํ๊ฒฝ์ ๋ง๊ฒ url ๋ฑ ๋ํ ์ผํ ๋ถ๋ถ์ ์ค์ ํด์ค์ผ ํ๋ค.
์ฒซ๋ฒ์งธ๋ก DB
(mongoDB)์ ๋ํ ์ ๋ณด์ด๋ค. DB
์ ์ ์ํ๋ ์ ์์ ๋ณด๋ฅผ ๋ช
์ํด์ฃผ์ด์ผ ํ๋๋ฐ ๊ณต๊ฐ๋๋ฉด ์ ๋๋ ์ ๋ณด์ด๋ฏ๋ก EB
์์ ํ๊ฒฝ๋ณ์๋ก ๊ด๋ฆฌํ๋๋ก ํด์ค๋ค.
import os
from pymongo import MongoClient
MONGO_URL = os.environ['MONGO_URL']
MONGO_USERNAME = os.environ['MONGO_USERNAME']
MONGO_PASSWORD = os.environ['MONGO_PASSWORD']
client = MongoClient(MONGO_URL, 27017, username=MONGO_USERNAME, password=MONGO_PASSWORD)
์ฌ์ค ์ด ๋ถ๋ถ์์ ์ ๋ง ์ด์ํ ์ค์๋ฅผ ํด์ ๋ช ์๊ฐ์ ๋ฐฐํฌ ํ
์คํธ๋ง ํ๋ค..
๊ธฐ์กด์ ์ฐ๋ฆฌ๋ python-decouple
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด์ privateํ ๊ฐ๋ค์ ๊ด๋ฆฌํ๋ค. ์ฌ๊ธฐ์ privateํ ๊ฐ๋ค์ด๋ github์ ๊ณต๊ฐํ์ง ์์ ๊ฐ๋ค์ ๋งํ๋ค. ๋ฐฐํฌ ํ
์คํธ๋ฅผ ํ๋ฉด์ ์๊พธ ์๋ฌ๊ฐ ๋ฐ์ํ๋๋ฐ ์ด ๋ถ๋ถ์ ์๊ฐ๋ ๋ชปํ๋ค.. ๋น์ฐํ๊ฒ ์๋๊ฐ... Github๋ฅผ ์ด์ฉํด์ ๋ฐฐํฌ๋ฅผ ํ๋๋ฐ ํ๋ก์ ํธ์ ํ์ํ privateํ ๊ฐ๋ค์ Github์ ์ ์ฌ๋ฆฐ๋ค? .. ? ใ
ใ
...ใ
ใ
..ใ
ใ
ํ๊ฒฝ๋ณ์๋ก ์ค์ ํ์...
EB
์์ ํ๊ฒฝ๋ณ์๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ํด๋น ํ๊ฒฝ์์ [๊ตฌ์ฑ - ์ํํธ์จ์ด] ์์ ์๋๋ก ๋ด๋ฆฌ๋ฉด ํ๊ฒฝ์์ฑ ์ด๋ผ๋ ๊ณณ์ ์ค์ ํ๋ฉด ๋๋ค.
์ผ๋จ ๋ฐฐํฌ๋ ํด๊ฒฐ๋๋ค. ์ด์ ๋ชจ๋ ๊ธฐ๋ฅ๋ค์ด ๋ฐฐํฌํ๊ฒฝ์์ ์ ๋๋ก ์๋ํ๋ ์ง๋ฅผ ํ์ธํด์ผํ๋ค.
์ด๋ฒ ํ๋ก์ ํธ์์ 3๊ฐ์ ์ค์ผ์ค๋ฌ๋ฅผ ์ฌ์ฉ ์ค์ด๋ค.. ๋ก์ปฌ์์๋ ๋ชจ๋ ์ ๋์ํ๋ ๊ฒ์ ํ์ธํ์ง๋ง ๋ฐฐํฌํ๊ฒฝ์์ ๋์ํ์ง ์๋๋ค.. ํฐ์ผ์ด๋ค..
์ผ๋จ ์ฐพ์๋ณธ ์ฒซ๋ฒ์งธ ํด๊ฒฐ๋ฐฉ๋ฒ์ cron.yaml
์ค์ ํ์ผ์ ํตํด ์ค์ผ์ค๋ง์ ๋ํ ์ค์ ์ ํ๋ ๊ฒ์ด๋ค. flask
์ ์ค์ผ์ค๋ฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ค.
version: 1
cron:
- name: "category-data-init"
url: "/api/category/data-initialize"
schedule: "0 3 * * *"
๋งค์ผ ์ค์ 3์์ url๋ก post ์์ฒญ์ ๋ณด๋ด๋ ์ค์ ์ด๋ค. ๊ณต์๋ฌธ์๋ฅผ ๊ฑฐ์ ๊ทธ๋๋ก ๊ฐ์ ธ์จ ๊ฒ์ด๋ค.
bp = Blueprint("category_data_scheduler", __name__, url_prefix='/')
@bp.route('/api/category/data-initialize')
def set_category_data():
...
์ด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ฒ์ธ๋ฐ ํธ์ถ์ด ์๋๋ ๊ฒ์ ๋์งธ์น๊ณ ์ ์ด์ ๋ฑ๋ก ์์ฒด๊ฐ ์ ๋๋ค.. ๋๋ฌผ๋๋ค.. ํด๊ฒฐํด์ผ ํ๋ค..!
ํํฐ๋๊ป ์ง๋ฌธ๋๋ฆฐ ๊ฒฐ๊ณผ ๋ณดํต์ ๊ฒฝ์ฐ EB์์ ์ค์ผ์ค๋ฌ๋ฅผ ๋์์ํค์ง ์๋๋ค๊ณ ํ๋ค. ๋ณดํต AWS์ Lambda๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ EC2์ ์ค์ผ์ค๋ฌ ๋ถ๋ถ๋ง ๋ฐ๋ก ์ฌ๋ ค์ ๊ธฐ๋์ํค๋ ๊ฒ ๊ฐ๋ค. Lambda๋ฅผ ์จ๋ณด๊ณ ์ถ์ ์์ฌ์ด ์๊ธฐ์ง๋ง ์๊ฐ์ด ๋ง์ด ์์ผ๋ ์ผ๋จ ์์ฑ์ ๋ชฉํ๋ก ์ค์ผ์ค๋ฌ ๋ถ๋ถ๋ง ๋ฐ๋ก ๋ด์ด EC2
์ ์ฌ๋ ค์ ์ฌ์ฉํ ์์ ์ด๋ค.
cron.yaml
์ ๋ ๊ฒ ๊ฐ์ ๋ฐฉ๋ฒ์ ๋์ฒด ๋ฌด์์ธ๊ฐ ....
์ํผ ์๋ ๋ฐฐํฌ ์๋ฃ^^
Today ๊ตญํ