iT邦幫忙

2024 iThome 鐵人賽

DAY 28
0
DevOps

我獨自升級:從水管工走向 DataOps系列 第 28

【Day 28】Data Pipeline MVP 環境實戰 - .env 和 docker-compose.override.yml

  • 分享至 

  • xImage
  •  

前言

這兩天內容會根據實際的專案架構和環境切分來說明,這些都只是我個人的使用方法,不代表適用所有datapipeline 專案,如果有更好的方式和工具也可以推薦給我~/images/emoticon/emoticon07.gif

今日專案連結

專案架構

{Data Pipeline MVP}
├── Dockerfile
├── Makefile
├── buildspec_deploy.yml
├── buildspec_test.yml
├── dags
│   └── simple_task_group.py
├── dbt
│   └── jaffle_shop
│   │   └── .sqlfluff
├── docker-compose.override.yml
├── docker-compose.yaml
├── fabfile.py
├── logs
├── plugins
├── requirements.txt
├── ruff.toml
├── tests
│   ├── dags
│   └── data
└── venv
  • Dockerfile: 定義了用在建立 Airflow 容器 Image 的內容。
  • Makefile: 用於簡化常用指令,例如建立環境、測試、部署等。
  • buildspec_deploy.ymlbuildspec_test.yml: 這些是用於 CI/CD 當中 AWS CodeBuild 的設定,分別用於部署和測試流程。
  • dags/: 存放 Airflow DAG 文件的目錄
  • dbt/: 包含 dbt 專案文件。jaffle_shop 就是是之前示範的 dbt 專案,代表可以同時管理多個 dbt 專案。
  • docker-compose.override.ymldocker-compose.yaml: Docker Compose 設定文件,用於定義和管理多容器 Docker 應用。
  • fabfile.py: Fabric 模組的設定 py 檔,用於自動化部署和管理任務。
  • logs/: 儲存 Airflow 紀錄的目錄。
  • plugins/: 用於存放自定義 Airflow 插件的目錄。
  • requirements.txt: 列出專案的 Python 所需模組。
  • ruff.toml: Python linter Ruff 的設定文件。
  • tests/: 包含測試文件的目錄,分為 DAG 測試和數據測試。
  • venv/: Python 虛擬環境目錄,用於執行測試專案。

.env 區分環境變數

將 docker environment 的參數搬到 .env,方便後續可以區分 localdevstagingproductionmain做區分,到底要分為幾個環境和設定,主要依照各團隊不同的開發流程和習慣,通常最基本會有兩個,至少不太可能直接在 server 上開發吧~/images/emoticon/emoticon10.gif

# Airflow Core
AIRFLOW__CORE__FERNET_KEY=''
AIRFLOW__CORE__EXECUTOR=CeleryExecutor
AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION=True
AIRFLOW__CORE__LOAD_EXAMPLES=False
AIRFLOW_UID=50000
AIRFLOW_GID=0

# Airflow Metadata DB
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=postgresql+psycopg2://airflow:airflow@postgres/airflow
AIRFLOW__CELERY__RESULT_BACKEND=db+postgresql://airflow:airflow@postgres/airflow
AIRFLOW__API__AUTH_BACKENDS=airflow.api.auth.backend.basic_auth,airflow.api.auth.backend.session
AIRFLOW__CELERY__BROKER_URL=redis://:@redis:6379/0
AIRFLOW__SCHEDULER__ENABLE_HEALTH_CHECK=True

# Airflow Init
_AIRFLOW_DB_MIGRATE=True
_AIRFLOW_WWW_USER_CREATE=True
_AIRFLOW_WWW_USER_USERNAME=airflow
_AIRFLOW_WWW_USER_PASSWORD=airflow

# Airflow Connection
AIRFLOW_CONN_AIRFLOW_METADATA_DB=postgresql+psycopg2://airflow:airflow@postgres:5432/airflow

