
๐ ๋ค์ด๊ฐ๋ฉฐ
์๋ ํ์ธ์! ์ด๋ฒ ๊ธ์์๋ ์์ด๋ ๊ตฟ์ฆ ์ค๊ณ ๊ฑฐ๋ ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๋ฉด์ ๊ตฌ์ถํ Oracle Cloud Infrastructure(OCI) ๊ธฐ๋ฐ์ ์ ์ฒด ์๋ฒ ์ธํ๋ผ๋ฅผ ์๊ฐํด๋๋ฆฌ๋ ค ํฉ๋๋ค.
์ฒ์์๋ AWS๋ฅผ ๊ณ ๋ คํ์ง๋ง, ํ๋ฆฌ ํฐ์ด ์ ํ๊ณผ ๋น์ฉ ๋ฌธ์ ๋ก Oracle Cloud์ Always Free ์ธ์คํด์ค๋ฅผ ์ ํํ์ต๋๋ค. 4 OCPU + 24GB ๋ฉ๋ชจ๋ฆฌ๊น์ง ๋ฌด๋ฃ๋ก ์ฌ์ฉํ ์ ์๋ค๋ ์ ์ด ๊ฐ์ฅ ํฐ ์ด์ ์์ต๋๋ค.
์ด ๊ธ์์ ๋ค๋ฃฐ ๋ด์ฉ์ ์๋์ ๊ฐ์ต๋๋ค.
- ์ ์ฒด ์ธํ๋ผ ๊ตฌ์กฐ (VCN, ์๋ธ๋ท, Active-Standby ์ด์ ์๋ฒ)
- ๋คํธ์ํฌ ๋ณด์ ์ค๊ณ (Security List, NSG, Bastion)
- CI/CD ํ์ดํ๋ผ์ธ (Jenkins ์๋ํ)
- ๋ชจ๋ํฐ๋ง ์คํ ๊ตฌ์ฑ
๐๏ธ 1. ์ ์ฒด ์ธํ๋ผ ๊ตฌ์กฐ ํ๋์ ๋ณด๊ธฐ

์ ์ฒด ์ธํ๋ผ๋ Oracle Cloud ๊ธฐ๋ฐ์ผ๋ก ์ค๊ณํ์ผ๋ฉฐ, ์ญํ ์ ๋ฐ๋ผ ์๋ฒ๋ฅผ ๋ช ํํ ๋ถ๋ฆฌํ์ต๋๋ค.
| ์๋ฒ | ์ญํ | ๊ตฌ๋ ์๋น์ค |
|---|---|---|
| goody-dev-server | ๊ฐ๋ฐ ์๋ฒ | Spring Boot, Redis |
| goody-prod-server-main | ์ด์ ์๋ฒ (Active) | Spring Boot, Redis |
| goody-prod-server-sub | ์ด์ ์๋ฒ (Standby) | Spring Boot, Redis |
| goody-monitoring-server | ๋ชจ๋ํฐ๋ง / CI-CD ์๋ฒ | Jenkins, Prometheus, Grafana, Loki, Tempo |

