
์ด ๊ธ์
iptables๋ช ๋ น์ด ์ฌ์ฉ๋ฒ๊ณผdocker๋ฅผ ํ์ฉํ ๋ฐฐํฌ์ ๋ํด ๋ค๋ฃจ๊ณ ์๋ trouble shooting ๋ฌธ์์ ๋๋ค. ์ํ๋ ๋ถ๋ถ๋ง ๋ณด์๊ณ ์ถ์ผ์๋ค๋ฉด ์๋๋ก ์ด๋ํ์๋ฉด ๋ฉ๋๋ค.
ํ์ฌ ์ฐ๊ตฌ์ค์์ ํ๋ก์ ํธ๋ฅผ ํ๊ณ ์๋ค. ์๊ท๋ชจ ํ๋ก์ ํธ์ด๊ธฐ๋ ํ๊ณ , ํ ์คํ ํ๊ฒฝ ๊ตฌ์ถ์ด ๋ชฉํ์ด๊ธฐ ๋๋ฌธ์ ๋ณ๋์ AWS ๋น์ฉ ์ง์ถ์ด ๋ถ๊ฐํ๋ค๋ ์ด์ ๋ก ์ฐ๊ตฌ์ค workstation์ ํ๋ ํ ๋น ๋ฐ์ ๋ฐฐํฌํ๊ฒ ๋์๋ค. ํด๋ผ์ฐ๋๊ฐ ์๋ ์๋ฒ์ ๋ฐฐํฌ๋ฅผ ์งํํด๋ณด๋ ๊ฒ์ ์ฒ์์ด๋ผ ์ฌ๋ฌ ๋ํญ์ ๊ฒช์๋ค. ๊ท์ฐฎ์ ์ผ์ ํ๊ณ ์ถ์ง ์์ CI/CD ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ๋๋ฐ, Docker network ๊ตฌ์กฐ์ ๋ํ ์ดํด๋๊ฐ ๋ถ์กฑํด ๋ง์ ์ด๋ ค์์ ๊ฒช์๋ค.
์ผ๋จ ์๋ฒ๋ฅผ ํ ๋น ๋ฐ์๋ค. ์ฐ๊ตฌ์ค๋ก๋ถํฐ ๋ฐ์ ๊ฒ์ ip address, port, user name, password์๋ค. ๋คํํ๋ ssh๋ก ์ ์ํ๋ ์ ๋๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
# ssh ์ ์ ๋ช
๋ น์ด
ssh {user name}@{ip address} -p {port}
์๋ฒ ํ ๋น ํ ๋ฐฐํฌ๋ฅผ ์ํด ํ ์์
์ ํฌ๊ฒ 2๊ฐ์ง๋ก ๋๋์๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๊ตฌ์ค์ ์ธ์์ธ๊ณ๊ฐ ์ ๋๋ก ์ด๋ค์ง์ง ์์ ํ๋ฅ ์ด ๋๊ธฐ ๋๋ฌธ์ ํด๋น ๊ณผ์ ์ ๋ฌธ์๋ก ๋จ๊ฒจ์ผ ํ๋ค.
1. DB ์ค์น ๋ฐ ํ ์คํธ
2. CI/CD pipeline ๊ตฌ์ถ
๊ฐ task๋ค์ Github์ issue ๋ก ๋ฑ๋กํด ๊ด๋ฆฌํ๋ค. ์์ธํ ๊ธฐ๋ก์ด ๊ถ๊ธํ๋ค๋ฉด ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ๋ฉด ๋๋ค.


๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐฐํฌ๋ docker๋ฅผ ํ์ฉํ๋ค. CI/CD pipeline์ ์ํ workflow ์์ฑ๋ ๋ง์ณค๋ค.(CI/CD pipeline ๊ตฌ์ถ ๋ฐฉ๋ฒ์ ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ๋ฉด ๋๋ค.) ์ฌ์ค workflow ์ ์ฉ ์์ฒด๋ ์ด๋ ต์ง ์์ ๋ฌธ์ ์๋ค. ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋ port๋ฅผ ์ด์ด์ผ ํ๋ค๋ ๊ฒ์ด์๋ค. ์ฌ์ค ๊ทธ ๋ค์๋ ์์ํ๊ฒ ๋ง์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
์ฐ๊ตฌ์ค ์๋ฒ๋ฅผ ํ์ฉํด ๋ฐฐํฌํ๊ธฐ ๋๋ฌธ์ ์๋ฒ์์ ํ์ฉํ ํฌํธ๋ฅผ ์ด์ด์ฃผ๋ ์์
์ ๊ฑฐ์ณ์ผ ํ๋ค. ๋ฌธ์ ๋ ์ด๋ค ์๋ฒ๊ฐ ์ด๋ฆฌ๊ณ ์ด๋ค ์๋ฒ๊ฐ ์ฃฝ์ด๋ ์ ์ด๋ฆฌ๋ ์๋ฒ์ธ๊ฑด์ง ๋ชจ๋ฅธ๋ค๋๊ฑฐ๋ค. ์ด๋ฐ ์ผ์ด ๋ฐ์ํ๋ ์ด์ ๋ ํ๊ต ์๋ฒ ๋ณด์ ๋๋ฌธ์ ๋ผ์ฐํฐ๋ ์ค์์น ๋ ๋ฒจ์์ ๋ฐฉํ๋ฒฝ์ด ๋์ํ๊ธฐ ๋๋ฌธ์ธ๋ฐ ๊ทธ๋ ์ง ์์ ํฌํธ๋ฅผ ์ฐพ์ ํค๋ฉ์ผ ํ๋ค. ์ผ๋ฐ์ ์ผ๋ก๋ 40000๋ฒ ์ด์์ ํฌํธ๋ฅผ ์ด๋ฉด ์ ๋์ํ๋ค. ๊ทธ๋์ ์ด์ด์ฃผ๋ ค ํ๋๋ root๊ถํ์ด ์์ด์ ์๋๋ค๋ ์ค๋ฅ ๋ฉ์ธ์ง๊ฐ ๋ด๋ค. ๋ฐ๋ผ์ root ๊ถํ๋ถํฐ ๋ถ์ฌํ๊ณ ํฌํธ๋ฅผ ์ด์ด์คฌ๋ค.
log๋ฅผ JSON ํํ๋ก ์ ์ฅํ๊ธฐ ์ํด NoSQL์ธ MongoDB๋ฅผ ์ฌ์ฉํ๋๋ฐ, local ํ๊ฒฝ์์๋ docker๋ก ์ค์นํ๊ณ ์ ์ฌ์ฉํ๋ MongoDB๊ฐ ์ด์ํ๊ฒ๋ ๋ฐฐํฌ ํ๊ฒฝ์์๋ container ์คํ์ด ๋์ง ์์๋ค. ๊ทธ๋์ apt-get install๋ก MongoDB๋ฅผ ์ค์นํ๊ณ ์คํ์์ผฐ๋๋ฐ Spring ์๋ฒ์์ DB๋ฅผ ์ฐพ์ง ๋ชปํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
์ผ๋ฐ ์ฌ์ฉ์์๊ฒ root ๊ถํ์ ๋ถ์ฌํ๊ธฐ ์ํด์๋ root ๊ณ์ ์ด ํ์ํ๋ค. ์ฐ๊ตฌ์ค์ ์ฐ๋ฝํด์ ๋ฏธ๋ฆฌ root ๊ณ์ ์ ๋ณด๋ฅผ ๋ฐ์ ๋ก๊ทธ์ธ ํ ์งํํ๋ค.
# root ๊ณ์ ์ผ๋ก ssh ์ ์
ssh root@{ip address} -p {port}
root ๊ถํ ๋ถ์ฌ๋ฅผ ์ํด์๋ /etc/sudoers๋ฅผ ์์ ํ๋ฉด ๋๋ค. ๋จผ์ sudoers ํ์ผ์ ๊ถํ์ ์ค์ ํ๊ณ , vi๋ก ์์ ํด์คฌ๋ค.
# sudoers ํ์ผ ๊ถํ ํ์ธ
ls -al /etc/sudoers
# ๊ถํ ๋ณ๊ฒฝ
chmod +w /etc/sudoers
# sudoers ์ด๊ณ ์์
vi /etc/sudoers
# /etc/sudoer file root ์๋์ ์ฌ์ฉ์ ์ถ๊ฐ
{user id} ALL=(ALL) ALL
user id๊ฐ zero์ธ ๊ฒฝ์ฐ zero ALL=(ALL) ALL๋ก ์์ ํ๋ฉด ๋๋ค. ๋ชจ๋ ์์
์ ์๋ฃํ๊ณ sudoers ํ์ผ์ w๊ถํ์ ์์๋ณต๊ตฌํด์ผ ํ๋ค.
# sudoer ํ์ผ ๊ถํ ์์ ๋ณต๊ตฌ
chmod -w /etc/sudoers
๋ฃจํธ ๊ณ์ ์์ ๋ก๊ทธ์์ํ๊ณ ํ ๋น ๋ฐ์๋ ๊ณ์ ์ผ๋ก ๋ค์ ๋ก๊ทธ์ธํด iptables ๋ช
๋ น์ด๋ก ํฌํธ๋ฅผ ์ด์ด์คฌ๋ค. ์๋๋ iptables ๋ช
๋ น์ด ์ค ์ฌ์ฉ ๋น๋๊ฐ ๋์ ๊ฒ๋ค์ด๋ค. ์ด ์ผ์ด์ค์ ๊ฒฝ์ฐ, OUTPUT์ ๋ชจ๋ ์ด์ด์ค๋ ๋ฌธ์ ๊ฐ ๋์ง ์์ ์ ์ฒด ํฌํธ๋ฅผ ๋ค ์ด์ด์คฌ๋ค.
# iptables ๋ชฉ๋ก ์ถ๋ ฅ
sudo iptables -nL
# iptables ํน์ ํฌํธ INPUT ์ ๊ทผ ํ์ฉ
sudo iptables -I INPUT 1 -p tcp --dport {port} -j ACCEPT
# iptables ์ ์ฒด ํฌํธ OUPUT ์ ๊ทผ ํ์ฉ
sudo iptables -P OUTPUT ACCEPT
# iptables ํน์ ํฌํธ ์ ๊ทผ ํ์ฉ ๋ค์ ์ฐจ๋จ
sudo iptables -D INPUT -p tcp --dport {port} -j ACCEPT
network option ์ค์ DB ์ฐ๊ฒฐ ๋ฌธ์ ๋ ๋์ ๋ฌด์ง๋ก๋ถํฐ ๋น๋กฏ๋ ๊ฒ์ด์๋ค. Spring ์๋ฒ์์ deploy profile์ ๋ณ๋๋ก ์ค์ ํด์ฃผ์๋๋ฐ, ์ด๋ ์๋์ ๊ฐ๋ค. ์ฌ์ค ๋ด์ฉ๋ง ๋๊ณ ๋ณด๋ฉด local profile๊ณผ ๋์ผํ์ง๋ง, ์ฐจํ ํ๊ฒฝ์ด ๋ณ๊ฒฝ๋ ๊ฒ์ ๋๋นํด profile๋ก ๋ถ๋ฆฌํ๋ค.
# application-deploy.yml
spring:
config:
activate:
on-profile: deploy
data:
mongodb:
# ์ฐจํ ๋ฐฐํฌ ํ๊ฒฝ์ด ๋ณ๊ฒฝ๋ ์ ์์
uri: mongodb://localhost:27017/lingo-db
์ ์ฝ๋์์ data.mongodb.uri๊ฐ localhost๋ก ์ค์ ๋์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์๋๋ฐ, ์์ธ์ Docker network ๊ตฌ์กฐ์ ๋ํด ๋ฌด์งํ๋ค๋ ๊ฒ์ด๋ค. ๋ ์ ํํ ๋งํ์๋ฉด MongoDB์ uri๋ฅผ localhost๋ก ์ค์ ํ๊ธฐ ๋๋ฌธ์ Spring ์๋ฒ ์
์ฅ์์๋ ์์ ์ ip ์ฃผ์์์ MongoDB๋ฅผ ์ฐพ์ง๋ง ์ค์ ๋ก localhost์๋ MongoDB๊ฐ ์๋ค. ์๋ฒ ์
์ฅ์์ localhost๋ docker์์ ์ ๊ณตํ๋ ๊ฐ์ ๋คํธ์ํฌ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ ์์ธํ ๋ด์ฉ์ ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ๋ฉด ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋น๋๋ SpringApplication์ Docker๋ก ์คํ ์ ๋์ปค๊ฐ ์ ๊ณตํ๋ ๊ฐ์ ๋คํธ์ํฌ(veth)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ผ ์ง์ host ๋คํธ์ํฌ์ ๋ถ์ฌ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
# network option ์ ์ฉ
docker run --name {name} --network=host -d {image}
์ ์ฝ๋์ฒ๋ผ --network=host๋ฅผ ์ ์ฉํ๋ฉด ์ง์ host์ ์ฐ๊ฒฐ๋ผ ์์ํ๋๋ก ๋์ํ๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค. ํด๋น ์ต์
์ด ๋ชจ๋ ๋ฐฐํฌ ๊ณผ์ ์์ ์ ์ฉ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ Github worlflow์ main.yml์๋ ์ ์ฉํด์ฃผ์๋ค. ๊ทธ๋ฆฌ๊ณ workflow๋ฅผ ์ฌ์คํํด ๋ฐฐํฌ ๊ณผ์ ์ ์ ์ฉ๋๋ ๊ฒ์ ํ์ธํ๋ค. test api๋ฅผ ์ ์กํด DB์ ์ ๋๋ก ์ ์ฅ๋๋ ๊ฒ์ ํ์ธํ๊ณ ์ฝ๋๋ฅผ mergeํด ๋ชจ๋ ์์
์ ๋ง์ณค๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ChatGPT์ ๋ด ์ํฉ์ ๋ชจ๋ ์ค๋ช ํด ์ฌ๋ฌ ํด๊ฒฐ์ฑ ์ ๋ฐ์์ง๋ง, ๋ชจ๋ ์ ๋๋ก ๋์ํ์ง ์์๋ค. ์ ํํ ๋งํ๋ฉด ๋๋ ์ ๋ชฐ๋ผ์ GPT์๊ฒ ์ ์ค๋ช ํด์ฃผ์ง ๋ชปํ ๊ฒ ๊ฐ๋ค. ๋ง์ ๋์์ด ๋๋ ๊ฑด ๋ง์ฐ์์คํด์ ๊ตฌ๊ธ๋งํ๋ ๊ฒฐ๊ณผ๋ค์ด์๋ค. ์ญ์ ์ง์ ์ฐพ์๋ณด๊ณ ์ ์ฉํด๋ณด๋ ๊ฒ ์ ์ผ ๋น ๋ฅด๋ค๋ ๊ฑธ ๋๊ผ๋ค.
์ด์ ๊น์ง๋ Docker๋ฅผ ํ์ฉํ๋ ๋ฐ์๋ ํฐ ์ดํด๊ฐ ํ์ํ์ง ์๋ค๊ณ ์๊ฐํ์๋ค. ๊ทธ๋ฐ๋ฐ Docker network์ ๊ฐ์ ๋ก์ง์ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์ด ๋ ๊ณต๋ถ๊ฐ ํ์ํ๋ค๋ ๊ฒ์ ์ ์คํ๊ฒ ๋๊ผ๋ค. ํนํ ์ฟ ๋ฒ๋คํฐ์ค๋ ์นดํ์นด ๊ฐ์ ๊ธฐ์ ์ ํ์ฉํ๊ธฐ ์ํด์๋ ๋ ๊ณต๋ถํด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ๋ค.. ์ปดํจํฐ๋ง ์์ ์์ ๋คํธ์ํฌ์ ๋ํด์ ์ข ๊ณต๋ถํ๋ค๊ณ ์๊ฐํ๋๋ฐ, ์ ๋ง ๋จผ์ง๋งํผ ์๋๊ตฌ๋ ์ถ์๋ค.
์ค๋ ์์ ํด๊ฒฐํ๋ ๊ฒ์ด ๋ชฉํ์๋๋ฐ, ํด๋ด๊ณ trouble shooting ๋ฌธ์๊น์ง ๋ค ์์ฑํ๊ฑธ ๋ณด๋ ๋์์ง ์์ ๋ฑ๊ฐ๊ตํ์ธ ๊ฒ ๊ฐ๋ค. ํนํ ๋ฌธ์ ์ํฉ์ ๋ํด ๋์ฒํ๋ฉด์ ๋ง์ด ๋ฐ์ ํ๋ ๊ฒ ๊ฐ๋ค. ๋ค์์ ๋น์ทํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋๋ ๋ ๋น ๋ฅด๊ฒ ํด๊ฒฐํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋ค.