์š”์•ฝ

  • ์ธํ”„๋ผ ํ™˜๊ฒฝ ๊ตฌ์ถ•: ๋จผ์ € ์•ˆ์ •์ ์ธ ์„œ๋ฒ„ ์šด์šฉ์„ ์œ„ํ•ด ๊ณ ์ • IP๋ฅผ ํ™•๋ณดํ•˜๊ณ  VCN ๋ณด์•ˆ ๋ชฉ๋ก์—์„œ SSH(22), Airflow(8080), DB(5432) ํฌํŠธ๋ฅผ ๊ฐœ๋ฐฉํ•˜์—ฌ ๋„คํŠธ์›Œํฌ ๊ธฐ์ดˆ๋ฅผ ๋งˆ๋ จํ•ฉ๋‹ˆ๋‹ค. ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์‹œ์—๋Š” ์ดˆ๊ธฐํ™” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด OS ๋ฐฉํ™”๋ฒฝ์„ ์ž๋™์œผ๋กœ ํ•ด์ œํ•˜์—ฌ ์ ‘์† ํƒ€์ž„์•„์›ƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ์ƒ์„ฑ ํ›„ VNIC ์„ค์ •์„ ํ†ตํ•ด ๊ณ ์ • IP๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์ ‘์† ํ™˜๊ฒฝ์„ ์™„์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์†Œํ”„ํŠธ์›จ์–ด ๋ฐ ์„œ๋น„์Šค ๊ตฌ์ถ•: ์„œ๋ฒ„์˜ ํƒ€์ž„์กด์„ ํ•œ๊ตญ ํ‘œ์ค€์‹œ(KST)๋กœ ๋ณ€๊ฒฝํ•œ ํ›„, ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์˜ ํŽธ์˜์„ฑ๊ณผ ์˜์†์„ฑ์„ ์œ„ํ•ด PostgreSQL์€ ํ˜ธ์ŠคํŠธ ์„œ๋ฒ„์— ์ง์ ‘ ์„ค์น˜ํ•˜๊ณ  ์™ธ๋ถ€ ์ ‘์†์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. Airflow๋Š” ํ™˜๊ฒฝ ๊ฒฉ๋ฆฌ๋ฅผ ์œ„ํ•ด Docker ์ปจํ…Œ์ด๋„ˆ๋กœ ๊ตฌ๋™ํ•˜๋ฉฐ, ๋‹จ์ผ ์„œ๋ฒ„์— ์ตœ์ ํ™”๋œ LocalExecutor๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฐ๋™ ๋ฐ ์ตœ์ ํ™”: Docker ์ปจํ…Œ์ด๋„ˆ(Airflow)๊ฐ€ ํ˜ธ์ŠคํŠธ(PostgreSQL)์— ํšจ์œจ์ ์œผ๋กœ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋„๋ก docker-compose.yaml์— extra_hosts ์„ค์ •์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ ๋…ธ์ถœ ์—†์ด ๋‚ด๋ถ€ ์ฃผ์†Œ์ธ host.docker.internal์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด์•ˆ์„ฑ๊ณผ ๋„คํŠธ์›Œํฌ ์„ฑ๋Šฅ์„ ๋™์‹œ์— ํ™•๋ณดํ•œ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

0. ๋“ค์–ด๊ฐ€๋ฉฐ

์ด์ „ ํฌ์ŠคํŒ…์—์„œ Oracle ์„ ํ†ตํ•ด ๋‚˜๋งŒ์˜ ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜์˜€๋‹ค. (์ฐธ๊ณ : (Oracle Cloud) ๋‚˜๋งŒ์˜ ์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ)

์ด์ œ ํ•˜๋“œ์›จ์–ด(์„œ๋ฒ„)๊ฐ€ ์ค€๋น„๋˜์—ˆ์œผ๋‹ˆ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์˜ฌ๋ฆด ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ ์•„ํ‚คํ…์ฒ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • PostgreSQL: ์„œ๋ฒ„(Host)์— ์ง์ ‘ ์„ค์น˜ (๋ฐ์ดํ„ฐ ์˜์†์„ฑ ๋ฐ ๊ด€๋ฆฌ ์šฉ์ด์„ฑ)
  • Airflow: Docker ์ปจํ…Œ์ด๋„ˆ๋กœ ๊ตฌ๋™ (์„ค์น˜ ๋ณต์žก๋„ ์ œ๊ฑฐ ๋ฐ ํ™˜๊ฒฝ ๊ฒฉ๋ฆฌ)