์ด์ ์๋ฒ๋ Active-Standby ๊ตฌ์กฐ๋ก ๊ตฌ์ฑํ์ต๋๋ค. ํ์์๋ Active ์๋ฒ๋ง ํธ๋ํฝ์ ์ฒ๋ฆฌํ๊ณ , ์ฅ์ ๋ฐ์ ์ OCI ๋ก๋๋ฐธ๋ฐ์์ Backup ๊ธฐ๋ฅ์ ์ํด ์๋์ผ๋ก Standby ์๋ฒ๋ก ํธ๋ํฝ์ด ์ ํ๋ฉ๋๋ค.
Redis๋ ๊ฐ ์๋ฒ์ ๊ฐ๋ณ๋ก ์ค์นํ์ต๋๋ค. ๊ณต์ Redis๋ฅผ ๋๋ฉด ๊ทธ ์์ฒด๊ฐ ๋จ์ผ ์ฅ์ ์ (SPOF)์ด ๋์ด Active-Standby ์ด์คํ์ ๋ชฉ์ ์ ๋ฐํ๊ธฐ ๋๋ฌธ์ ๋๋ค. Redis์ ์ ์ฅํ๋ ๋ฐ์ดํฐ๊ฐ ์บ์ฑ ์ ๋ณด๋ฟ์ด๋ผ ์ฅ์ ์ DB ์ฌ์กฐํ๋ก ์ถฉ๋ถํ ๋ณต๊ตฌ ๊ฐ๋ฅํ๋ฏ๋ก, ๋ณ๋ Redis๋ฅผ ์ด์ฉํด๋ ์๋น์ค ์์ ์ฑ์ ์ํฅ์ด ์์๊ฑฐ๋ผ ํ๋จํ์ฌ ๊ทธ๋ ๊ฒ ๊ตฌ์ฑํ์ต๋๋ค.
์ถ๊ฐ๋ก ๊ฐ๋ฐ/๋ชจ๋ํฐ๋ง ์๋ฒ์ ์ด์ ์๋ฒ๋ ์๋ก ๋ค๋ฅธ VCN์ ์์นํ๊ธฐ ๋๋ฌธ์, ๊ธฐ๋ณธ์ ์ผ๋ก๋ ๋ด๋ถ ํต์ ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. Jenkins(๋ชจ๋ํฐ๋ง ์๋ฒ)์์ ์ด์ ์๋ฒ๋ก ๋ฐฐํฌ๋ฅผ ์ํํ๋ ค๋ฉด ๋ VCN ๊ฐ ์ฐ๊ฒฐ์ด ํ์ํ๋ฉฐ, ์ด๋ฅผ OCI Local Peering Gateway๋ก ํด๊ฒฐํ์ต๋๋ค.
์ฐธ๊ณ ๋ก Local Peering ์ฐ๊ฒฐ์ ์ํด์๋ ๋ VCN์ CIDR ๋์ญ์ด ๊ฒน์น์ง ์์์ผ ํ๋ฉฐ, ์ด ํ๋ก์ ํธ์์๋ ๊ฐ๋ฐ/๋ชจ๋ํฐ๋ง VCN์ 10.0.0.0/16, ์ด์ VCN์ 10.2.0.0/16์ผ๋ก ์ค์ ํด ์ค๋ณต ์์ด ๊ตฌ์ฑํ์ต๋๋ค.
Cross-Tenancy Local Peering ์ค์ ์์ (Local VCN Peering using Local Peering Gateways)
OCI์ VCN Peering์ ๊ตฌ์ฑ์ ๋ฐ๋ผ ๋ฐฉ์์ด ๋ค๋ฆ ๋๋ค.
| ๊ตฌ๋ถ | ๋ฐฉ๋ฒ |
|---|---|
| ๊ฐ์ region, ๊ฐ์ tenancy | LPG๋ง์ผ๋ก ์ฐ๊ฒฐ |
| ๊ฐ์ region, ๋ค๋ฅธ tenancy | LPG + IAM ์ ์ฑ ๋ฌธ (Acceptor/Requestor) |
| ๋ค๋ฅธ region | DRG (Dynamic Routing Gateway) ์ฌ์ฉ |
์ด ํ๋ก์ ํธ๋ ๊ฐ์ region์ด์ง๋ง ์๋ก ๋ค๋ฅธ tenancy์ VCN์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ๋ก, LPG์ IAM ์ ์ฑ ๋ฌธ์ ํจ๊ป ์ค์ ํด์ผ ํฉ๋๋ค.
1. ๊ฐ tenancy์ VCN์ LPG ์์ฑ
2. ๊ฐ tenancy์ IAM ์ ์ฑ ๋ฌธ ์ถ๊ฐ
Requestor ์ธก: ์๋ tenancy์ LPG์ ์ฐ๊ฒฐ ์์ฒญ์ ํ์ฉํ๋ ์ ์ฑ
(๋ด ๊ทธ๋ฃน์ด ์๋ ํ
๋์์ ์ ๊ทผํ๋๋ก ํ์ฉ)

Acceptor ์ธก: ์์ฒญ tenancy์ LPG ์ฐ๊ฒฐ์ ์๋ฝ ํ์ฉํ๋ ์ ์ฑ (์๋ ํ ๋์์ ๊ทธ๋ฃน์ด ๋ด ์ชฝ์ ์ ๊ทผํ๋๋ก ํ์ฉ)

