Airflow๋ฅผ Docker๋ก ์ด์ํ๋ฉด์ ์์ฃผ ๋ง์ฃผ์น๋ ์ด์๋ฅผ ์ ๋ฆฌ
โ ๋ฌธ์ 1 โ .env ํ์ผ์ด Airflow ์ปจํ ์ด๋ ์์์ ์ ๋ณด์ธ๋ค
๐ ์ฆ์ ์์ฝ
.env
ํ์ผ์ ํ๋ก์ ํธ ๋ฃจํธ์ ์กด์ฌ.- ํ์ง๋ง Airflow ์ปจํ
์ด๋ ์์์๋
load_dotenv()
๊ฐ ์ฝ์ง ๋ชปํจ. - ์ด์ :
- Docker๋
.env
ํ์ผ์ ํ๊ฒฝ๋ณ์๋ก ๋ณํํด ๋๊ธฐ๊ธด ํ์ง๋ง, - ํ์ผ ์์ฒด๋ฅผ ์ปจํ ์ด๋ ๋ด๋ถ๋ก ๋ณต์ฌํ๊ฑฐ๋ mountํ์ง ์๋๋ค.
- ๊ฒฐ๊ตญ
load_dotenv()
๊ฐ ์ฐพ์ ํ์ผ์ด ์์.
- Docker๋
โ ํด๊ฒฐ๋ฒ
1๏ธโฃ docker-compose.yml์ volume mount ์ถ๊ฐ
services:
airflow:
...
volumes:
- ./dags:/opt/airflow/dags
- ./.env:/opt/airflow/dags/.env # โ
์ด ์ค ์ถ๊ฐ
์ด๋ ๊ฒ ํ๋ฉด .env ํ์ผ์ด Airflow ์ปจํ ์ด๋ ์์ /opt/airflow/dags/.env ๊ฒฝ๋ก๋ก ๋ณต์ฌ๋๋ค.
2๏ธโฃ DAG ์ฝ๋์์ ์ ํํ ๊ฒฝ๋ก๋ก load_dotenv()
์์น๋ฅผ ์จ์ค์ผํ๋ค
from dotenv import load_dotenv
load_dotenv(dotenv_path="/opt/airflow/dags/.env")
์ด์ DAG ์คํฌ๋ฆฝํธ๊ฐ ์ปจํ ์ด๋ ๋ด๋ถ์ .env ํ์ผ์ ์ ์์ ์ผ๋ก ์ฝ์ด์จ๋ค.
3๏ธโฃ ์ปจํ ์ด๋ ์ฌ์์ ํ์
docker compose down
docker compose up --build
โ ๋ฌธ์ 2 โ AWS Credentials ์ฐ๋
์ต์
1: .env์ ์๊ฒฉ์ฆ๋ช
์ถ๊ฐ
.env ํ์ผ์:
AWS_ACCESS_KEY_ID=your-access-key-id
AWS_SECRET_ACCESS_KEY=your-secret-access-key
boto3๋ ํ๊ฒฝ๋ณ์์์ ์๋์ผ๋ก ์๊ฒฉ์ฆ๋ช ์ ๊ฐ์ ธ์จ๋ค:
import boto3
import os
from dotenv import load_dotenv
load_dotenv(dotenv_path="/opt/airflow/dags/.env")
s3 = boto3.client("s3") # ํค๋ฅผ ๋ฐ๋ก ๋๊ธธ ํ์ ์์
์ต์ 2: IAM Role์ด๋ ๋ค๋ฅธ ๋ฐฉ์๋ ๊ฐ๋ฅ (์ฌ๊ธฐ์ ์๋ต)
โ ๋ฌธ์ 3 โ boto3 ๋๋ ํ ๋ฆฌ ๋ฌธ์
boto3์ download_file() ์ฌ์ฉํ ๋๋ ๋ก์ปฌ ๋๋ ํ ๋ฆฌ๊ฐ ๋จผ์ ์กด์ฌํด์ผ ํจ.
os.makedirs(os.path.dirname(LOCAL_FILE_PATH), exist_ok=True)
์ด๋ ๊ฒ ๋ฏธ๋ฆฌ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ง๋ค์ด์ฃผ๋ฉด ๋๋ ํ ๋ฆฌ ์์ ์ค๋ฅ ๋ฐฉ์ง ๊ฐ๋ฅ.
โ ๋ฌธ์ 4 โ Airflow Metadata Database์ Local Files ๊ตฌ๋ถ
Airflow์ metadata database (Postgres)๋ ์ ์์ ์ผ๋ก ์ปจํ ์ด๋ ์์์ ์ ๋์๊ฐ โ ์ด๊ฑด docker-compose๋ก ์ด๋ฏธ ์ ์ธํ ๋์ด ์์.
ํ์ง๋ง Airflow ์ปจํ ์ด๋ ๋ด๋ถ์๋ DB ์ธ์๋ local file๋ค์ด ํ์.
๋ฐ์ดํฐ ์ข ๋ฅ | ์ ์ฅ ๊ฒฝ๋ก | ์ค๋ช |
---|---|---|
๋ก๊ทธ | /opt/airflow/logs |
task ์คํ ๋ก๊ทธ |
DAG ์คํฌ๋ฆฝํธ | /opt/airflow/dags |
DAG ์ฝ๋ |
์ค์ ๋ฐ ํ์ฅ | /opt/airflow/plugins , airflow.cfg , webserver_config.py |
์ค์ ๋ฐ ํ์ฅ ๊ธฐ๋ฅ |
๐ฌ ํต์ฌ ๋ฌธ์ ์ ์ง์ง ์์ธ
- metadata DB (Postgres)๋ ์ ์์ ์ผ๋ก ์๋ ์ค.
- ํ์ง๋ง
airflow webserver
๊ฐ ๋ด๋ถ ํด๋ (์:/opt/airflow/logs/
) ์์ฑ์ ์๋ํ ๋ โ volume mount๊ฐ ์ ๋์ด ์์ด ์คํจ. - ์ด๋ก ์ธํด ๋ง์น
airflow db init
์ด ์คํจํ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ์ฐฉ์ ํ์์ด ๋ฐ์.
ํด๊ฒฐ๋ฒ โ logs volume mount ์ถ๊ฐ
docker-compose.yml ์์ :
services:
airflow:
...
volumes:
- ./dags:/opt/airflow/dags
- ./logs:/opt/airflow/logs # โ
์ด ์ค ์ถ๊ฐ
์ด๋ ๊ฒ ํ๋ฉด webserver๊ฐ ์ ์์ ์ผ๋ก ๋ก๊ทธ ํด๋์ ์ ๊ทผ ๊ฐ๋ฅ โ task ์คํ๊ณผ UI ๋ชจ๋ ์ ์ ๋์.
๐ฅ ์ต์ข ์์ฝ
- metadata DB์ local files๋ ์์ ํ ๋ณ๊ฐ์ ์์ญ์ด๋ค.
- local files (logs, dags, plugins)๋ ์ปจํ ์ด๋ ๋ด๋ถ์ volume mount๊ฐ ํ์ํ๋ค.
- .env ํ์ผ๋ volume์ผ๋ก ๋ช ์์ ์ผ๋ก mountํ๊ณ load_dotenv()์์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํด์ผ ํ๋ค.
- logs volume์ mountํ์ง ์์ผ๋ฉด webserver๊ฐ ๋ด๋ถ ์ค๋ฅ๋ก ์ค๋จ๋ ์ ์๋ค.