AWS EC2์ Flask ์๋ฒ๋ฅผ ๋ฐฐํฌํด๋ณด์์ต๋๋ค.
์ฝ์ง ์์์ต๋๋ค.
(๋น์ฐํจ ํ๋ฒ๋ ์ํด๋ด)
์ฐ์ ์ ์๊ฒ ์ฃผ์ด์ง ๊ฑด
ec2-*-**-*-**.ap-northeast-2.compute.amazonaws.com ์๋ฒ ์ฃผ์์
ppk ํคํ์ด ํ์ผ๋ฟ์ด์์ต๋๋ค.
(์ฝ์ ์ ๊ทผ๋ ๋ชปํ์,,)
aws์์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ~ ์ด๋ฐ ๋ถ๋ถ์ ๋ค ๋์ด๊ฐ๊ณ
์ด ์ํฉ์์๋ถํฐ ์์ํด๋ณด๊ฒ ์ต๋๋ค.
[ ๋ชฉ์ฐจ ]
1. ppk to pem
2. aws ec2 ์๋ฒ ์ ์
3. FileZilla Client ์ค์น
4. FileZilla๋ก ์ฝ๋ ํ์ผ ์ ๋ก๋
5. flask ์คํ
6. port ์ค์
7. mysql ์ค์น ๋ฐ ์ ์
8. mysql ์ฌ์ฉ์ ์ถ๊ฐ ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ
9. flask์์ mysql ์ฐ๊ฒฐ
10. ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํ
** ๊ฐ๋ฐ ํ๊ฒฝ **
- Mac OS (Intel)
- VS Code
- Python 3.11.7
๋จผ์ ์๋ฒ์ ์ ์์ด ๋๋์ง ํ์ธ์ ํด๋ด ๋๋ค.
์ ๊ทผ๋ฐ ppk ํ์ผ์ pem ํ์ผ๋ก ๋ณํํ๋ ๊ฒ ์ข์ต๋๋ค.
<ppk to pem>
puttygen์ด ํ์ํฉ๋๋ค.
brew install putty
์ค์นํ๋ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ก ๋ณํํด์ค๋๋ค.
/Users/keypair.ppk << ๊ฐ์์ ํคํ์ด ์ฃผ์๊ฐ์ผ๋ก ํ์๋ฉด ๋ฉ๋๋ค.
puttygen /Users/keypair.ppk -O private-openssh -o /Users/keypair.pem
์ ๊ธฐ์ private-openssh ๋ก ์ํ๋ฉด Permission denied (publickey) ์๋ฌ๋ง ์ฃผ๊ตฌ์ฅ์ฐฝ ๋ณผ ์ ์์ต๋๋ค..
๊ทธ๋ฆฌ๊ณ pem ํ์ผ์ ๊ถํ๋ 400 ์ ๋๋ก ๋ง์ถฐ์ค๋๋ค.
400์ ์์ ์์๊ฒ ์ฝ๊ธฐ ๊ถํ๋ง ํ์ฉ๋ ์ค์ ์ ๋๋ค.
chmod 400 /Users/keypair.pem
๊ทธ๋ฆฌ๊ณ ์ด์ ๋ณํํ pem์ ๊ฐ์ง๊ณ ์๋ฒ์ ์ ์ํด๋ด ๋๋ค.
ssh -i /Users/keypair.pem ubuntu@*.**.**.**
ubuntu ์ผ์๋ ์๊ณ ec2-user ์ผ์๋ ์์ต๋๋ค.
๋ค์ ์ฃผ์๋ ec2-*-**-*-**.ap-northeast-2.compute.amazonaws.com ์๋ฒ ์ฃผ์์์ ํ์ธํ ์ ์๋ IPv4 ์ฃผ์์ ๋๋ค.
pem ํ์ผ์ ๋ฌธ์ ๊ฐ ์๊ฑฐ๋ ip์ฃผ์๊ฐ ํ๋ฆฐ๊ฒ ์๋๋ผ๋ฉด ,, ์ฌ๋งํ๋ฉด ์ ์์ด ๋ ๊ฒ ์ ๋๋ค..
ubuntu@ip- ๋ก ์์ํ๋ ๊ฑธ๋ก ๋ก๊ทธ์ธ๋์๋ค๋ฉด ์ฑ๊ณต์ ๋๋ค..
`exit` ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์๋ฉด ์๋ฒ ์ธ์ ์ ์ข ๋ฃํ ์ ์์ต๋๋ค.
๋ค์์ผ๋ก FileZilla ํ๋ก๊ทธ๋จ์ ์ด์ฉํด์ ํ์ผ์ ์๋ฒ์ ์ฌ๋ ค์ค๋๋ค.
FileZilla๊ฐ ์์ผ๋ฉด ์ค์น๋ฅผ ํด์ผํฉ๋๋ค.
https://filezilla-project.org/
์ผ์ชฝ์ ์๋ Client ๋ค์ด๋ก๋๋ก ๊ฐ๋๋ค.
์ ๋ macOS(Intel)์ด๋๊น ๋ฐ๋ก Download ๋ฅผ ๋๋ฌ์ฃผ๊ณ
์ฌ๊ธฐ์ ๋งจ ์ผ์ชฝ์ ์๋ FileZilla -> Download ๋ฒํผ์ ๋๋ฌ ๋ค์ด๋ฐ์ ์ค๋๋ค.
์ดํ์๋ ์ค์นํ์ ์ I agree -> ๊ธฐ๋ณธ Default ์ค์ ์ผ๋ก ์ฒดํฌํ์๋ฉด ๋ฉ๋๋ค.
์คํํ๋ฉด ์๋ ์ฌ์ง๊ณผ ๊ฐ์ ํ๋ฉด์ด ๋ณด์ด์คํ ๋ฐ์,
๋ซ๊ธฐ ๋ฒํผ ์๋ ์๋ ์ฌ์ดํธ ๊ด๋ฆฌ์ ๋ฅผ ๋๋ฌ์ค๋๋ค.
ํ์ผ > ์ฌ์ดํธ ๊ด๋ฆฌ์ ๋ก ์ง์ ํ์ค ์๋ ์์ด์.
์ ์ฌ์ดํธ ๋ฅผ ์ถ๊ฐํ์ ์ ์์ฑํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
aws ec2 ๊ธฐ์ค !
ํ๋กํ ์ฝ์ SFTP - SSH File Transfer Protocol
ํธ์คํธ๋ ์๋ฒ ์ ์ํ๋ IP ์ฃผ์
๋ก๊ทธ์ธ ์ ํ์ ํค ํ์ผ
์ฌ์ฉ์๋ ubuntu
ํค ํ์ผ์ pem ํ์ผ ์์น
๋ก ์ค์ ํด์ฃผ์๊ณ ์ฐ๊ฒฐ ํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
๊ทธ๋ผ ์๋ ์ฌ์ง์ฒ๋ผ ๋ฆฌ๋ชจํธ ์ฌ์ดํธ์ ์ ์๋ ๊ฑธ ๋ณด..์ ์ผ ํฉ๋๋ค !
์ฌ๊ธฐ์ ์์ ํ๋ ํ์ผ๋ค์ ๋ฃ์ด์ค๋๋ค.
๋๋๊ทธ์ค๋๋์ผ๋ก ๋ฃ์ด์ฃผ์ค ์ ์์ด์.
ํ์ผ์ง๋ผ๋ ์ฝ๊ฒ ํ์ผ ์ฎ๊ฒจ์ฃผ๋ ์ญํ ๋ง ํ๊ธฐ ๋๋ฌธ์ ์ ~ ์๋ํ๋ ์ฝ๋ ํ์ผ ๋ฐ ํ์ํ ํ์ผ(eg. requirements.txt)๋ค์ ๋ฃ๊ณ
์คํ์ ํฐ๋ฏธ๋์์ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
๋ค ์ฎ๊ฒจ์ก์ผ๋ฉด ์๊น ์๋ฒ์ ์ ์ํ๋ ํฐ๋ฏธ๋์์ ๊ณ์ ์งํํ๊ฒ ์ต๋๋ค.
์ฌ๊ธฐ๋ python๋ ์ค์น๋์ด ์์ง ์์ ๊ณณ์ด๊ธฐ ๋๋ฌธ์ python ์ค์น๋ถํฐ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
sudo apt update
sudo apt install python3-pip
๊ทธ๋ฆฌ๊ณ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ค์นํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
์ ๋ requirements.txt ํ์ผ์ ๋ด์์๊ธฐ ๋๋ฌธ์ ํด๋น ํ์ผ์ ์ด์ด ์ค์นํ๋ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์์ต๋๋ค.
pip install -r requirements.txt
๋ง๋ฌด๋ฆฌ ๋๋ฉด python3 (์คํํ์ผ).py ๋ก ์คํํด๋ณด์ค ์ ์์ต๋๋ค.
๋ง์ฝ ์ฎ๊ธด ํ์ผ๋ค์ด venv๊ฐ ํฌํจ๋์ด ์๋ค๋ฉด,
cd venv
source bin/activate
๊ฐ์ํ๊ฒฝ์ ์คํ์ํค๊ณ ์ค์น ๋ฐ ์คํ ํ์๋ฉด ๋๊ฒ ์ต๋๋ค.
flask ๋ก ์คํ์ํฌ ์๋ ์์ต๋๋ค.
export FLASK_APP=(์คํํ์ผ).py
flask run
export ๋ช ๋ น์ด๋ก ์คํํ flask app์ ์ง์ ํด์ฃผ๊ณ flask run์ผ๋ก ์คํํ๋ฉด ๋๋๋ฐ,
์ด ๋ ์คํํ ํ์ผ์ด ๋ฃจํธ ํ์ผ(eg. venv)์ ์์ง ์๋ค๋ฉด, FLASK_APP=(๋๋ ํ ๋ฆฌ).(์คํํ์ผ).py ๋ก ๋๋ ํ ๋ฆฌ ์ง์ ์ ์ ํํ ํด์ฃผ์ด์ผ ํฉ๋๋ค..!
์ด๋ ๊ฒ ์คํ์ด ์ ๋์ ๋ค๋ฉด..
์ถํ๋๋ฆฝ๋๋ค(?)
์ด์ ip์ฃผ์:์ค์ ํ ํฌํธ (์. http://3.33.3.33:5000) ๋ก ์ ์์ด ๋๋์ง ํ์ธํด๋ณด์ ์.
์ธ๋ถ ๋ธ๋ผ์ฐ์ ์์ ํด๋น ip๋ก ์ ์์ด ์๋์ ๋ค๋ฉด ํฌํธ ์ค์ ์ด ํ์ํฉ๋๋ค..
ํฐ๋ฏธ๋์์ ํ์ฌ ์ฌ์ฉํ๊ณ ์๋ TCP port ์กฐํ๋ฅผ ํด๋ด ๋๋ค.
netstat -tnl
๊ทธ๋ผ ์๋ ์ฌ์ง ์ฒ๋ผ ์ด๋ฆฐ ํฌํธ๋ค์ด ๋ณด์ด์ค ํ ๋ฐ
์ฌ๊ธฐ์ ์ค์ ํ๋ flask port (๋ณดํต 5000)์ด ์ ๋ณด์ด์ ๋ค๋ฉด,,
๋ฐฉํ๋ฒฝ ์ค์ ์ด ํ์ํ ์ ์์ต๋๋ค.
์ ๋ ubuntu์ ๋ฐฉํ๋ฒฝ (ufw) ์ผ๋ก ์ค์ ํ์์ต๋๋ค.
sudo ufw enable
sudo ufw allow 5000
๋ง์ฝ์ ์ ๊ธฐ 5000์ด ์๋๋ฐ๋ ์๋๋ค? ํ์๋ฉด aws ec2 ์ธ์คํด์ค ์ฝ์์์ ์ค์ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
์ ๋ ์ฝ์์ ์ ๊ทผํ ์ ์๋ ์ํฉ์ด๋ผ ์์ธํ ์ ์ง ๋ชปํ์ง๋ง
์ธ์คํด์ค > ๋ณด์๊ทธ๋ฃน ์ธ๋ถ์ ๋ณด > ์ธ๋ฐ์ด๋ ๊ท์น ํญ๋ชฉ์์ ํ์ํ ํฌํธ ์ ๋ณด๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ๋ฉ๋๋ค.
์ ๋ ์ดํ์ MySQL์ด ํ์ํ ์ํฉ์ด ์์ต๋๋ค...
๋ง์ฐฌ๊ฐ์ง๋ก ์ ๋ ์ฝ์์ ์ ๊ทผํ ์ ์์๊ธฐ์........ RDS๋ฅผ ์ฌ์ฉํ์ง ์์์ต๋๋ค. ์๋ ๋ชปํ๋ฌ๊น...
์ผ๋จ aws์ mysql์ ์ค์นํด์ค๋๋ค.
sudo apt install mysql-server
๊ทธ๋ฆฌ๊ณ mysql์ ์ ์ํด์ค๋๋ค.
sudo mysql -u root -p
์ฒ์์๋ ๋น๋ฐ๋ฒํธ๊ฐ ์๋๋ฐ ์ฌ์ฉํ password๋ก ์ ๋ ฅํด์ ๋ค์ด๊ฐ๋ฉด ์ค์ ๋๊ณ
๊ทธ๋ฅ ์ํฐ์ณ์ ์ ์ ํ use mysql ๋ช ๋ น์ด๋ก ๋น๋ฐ๋ฒํธ๋ฅผ ์ถํ์ ๋ณ๊ฒฝํด์ฃผ๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค.
mysql์ ์ ์ํ์ผ๋ฉด ์ธ๋ถ ์ ์ ํ์ฉ ์ค์ ์ ํด์ค๋๋ค.
mysqld.cnf ํ์ผ์ ์์ ํ๋ฉด ๋๋๋ฐ
์ฐ์ ํ์ผ์ด ์๋ ๋๋ ํ ๋ฆฌ๋ก ์ด๋ํด vi ์๋ํฐ๋ก ํ์ผ์ ์คํํด ์์ ํ๋ฉด ๋ฉ๋๋ค.
cd /etc/mysql/mysql.conf.d
vi mysqld.cnf
i ํค๋ฅผ ๋๋ฌ Insert ์ํ๋ก ๋ณ๊ฒฝํ๊ณ
bind-address๋ฅผ 0.0.0.0์ผ๋ก ์์ ํ๊ณ
esc ๋๋ฌ ์ฝ๊ธฐ ์ํ๋ก ์ ํํ์ฌ
:wq ์ํฐ ๋๋ฌ ์ ์ฅํ๊ณ ์ข ๋ฃํ๋ฉด ๋ฉ๋๋ค.
์ด ๊ทผ๋ฐ ์ ๊ฐ ์ง๊ธ ์์ฑํ๋ฉด์ ํ์ธํ๋๋ฐ
์ ๋ /etc/mysql/mysql.cnf ํ์ผ์ ์์ ํ๊ฑฐ๋ ์..?
๋ฉ์ธ ์ค์ ํ์ผ๊ณผ ํน์ ์ค์ ํฌํจ ํ์ผ ์ฐจ์ด์ธ๋ฐ ์ ์ ๋์์ ํ๋ ๊ฑฐ๋ณด๋ ๊ด์ฐฎ์ ๊ฒ ๊ฐ์ต๋๋ค.
๋ค์์ผ๋ก ์ฌ์ฉ์ ์ถ๊ฐ ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ ๋ฑ์ ์์ ์ ํด์ค๋๋ค.
// ์ฌ์ฉ์ ์ถ๊ฐ ์์
์ฌ์ฉ์ ์ด๋ฆ = manager
ํธ์คํธ ์ฃผ์ = 3.33.3.33
๋น๋ฐ๋ฒํธ = admin123
CREATE USER 'manager'@3.33.3.33 IDENTIFIED BY 'admin123';
// ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ
dbname์ด๋ผ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค
ํ๊ธ ์ฌ์ฉํ ์ ์๋ UTF8๋ก ๋ฌธ์์ด ์ ์ฅ
CREATE DATABASE dbname default CHARACTER SET UTF8;
// ์ฌ์ฉ์ ๋ชจ๋ ๊ถํ ๋ถ์ฌ
GRANT ALL PRIVILEGES ON dbname TO 'manager'@3.33.3.33;
ํ ์ด๋ธ ์์ฑ ๊ด๋ จ ์ค๋ช ์ ๊ฑด๋๋ฐ๊ฒ ์ต๋๋ค.
DBeaver ์ ๊ฐ์ GUI ํด์ ์ด์ฉํ์๋ฉด ํธ๋ฆฌํ๊ฒ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
์ด์ ํฐ๋ฏธ๋์์ ํ ์ ์๋ ์์ ์ด ๋ชจ๋ ์งํ๋์๋ค๋ฉด flask์ ์ฐ๊ฒฐํด์ฃผ๋ ์์ ์ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
mysql ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํด์ฃผ๊ณ
pip install mysql-connector-python
connect ํด์ฃผ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ผญ ์๋์ ํ์์ผ ํ์๋ ์๊ณ ์ด๋ฐ ๋ด์ฉ์ด ํ์ํ๊ตฌ๋~ ์ ๋๋ง ๋ด์ฃผ์๋ฉด ๋๊ฒ ์ต๋๋ค.
config = {
'host': 3.33.3.33,
'port': 3306,
'user': manager,
'password': admin123,
'database': FLASKAPP
}
connection = mysql.connector.connect(**config)
user์ password๋ mysql์์ ์ถ๊ฐํ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ธฐ์ ํด์ฃผ์๋ฉด ๋๊ณ ,
database๋ ์์ฑํ database์ name์ ๊ธฐ์ ํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ DB ๋ก์ง์ ๋๊ฐ ์๋์ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฌ์ฉ์ด ๋๋ cursor์ connection close๋ ํ์์ ๋๋ค..
cursor = connection.cursor()
cursor.execute('SELECT * FROM table')
result = cursor.fetchall()
์ด๋ ๊ฒ ํ์ผ๋ฉด ์ด์ ์คํ์ ๋ค์ ํด๋ด ์๋ค.
์๋ง.. ์ฌ๊ธฐ๊น์ง ๋์ผ๋ฉด ์คํ์ด ์๋ ๊ฒ๋๋ค.. ๐ฅฒ
mysql.connector.errors.OperationalError: MySQL Connection not available.
๋จผ์ mysql ์๋ฒ๊ฐ aws์์ ์คํ์ค์ด๊ธด ํ๊ฑด์ง ํ์ธํด๋ด ๋๋ค.
sudo systemctl status mysql
active (running) ์ค์ด๋ฉด ์คํ์ค์ ๋๋ค.
๊ทธ๋ผ.. flask 5000๋ฒ ํฌํธ ์ด์ด์ผ ํ๋ ๊ฒ๊ณผ ๊ฐ์ด
mysql์ 3306๋ฒ ํฌํธ๋ ํ์ฑํ ์์ผ์ฃผ์ด์ผ ํฉ๋๋ค.
์์ ํฌํธ ์ค์ ๊ณผ ์๋ฒ ์คํ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค๋ฉด..
์ด์ ์ ์์ ์ผ๋ก ์คํ์ด ๋์ ๋ค๋ฉด !
flask run ์ด๋ python3 app.py ์ด๋ ๊ฒ ํ๋ฉด ctr+c ํ์ ๋ ์ข ๋ฃ๋์์์?
๋ฐฑ๊ทธ๋ผ์ด๋์์๋ ๋์ํ ์ ์๊ฒ ํด์ค๋๋ค.
nohup ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด ์ค๊ฑด๋ฐ์ ๊ฐ๋จํฉ๋๋ค.
nohup flask run &
nohup python3 app.py &
nohup ํ๊ณ & ๋ถ์ฌ์ฃผ๋ฉด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ๋ฉ๋๋ค.
ํด๋น ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด ๋ญ๊ฐ ๋จ๊ณ ๋น ์ ธ๋์ค์ง ๋ชปํ๋๋ฐ ๊ทธ๋ฅ ์ปจํธ๋กค C ํด์ ๋์ค์ ๋ ๋ฉ๋๋ค.
์ ๋์ ์ค์ธ์ง ํ์ธํ๋ ค๋ฉด
ps -ef ๋ช ๋ น์ด๋ก ์คํ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ํ์ธํ๊ฑฐ๋
tail -f nohup.out ๋ช ๋ น์ด๋ก ์ค์๊ฐ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํด๋ณผ ์ ์์ต๋๋ค.
์ข ๋ฃํ๋ ค๋ฉด ps -ef ๋ก PID ๋ฅผ ํ์ธํ์ฌ
kill [PID] ํ์๋ฉด ๋ฉ๋๋ค.
๊ทธ๋ผ
์ ๊ฐ ์ฝ์งํ ๊ฒ ๋์์ด ๋์ จ๊ธธ ๋ฐ๋ผ๋ฉฐ..
๋ํ ์ด์ฉ๋ฉด ๋ฏธ๋์ ๋์๊ฒ๋ ๋์์ด ๋๋ฆฌ๋ผ ๋ฏฟ๊ณ ..
์ด๋ง ๊ธ์ ๋ง์น๊ฒ ์ต๋๋ค.
๐ซ