3. Requestor๊ฐ Acceptor์ LPG OCID๋ฅผ ์ ๋ ฅํด ์ฐ๊ฒฐ ์์ฒญ → ์ ์ฑ ๋ฌธ์ด ์ฌ๋ฐ๋ฅด๋ฉด ์๋ ์๋ฝ
4. ๊ฐ VCN ๋ผ์ฐํธ ํ ์ด๋ธ์ ๊ฒฝ๋ก ์ถ๊ฐ
- ๊ฐ๋ฐ VCN ๋ผ์ฐํธ ํ
์ด๋ธ:
10.2.0.0/16→ ๊ฐ๋ฐ VCN์ LPG - ์ด์ VCN ๋ผ์ฐํธ ํ
์ด๋ธ:
10.0.0.0/16→ ์ด์ VCN์ LPG
5. NSG์ ์๋ฐฉํฅ ๋ณด์ ๊ท์น ์ถ๊ฐ
- ๋ชจ๋ํฐ๋ง ์๋ฒ(Jenkins) NSG — ์ก์ (Egress): TCP 22 →
<์ด์ ์๋ฒ private IP>/32ํ์ฉ - ์ด์ ์๋ฒ NSG — ์์ (Ingress): TCP 22 ←
<๋ชจ๋ํฐ๋ง ์๋ฒ private IP>/32ํ์ฉ
์ด ์ค์ ์ผ๋ก Jenkins(๋ชจ๋ํฐ๋ง ์๋ฒ)๊ฐ SSH๋ฅผ ํตํด ์ด์ ์๋ฒ์ ์ง์ ๋ฐฐํฌ ๋ช ๋ น์ ์คํํ ์ ์์ต๋๋ค.
๐ 2. ๋คํธ์ํฌ ๋ณด์ ์ค๊ณ
VCN ๋ฐ ์๋ธ๋ท ๊ตฌ์ฑ
VCN์ CIDR 10.0.0.0/16์ผ๋ก ์ค์ ํ๊ณ , ํผ๋ธ๋ฆญ ์๋ธ๋ท๊ณผ ํ๋ผ์ด๋น ์๋ธ๋ท์ผ๋ก ๋ถ๋ฆฌํ์ต๋๋ค.
| ์๋ธ๋ท | CIDR | ์ญํ |
|---|---|---|
| ํผ๋ธ๋ฆญ ์๋ธ๋ท | 10.0.0.0/24 | ๋ก๋๋ฐธ๋ฐ์, Bastion ์๋ฒ |
| ํ๋ผ์ด๋น ์๋ธ๋ท | 10.0.1.0/24 | API ์๋ฒ, ๋ชจ๋ํฐ๋ง ์๋ฒ |
์ฃผ์ ์๋ฒ๋ค์ ๋ชจ๋ ํ๋ผ์ด๋น ์๋ธ๋ท์ ๋ฐฐ์นํด ์ธ๋ถ์์ ์ง์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋๋ก ํ์ต๋๋ค. ์ธ๋ถ ํธ๋ํฝ์ ๋ฐ๋์ ๋ก๋๋ฐธ๋ฐ์๋ฅผ ํตํด์๋ง ๋ค์ด์ฌ ์ ์์ด์.
Security List vs NSG
OCI์๋ ๋ณด์ ๊ท์น์ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ด ๋ ๊ฐ์ง ์์ต๋๋ค.
- Security List: ์๋ธ๋ท ๋จ์๋ก ์ ์ฉ๋๋ ๋ ๊ฑฐ์ ๋ฐฉ์
- NSG (Network Security Group): ์ธ์คํด์ค ๋จ์๋ก ์ธ๋ถํ๋ ๋ณด์ ์ ์ด
๋ ๊ฐ์ง๋ฅผ ํจ๊ป ์ฌ์ฉํด ์ด์ค ๊ณ์ธต ๋ณด์ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ฑํ์ต๋๋ค. ํธ๋ํฝ์ ๋ ๊ณ์ธต์ ๋ชจ๋ ํต๊ณผํด์ผ ์ธ์คํด์ค์ ๋๋ฌํฉ๋๋ค.
- Security List(์๋ธ๋ท ๋จ์): ํ์ฉํ ํฌํธ ๋ฒ์๋ฅผ 1์ฐจ๋ก ํํฐ๋ง
ํ๋ผ์ด๋น๊ณผ ํผ๋ธ๋ฆญ ์๋ธ๋ท์ ๋๋์ด ์๋ก ๋ค๋ฅธ ๋ณด์๋ชฉ๋ก(Security List) ์ ์ฉ

- NSG(์ธ์คํด์ค ๋จ์): ํน์ IP๋ก ์ ๊ทผ์ ์ถ๊ฐ ์ ํํ๋ 2์ฐจ ์ธ๋ฐ ์ ์ด
๊ฐ ์ธ์คํด์ค ๋ณ๋ก ์๋ก ๋ค๋ฅธ ๋ณด์๊ทธ๋ฃน(NSG) ์ ์ฉ