์ €๋Š” mac์—์„œ termius ๋ผ๋Š” ์•ฑ์„ ์ด์šฉํ•˜์—ฌ, ์„œ๋ฒ„์— ์ ‘์†ํ•ด์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์˜€๋‹ค. Termius ์„ค์น˜

(ํ•ด๋‹น ๋‚ด์šฉ๋„ Gemini Pro์˜ ๋„์›€์„ ๋ฐ›์•˜๋‹ค!)


1. ์„œ๋ฒ„ ๊ธฐ์ดˆ ์„ค์ • (ํƒ€์ž„์กด ๋ณ€๊ฒฝ)

ํด๋ผ์šฐ๋“œ ์„œ๋ฒ„๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ธ๊ณ„ ํ‘œ์ค€์‹œ(UTC)๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๋ฐ Airflow ์Šค์ผ€์ค„๋ง ๋“ฑ์˜ ํŽธ์˜๋ฅผ ์œ„ํ•ด KST(ํ•œ๊ตญ ์‹œ๊ฐ„)๋กœ ๋ณ€๊ฒฝํ•˜์˜€๋‹ค.

# ํŒจํ‚ค์ง€ ์—…๋ฐ์ดํŠธ
sudo apt update && sudo apt upgrade -y
 
# ํ•œ๊ตญ ์‹œ๊ฐ„์œผ๋กœ ๋ณ€๊ฒฝ
sudo timedatectl set-timezone Asia/Seoul
 
# ํ™•์ธ
date  # KST๋ผ๊ณ  ๋‚˜์˜ค๋ฉด ์„ฑ๊ณต

2. PostgreSQL ์„ค์น˜ (Host Install)

Docker๋กœ DB๋ฅผ ๋„์šธ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๋ฐ์ดํ„ฐ์˜ ์•ˆ์ „ํ•œ ๋ณด๊ด€๊ณผ ์™ธ๋ถ€(๋‚ด ๋กœ์ปฌ PC, DataGrip ๋“ฑ) ์ ‘์† ํŽธ์˜๋ฅผ ์œ„ํ•ด ์„œ๋ฒ„์— ์ง์ ‘ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ์‹์„ ์„ ํƒ

2.1 ์„ค์น˜ ๋ฐ ์„ค์ •

# PostgreSQL ์„ค์น˜
sudo apt install postgresql postgresql-contrib -y
 
# ๋ถ€ํŒ… ์‹œ ์ž๋™ ์‹œ์ž‘ ๋“ฑ๋ก ๋ฐ ์‹คํ–‰
sudo systemctl enable postgresql
sudo systemctl start postgresql

2.2 ์™ธ๋ถ€ ์ ‘์† ํ—ˆ์šฉ (์ค‘์š”)

๊ธฐ๋ณธ์ ์œผ๋กœ Postgres๋Š” ๋กœ์ปฌ ์ ‘์†๋งŒ ํ—ˆ์šฉํ•˜๋ฏ€๋กœ, ์™ธ๋ถ€ ์ ‘์†์„ ์œ„ํ•ด ๋‘ ๊ฐ€์ง€ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค

1) postgresql.conf ์ˆ˜์ • (๋ชจ๋“  IP์—์„œ ์ ‘์† ํ—ˆ์šฉ)

# ์„ค์ • ํŒŒ์ผ ์—ด๊ธฐ (nano ์—๋””ํ„ฐ ์‚ฌ์šฉ)
sudo nano /etc/postgresql/16/main/postgresql.conf
# (๋ฒ„์ „ 16์ด ์•„๋‹ˆ๋ผ๋ฉด 14, 15 ๋“ฑ ์„ค์น˜๋œ ๋ฒ„์ „ ์ˆซ์ž๋กœ ๊ฒฝ๋กœ ํ™•์ธ ํ•„์š”)
  • Ctrl + W๋ฅผ ๋ˆŒ๋Ÿฌ listen_addresses๋ฅผ ๊ฒ€์ƒ‰
  • ์ฃผ์„(#)์„ ์ œ๊ฑฐํ•˜๊ณ  localhost๋ฅผ *๋กœ ๋ณ€๊ฒฝ
    • AS-IS: #listen_addresses = 'localhost'
    • TO-BE: listen_addresses = '*'
  • Ctrl + O (์ €์žฅ) โ†’ Enter โ†’ Ctrl + X (๋‚˜๊ฐ€๊ธฐ)

2) pg_hba.conf ์ˆ˜์ • (์ธ์ฆ ๋ฐฉ์‹ ์„ค์ •)

sudo nano /etc/postgresql/16/main/pg_hba.conf
  • ํŒŒ์ผ ๋งจ ์•„๋ž˜๋กœ ์ด๋™ํ•ด์„œ ๋‹ค์Œ ์ค„ ์ถ”๊ฐ€ํ•˜์—ฌ, ๋ชจ๋“  IP ์—์„œ ์ ‘์† ํ—ˆ์šฉ
host    all             all             0.0.0.0/0               scram-sha-256

์„œ๋น„์Šค ์žฌ์‹œ์ž‘

sudo systemctl restart postgresql

2.3 DB ๋ฐ ์œ ์ € ์ƒ์„ฑ

ํ”„๋กœ์ ํŠธ์šฉ ์œ ์ €์™€ DB๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

# postgres ๊ด€๋ฆฌ์ž ๊ณ„์ •์œผ๋กœ ์ „ํ™˜
sudo -i -u postgres
 
# SQL ์ ‘์†
psql
CREATE USER myuser WITH PASSWORD 'mypassword123';
 
-- Airflow์šฉ DB ์ƒ์„ฑ
CREATE DATABASE airflow_db;
 
-- ํ”„๋กœ์ ํŠธ ๋ฐ์ดํ„ฐ ์ €์žฅ์šฉ DB ์ƒ์„ฑ
CREATE DATABASE project;
 
-- ๊ถŒํ•œ ๋ถ€์—ฌ
GRANT ALL PRIVILEGES ON DATABASE airflow_db TO myuser;
GRANT ALL PRIVILEGES ON DATABASE project TO myuser;

3. Airflow ์„ค์น˜ (Docker Compose)

Airflow๋Š” ์˜์กด์„ฑ ํŒจํ‚ค์ง€๊ฐ€ ๋งŽ์•„ ์ง์ ‘ ์„ค์น˜(Native Install)ํ•˜๋ฉด ๊ผฌ์ด๊ธฐ ์‰ฌ์›Œ ๊น”๋”ํ•˜๊ฒŒ Docker๋ฅผ ์‚ฌ์šฉ

3.1 Docker ์„ค์น˜

์˜ค๋ผํด A1 ์ธ์Šคํ„ด์Šค๋Š” ARM64 ์•„ํ‚คํ…์ฒ˜์ด์ง€๋งŒ, Docker๋Š” ์ด๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•ด Docker Engine๊ณผ Docker Compose๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

# 1. Docker ํ•„์ˆ˜ ํŒจํ‚ค์ง€ ์„ค์น˜
sudo apt install apt-transport-https ca-certificates curl software-properties-common -y
 
# 2. Docker ๊ณต์‹ GPG ํ‚ค ์ถ”๊ฐ€
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
 
# 3. ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ถ”๊ฐ€ (ARM64 ์•„ํ‚คํ…์ฒ˜ ์ž๋™ ์ธ์‹)
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
 
# 4. Docker Engine ์„ค์น˜
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y
 
# 5. ๊ถŒํ•œ ์„ค์ • (sudo ์—†์ด docker ์“ฐ๊ธฐ ์œ„ํ•จ)
sudo usermod -aG docker $USER
 
# 6. ์ ์šฉ์„ ์œ„ํ•ด ์„ธ์…˜ ์žฌ์ ‘์† ํ•„์š” (exit ํ›„ ๋‹ค์‹œ ์ ‘์†)
exit

3.2 Airflow ์‹คํ–‰ ๋ฐ ์„ค์ •

ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ์— airflow ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ  docker-compose.yaml์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์„ค์ • ํฌ์ธํŠธ๊ฐ€ ๋‘ ๊ฐ€์ง€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ํด๋” ์ƒ์„ฑ ๋ฐ ์ด๋™

cd ~
mkdir airflow
cd airflow
mkdir -p ./dags ./logs ./plugins ./config

docker-compose.yaml ํŒŒ์ผ ์ž‘์„ฑ

Airflow ์‹คํ–‰ ์„ค์ •์„ ๋‹ด์€ ํŒŒ์ผ ์ƒ์„ฑ ํ›„, ๋‚ด์šฉ ๋ถ™์—ฌ๋„ฃ๊ธฐ (ํ˜ธ์ŠคํŠธ DB(PostgreSQL)์™€์˜ ์—ฐ๊ฒฐ์„ ์œ„ํ•ด extra_hosts ์„ค์ •์„ ํฌํ•จ)

# ํŒŒ์ผ ์ƒ์„ฑ ๋ฐ ํŽธ์ง‘
nano docker-compose.yaml
version: '3.8'
 