# Airflow Worker
DUMB_INIT_SETSID=0

# Airflow Cli
CONNECTION_CHECK_MAX_COUNT=0

# dbt
DBT_THREADS=1
DBT_HOST=localhost
DBT_POST=5432
DBT_USER=airflow
DBT_PWD=airflow
DBT_DBNAME=airflow
DBT_SCHEMA=dbt

上方大部分都是本來 docker-compose.yml 的設定,比較特別需要注意的有兩個地方,# Airflow Connection#dbt 區塊:

  • # Airflow Connection:設定之後可以不用到 Web UI 設定就能連接,服務清空重啟也不用重新設定連接,設定方式就是將之後要用的 conn_id 放在 AIRFLOW_CONN 後面,像是這樣AIRFLOW_CONN_{conn_id}
  • #dbt:將在 profile.yml 使用的內容另外放到環境變數,本地、測試、正式就可以直接加在 .env 當中,而且要記得 profile.yml 要修改成下方:
airflow_db:
  outputs:
    dev:
      type: postgres
      threads: '{{env_var("DBT_THREADS")}}'
      host: '{{env_var("DBT_HOST")}}'
      port: '{{env_var("DBT_POST")}}'
      user: '{{env_var("DBT_USER")}}'
      pass: '{{env_var("DBT_PWD")}}'
      dbname: '{{env_var("DBT_DBNAME")}}'
      schema: '{{env_var("DBT_SCHEMA")}}'
  target: dev

之前將 '{{env_var("DBT_SCHEMA")}}' 的寫法改成 "{{env_var('DBT_SCHEMA')}",結果竟然就會無法抓到,到現在還是很困惑,是原始碼雙引號和單引號不通用嗎、還是分析樹沒寫好/images/emoticon/emoticon13.gif

docker-compose.override.yml 區分環境服務

docker override 可以當作是 docker-compose.yml 的擴充,所以通常會設定基本的基礎服務在 docker-compose.yml,另外在將每個環境需要的服務或設定放到 docker-compose.override.yml,範例程式碼如下:

version: "3.9"

x-airflow-common:
  depends_on: &airflow-common-depends-on
    redis:
      condition: service_healthy
    postgres:
      condition: service_healthy

services:
  postgres:
    image: postgres:13
    environment:
      POSTGRES_USER: airflow
      POSTGRES_PASSWORD: airflow
      POSTGRES_DB: airflow
    volumes:
      - postgres-db-volume:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "airflow"]
      interval: 10s
      retries: 5
      start_period: 5s
    restart: always

  airflow-webserver:
    ports:
      - "8080:8080"

volumes:
  mysql-db-volume:

docker-compose.override.yml 文件主要是為了覆寫或擴展 docker-compose.yml 文件中的設定,因為遠端 server 通常會連接到另外開的 metadata db,所以在本地端的測試才需要另外開啟 Postgres 服務,或是如果 server 上的 8080 已經開別的服務的話,也可以用 docker-compose.override.yml 來覆蓋原來開的 port

docker-compose.yml 修改範例

基本上就是所有的 environment 區塊都改成 env_file

environment:
  &airflow-common-env
  ...

env_file:
  - .env

需要修改的有四個區塊 x-airflow-commonairflow-workerairflow-initairflow-cli

x-airflow-common:
  &airflow-common
  build:
    context: .
 
  env_file:
    - .env
  
  airflow-worker:
    env_file:
      - .env
 
  airflow-init:
    env_file:
      - .env

  airflow-cli:
    env_file:
      - .env

詳細的內容可以參考這個檔案

結語

明天會繼續說明剩下的設定,主要是 CI/CD 的相關設定~


上一篇
【Day 27】Data Pipeline 測試 - Code Quality feat. pytest
下一篇
【Day 29】Data Pipeline MVP CI/CD 實戰 - fabric、Makefile 和 buildspec.yml
系列文
我獨自升級:從水管工走向 DataOps30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言