Bastion ์๋ฒ๋ฅผ ํตํ SSH ์ ๊ทผ

ํ๋ผ์ด๋น ์๋ธ๋ท์ ์๋ฒ๋ค์ ์ธ๋ถ์์ ์ง์ SSH ์ ์์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๋์ ํผ๋ธ๋ฆญ ์๋ธ๋ท์ Bastion ์๋ฒ๋ฅผ ๊ฒฝ์ ํด์๋ง ์ ์ํ ์ ์๋๋ก ์ค๊ณํ์ต๋๋ค.
๋ํ SSH ์ ์ ์ ProxyJump๋ฅผ ์ฌ์ฉํด ํ๋ฒ์ ์ ์ํ๊ธฐ ์ํด ~/.ssh/config ํ์ผ์ ์๋์ ๊ฐ์ด ์ค์ ํด๋์์ต๋๋ค.
# Bastion ์๋ฒ
Host bastion
HostName <Bastion ๊ณต์ธ IP>
User ubuntu
IdentityFile ~/.ssh/goody_server_key
ForwardAgent yes
# ๊ฐ๋ฐ ์๋ฒ (ProxyJump via Bastion)
Host private-server1
HostName <๊ฐ๋ฐ ์๋ฒ private IP>
User ubuntu
IdentityFile ~/.ssh/goody_server_key
ProxyJump bastion
# ๋ชจ๋ํฐ๋ง ์๋ฒ
Host private-server2
HostName <๋ชจ๋ํฐ๋ง ์๋ฒ private IP>
User ubuntu
IdentityFile ~/.ssh/goody_server_key
ProxyJump bastion
์ด ์ค์ ์ผ๋ก ssh private-server1 ๋ช
๋ น๋ง์ผ๋ก Bastion์ ์๋ ๊ฒฝ์ ํด ํ๋ผ์ด๋น ์๋ฒ์ ์ ์ํ ์ ์์ต๋๋ค.
๋ก๋๋ฐธ๋ฐ์ ํฌํธ ๊ตฌ์ฑ
OCI ๋ก๋๋ฐธ๋ฐ์๋ ๋ฆฌ์ค๋(Listener)์ ๋ฐฑ์๋ ์งํฉ(Backend Set)์ 1:1๋ก ๋งคํํ๋ ๊ตฌ์กฐ์ ๋๋ค. ๋ฆฌ์ค๋๋ ์ธ๋ถ์์ ํธ๋ํฝ์ ์์ ํ๋ ํฌํธ๋ฅผ ์ ์ํ๊ณ , ๋ฐฑ์๋ ์งํฉ์ ํธ๋ํฝ์ ์ ๋ฌํ ๋ด๋ถ ์๋ฒ์ ํฌํธ๋ฅผ ์ ์ํฉ๋๋ค.
| ๋ฆฌ์ค๋ ํฌํธ | ๋์ ์๋ฒ : ํฌํธ | ์ฉ๋ |
|---|---|---|
| 8080 | goody-server-001 : 80 (Nginx) | API ์๋ฒ |
| 8888 | goody-server-002 : 8080 | Jenkins |
| 3000 | goody-server-002 : 3000 | Grafana |
| 5601 | goody-server-002 : 5601 | Kibana |
| 9200 | goody-server-002 : 9200 | Elasticsearch |
์ธ๋ถ์์๋ ๋ก๋๋ฐธ๋ฐ์์ ๊ณต์ธ IP + ํฌํธ๋ก ์ ๊ทผํ๊ณ , ๋ก๋๋ฐธ๋ฐ์๊ฐ ๋ด๋ถ ์๋ฒ๋ก ํธ๋ํฝ์ ์ ๋ฌํ๋ ๊ตฌ์กฐ์ ๋๋ค.
๐ 3. CI/CD ํ์ดํ๋ผ์ธ
GitHub์ ์ฝ๋๋ฅผ Pushํ๋ฉด GitHub Webhook์ ํตํด Jenkins Pipeline์ด ์๋์ผ๋ก ์คํ๋ฉ๋๋ค.
GitHub Push → GitHub Webhook → Jenkins Pipeline ์๋ ์คํ → JAR ๋น๋ → Docker Image ๋น๋ → ์๋ฒ ๋ฐฐํฌ
main๋ธ๋์น์ dev๋ธ๋์น์ ๋จธ์ง๊ฐ ๋๋ฉด ๊ฐ๊ฐ prod์๋ฒ์ dev์๋ฒ๋ก ๋ฐฐํฌ๊ฐ ๋๋๋ก ์ค์ ํ์ผ๋ฉฐ, ๋น๋๋ถํฐ ๋ฐฐํฌ๊น์ง ์ ๊ณผ์ ์ Jenkins๋ก ์๋ํํ์ต๋๋ค.
๐ 4. ๋ชจ๋ํฐ๋ง ์คํ
๋ชจ๋ํฐ๋ง์ ์์คํ ๋ชจ๋ํฐ๋ง๊ณผ ์ฌ์ฉ์ ๋ก๊ทธ ๋ถ์ ๋ ๊ฐ์ง ๋ชฉ์ ์ผ๋ก ๊ตฌ๋ถํ์ฌ ๊ตฌ์ฑํ์ต๋๋ค.