x-airflow-common:
  &airflow-common
  image: apache/airflow:2.10.4  # ์ตœ์‹  ๋ฒ„์ „
  environment:
    &airflow-common-env
    AIRFLOW__CORE__EXECUTOR: LocalExecutor  # ๋‹จ์ผ ์„œ๋ฒ„์šฉ ์ตœ์  ๋ชจ๋“œ
    AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow
    AIRFLOW__CORE__FERNET_KEY: ''
    AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION: 'true'
    AIRFLOW__CORE__LOAD_EXAMPLES: 'false'  # ์˜ˆ์ œ DAG ๋„๊ธฐ (๊น”๋”ํ•˜๊ฒŒ)
    AIRFLOW__API__AUTH_BACKEND: 'airflow.api.auth.backend.basic_auth,airflow.api.auth.backend.session'
  volumes:
    - ./dags:/opt/airflow/dags
    - ./logs:/opt/airflow/logs
    - ./plugins:/opt/airflow/plugins
    - ./config:/opt/airflow/config
  user: "${AIRFLOW_UID:-50000}:0"
  depends_on:
    &airflow-common-depends-on
    postgres:
      condition: service_healthy
  # โ˜… ์ค‘์š”: ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ํ˜ธ์ŠคํŠธ(๋‚ด ์„œ๋ฒ„)์˜ DB์— ์ ‘์†ํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ •
  extra_hosts:
    - "host.docker.internal:host-gateway"
 
services:
  # 1. Airflow ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์šฉ ๋‚ด๋ถ€ DB (์‚ฌ์šฉ์ž DB์™€ ๋ถ„๋ฆฌ)
  postgres:
    image: postgres:13
    environment:
      POSTGRES_USER: airflow
      POSTGRES_PASSWORD: airflow
      POSTGRES_DB: airflow
    volumes:
      - postgres-db-volume:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "airflow"]
      interval: 5s
      retries: 5
    restart: always
 
  # 2. Airflow ์›น ์„œ๋ฒ„ (UI)
  airflow-webserver:
    <<: *airflow-common
    command: webserver
    ports:
      - "8080:8080"
    healthcheck:
      test: ["CMD", "curl", "--fail", "http://localhost:8080/health"]
      interval: 10s
      timeout: 10s
      retries: 5
    restart: always
 
  # 3. Airflow ์Šค์ผ€์ค„๋Ÿฌ (์ž‘์—… ๊ด€๋ฆฌ)
  airflow-scheduler:
    <<: *airflow-common
    command: scheduler
    healthcheck:
      test: ["CMD", "curl", "--fail", "http://localhost:8974/health"]
      interval: 30s
      timeout: 10s
      retries: 5
    restart: always
 
  # 4. ์ดˆ๊ธฐํ™” ์ปจํ…Œ์ด๋„ˆ (์ตœ์ดˆ 1ํšŒ ์‹คํ–‰ ํ›„ ์ข…๋ฃŒ๋จ)
  airflow-init:
    <<: *airflow-common
    command: version
    environment:
      <<: *airflow-common-env
      _AIRFLOW_DB_UPGRADE: 'true'
      _AIRFLOW_WWW_USER_CREATE: 'true'
      _AIRFLOW_WWW_USER_USERNAME: ${_AIRFLOW_WWW_USER_USERNAME:-airflow}
      _AIRFLOW_WWW_USER_PASSWORD: ${_AIRFLOW_WWW_USER_PASSWORD:-airflow}
    user: "0:0"
    volumes:
      - ./dags:/opt/airflow/dags
      - ./logs:/opt/airflow/logs
      - ./plugins:/opt/airflow/plugins
 
volumes:
  postgres-db-volume:

Point 1: LocalExecutor ์‚ฌ์šฉ ์ด์œ 

๋ณดํ†ต ์ƒ์šฉ ํ™˜๊ฒฝ์—์„œ๋Š” CeleryExecutor + Redis ์กฐํ•ฉ์„ ์“ฐ์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” ๋‹จ์ผ ์„œ๋ฒ„์—์„œ ๋Œ๋ฆฌ๋Š” ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ๋ถˆํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„๋ฅผ ์ค„์ด๊ณ  ๊ตฌ์„ฑ์„ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋กœ์ปฌ์—์„œ ๋ฐ”๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” LocalExecutor๊ฐ€ ๊ฐ€์žฅ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

environment:
  AIRFLOW__CORE__EXECUTOR: LocalExecutor

Point 2: extra_hosts ์„ค์ • (Linux Docker ํ•„์ˆ˜)