- ์์คํ ๋ชจ๋ํฐ๋ง: ๊ฐ ์๋ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด OpenTelemetry Protocol๋ก ๋ฉํธ๋ฆญ/๋ก๊ทธ/ํธ๋ ์ด์ค๋ฅผ ์ ์กํ๋ฉด, ๋ชจ๋ํฐ๋ง ์๋ฒ์ Prometheus + Grafana Loki + Grafana Tempo + Grafana ์คํ์์ ์์ง·์๊ฐํํฉ๋๋ค. ์ด์ ๊ฐ์ง ์ Slack ์๋ฆผ์ด ์๋์ผ๋ก ๋ฐ์ก๋ฉ๋๋ค.
- ์ฌ์ฉ์ ๋ก๊ทธ ๋ถ์: ์ ํ๋ฆฌ์ผ์ด์ ๋ก๊ทธ๋ฅผ Filebeat๋ก ์์งํด Elasticsearch์ ์ ์ฅํ๊ณ , Kibana๋ก ์๊ฐํํ์ฌ ๋ถ์ํฉ๋๋ค.
๐ 5. ๋ง๋ฌด๋ฆฌ — ํ๊ณ & ๊ฐ์ ์
์ด๋ฒ ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ๋ฉด์ ๊ฐ์ฅ ์ด๋ ค์ ๋ ๋ถ๋ถ์ OCI์ ๋ณด์ ์ ์ฑ ์ค์ ์ด์์ต๋๋ค. AWS์ ๋ฌ๋ฆฌ Security List์ NSG๊ฐ ๋ฐ๋ก ์กด์ฌํ๊ณ , ๋ ๋ค ํต๊ณผํด์ผ ํธ๋ํฝ์ด ๋ค์ด์ฌ ์ ์์ด์ ์ด๋ฐ์ ํฌํธ๊ฐ ์ ์ด๋ฆฌ๋ ๋ฌธ์ ๋ก ํ์ฐธ ํค๋งธ์ด์.
ํนํ Security List์ NSG ๊ท์น์ ๋ชจ๋ ์ฌ๋ฐ๋ฅด๊ฒ ์ถ๊ฐํ๋๋ฐ๋ ์ ๊ทผ์ด ์ ๋๋ ๊ฒฝ์ฐ๊ฐ ์์๋๋ฐ, ์์ธ์ ์ธ์คํด์ค OS ๋ ๋ฒจ์ iptables ๊ท์น์ด์์ต๋๋ค. OCI ๋คํธ์ํฌ ๊ท์น์ ๋ชจ๋ ํต๊ณผํ๋๋ผ๋ OS ๋ฐฉํ๋ฒฝ์์ ํ ๋ฒ ๋ ์ฐจ๋จ๋ ์ ์๋ค๋ ์ ์ ์ฒ์์๋ ๋ชฐ๋์ ์์ธ ํ์
์ ์๊ฐ์ด ๊ฝค ๊ฑธ๋ ธ์ต๋๋ค.
ํ์ฌ ํ๊ณ ๋ฐ ๊ฐ์ ์์ ์ฌํญ
- NSG ์ผ๋ถ ํฌํธ (Jenkins, Grafana, Kibana ์ ๊ทผ ํฌํธ)๋ฅผ ํ์ฌ
0.0.0.0/0์ผ๋ก ์ด์ด๋ ์ํ → IP ์ ํ์ผ๋ก ์์ ์์