Docker ์ปจํ…Œ์ด๋„ˆ(Airflow) ์•ˆ์—์„œ ๋‚ด ์„œ๋ฒ„(Postgres)๋ฅผ host.docker.internal์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ถ€๋ฅด๊ธฐ ์œ„ํ•œ ์„ค์ •์ž…๋‹ˆ๋‹ค. (Mac/Windows Docker์™€ ๋‹ฌ๋ฆฌ ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” ์ด ์„ค์ •์„ ์ง์ ‘ ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค.

extra_hosts:
  - "host.docker.internal:host-gateway"

ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • ๋ฐ ์ดˆ๊ธฐํ™”

ํ˜„์žฌ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์„ Docker์— ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด .env ํŒŒ์ผ์„ ์ƒ์„ฑ

echo "AIRFLOW_UID=$(id -u)" > .env

์ตœ์ดˆ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•ด์ค๋‹ˆ๋‹ค. airflow-init ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋๋‹ค๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ข…๋ฃŒ(exited with code 0)๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

# ์ดˆ๊ธฐํ™”
docker compose up airflow-init
 
# ์‹คํ–‰
docker compose up -d
 
# ํ™•์ธ
docker compose ps

4. ์›น ์ ‘์† ๋ฐ DB ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ

Airflow ์›น UI(http://๊ณ ์ •IP:8080)์— ์ ‘์†ํ•œ ๋’ค, Admin -> Connections์—์„œ DB ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๊ฐ€์žฅ ๊ณ ๋ฏผ๋˜์—ˆ๋˜ ๋ถ€๋ถ„์ด ๋ฐ”๋กœ Host ์ฃผ์†Œ์˜€์Šต๋‹ˆ๋‹ค.

๋‚ด ์„œ๋ฒ„์— ๊ณ ์ • IP๊ฐ€ ์žˆ๋Š”๋ฐ, ์™œ host.docker.internal ์‚ฌ์šฉ ์ด์œ 

์ด์œ  1: ๋ณด์•ˆ (Security)

  • ๊ณ ์ • IP ์‚ฌ์šฉ ์‹œ: ํŠธ๋ž˜ํ”ฝ์ด ์„œ๋ฒ„ ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ”๋‹ค๊ฐ€ ๋‹ค์‹œ ๊ณต์ธ IP๋ฅผ ํƒ€๊ณ  ๋“ค์–ด์˜ต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋ฐฉํ™”๋ฒฝ(VCN)์—์„œ DB ํฌํŠธ(5432)๋ฅผ ์ „ ์„ธ๊ณ„์— ์—ด์–ด๋‘ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‚ด๋ถ€ ์ฃผ์†Œ ์‚ฌ์šฉ ์‹œ: ํŠธ๋ž˜ํ”ฝ์ด ์™ธ๋ถ€๋กœ ๋‚˜๊ฐ€์ง€ ์•Š๊ณ  ์„œ๋ฒ„ ๋‚ด๋ถ€(Docker Bridge)์—์„œ๋งŒ ๋•๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋ณด์•ˆ์„ ์œ„ํ•ด 5432 ํฌํŠธ๋ฅผ ๋‹ซ์•„๋ฒ„๋ ค๋„ Airflow๋Š” ์—ฌ์ „ํžˆ DB์— ์ ‘์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์œ  2: ํšจ์œจ์„ฑ (Performance)

  • ๋ฐฉ๋ฌธ์„ ์—ด๊ณ  ๋ฐ”๋กœ ์˜†๋ฐฉ(๋‚ด๋ถ€ ํ†ต์‹ )์œผ๋กœ ๊ฐ€๋Š” ๊ฒƒ๊ณผ, ํ˜„๊ด€๋ฌธ์„ ๋‚˜๊ฐ€์„œ ์ „ํ™”๋ฅผ ๊ฑธ์–ด ๋ถ€๋ฅด๋Š” ๊ฒƒ(์™ธ๋ถ€ ํ†ต์‹ )์˜ ์ฐจ์ด์ž…๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ํ†ต์‹ ์ด ๋„คํŠธ์›Œํฌ ์ง€์—ฐ(Latency) ์—†์ด ํ›จ์”ฌ ๋น ๋ฅด๊ณ  ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค.

์ตœ์ข… ์—ฐ๊ฒฐ ์„ค์ •

  • Conn Id: ์‚ฌ์šฉ์ž์„ค์ •
  • Conn Type: Postgres
  • Host: host.docker.internal
  • Database: project
  • Login/Password: (์„ค์ •ํ•œ ๊ณ„์ • ์ •๋ณด)