Автосоздание connection в Airflow
This commit is contained in:
+15
-28
@@ -4,7 +4,8 @@
|
|||||||
|
|
||||||
## 🎯 Цель проекта
|
## 🎯 Цель проекта
|
||||||
|
|
||||||
Создать максимально простую среду для изучения Apache Airflow, где все переменные окружения захардкожены для удобства студентов.
|
Создать максимально простую среду для изучения Apache Airflow.
|
||||||
|
Для удобства все переменные окружения захардкожены в docker скрипты. На проде так делать не надо :)
|
||||||
|
|
||||||
## 📋 Предварительные требования
|
## 📋 Предварительные требования
|
||||||
|
|
||||||
@@ -70,7 +71,7 @@ graph TB
|
|||||||
```
|
```
|
||||||
airflow-docker/
|
airflow-docker/
|
||||||
├── docker-compose.yml # Конфигурация Docker
|
├── docker-compose.yml # Конфигурация Docker
|
||||||
├── .env # Переменные окружения (создается автоматически)
|
├── .env # Файл не используется: переменные заданы в docker-compose.yml
|
||||||
├── dags/ # DAG файлы для обучения
|
├── dags/ # DAG файлы для обучения
|
||||||
│ ├── hello_world_dag.py # Базовый пример
|
│ ├── hello_world_dag.py # Базовый пример
|
||||||
│ ├── sql_basic_dag.py # Работа с SQL
|
│ ├── sql_basic_dag.py # Работа с SQL
|
||||||
@@ -124,37 +125,23 @@ airflow-docker/
|
|||||||
|
|
||||||
### Переменные окружения
|
### Переменные окружения
|
||||||
|
|
||||||
Все переменные захардкожены для простоты:
|
В этом проекте мы не используем `.env`: все значения заданы напрямую в `docker-compose.yml`.
|
||||||
|
|
||||||
```env
|
Сервисы Airflow получают:
|
||||||
# Airflow Configuration
|
- `POSTGRES_TRAINING_HOST=postgres-training`
|
||||||
AIRFLOW_USER=admin
|
- `POSTGRES_TRAINING_PORT=5432`
|
||||||
AIRFLOW_PASSWORD=admin
|
- `POSTGRES_TRAINING_DB=training`
|
||||||
|
- `POSTGRES_TRAINING_USER=student`
|
||||||
|
- `POSTGRES_TRAINING_PASSWORD=student`
|
||||||
|
- `AIRFLOW_CONN_POSTGRES_TRAINING=postgresql://student:student@postgres-training:5432/training`
|
||||||
|
|
||||||
# PostgreSQL (Airflow metadata)
|
`docker-compose run --rm airflow-init` запускает `airflow connections add postgres_training`, поэтому соединение доступно сразу после инициализации. Проверить наличие можно через:
|
||||||
PG_USER=airflow
|
|
||||||
PG_PASSWORD=airflow
|
|
||||||
PG_DB=airflow
|
|
||||||
|
|
||||||
# PostgreSQL для training exercises
|
```bash
|
||||||
TRAINING_PG_USER=student
|
docker-compose exec airflow-webserver airflow connections get postgres_training
|
||||||
TRAINING_PG_PASSWORD=student
|
|
||||||
TRAINING_PG_DB=training
|
|
||||||
TRAINING_PG_HOST=postgres-training
|
|
||||||
TRAINING_PG_PORT=5432
|
|
||||||
|
|
||||||
# Connection ID for PostgreSQL training database
|
|
||||||
POSTGRES_CONN_ID=postgres_training
|
|
||||||
|
|
||||||
# CSV Pipeline
|
|
||||||
CSV_DIR=/opt/airflow/data
|
|
||||||
CSV_ROWS=1000
|
|
||||||
|
|
||||||
# Airflow Configuration
|
|
||||||
_AIRFLOW_DB_UPGRADE=true
|
|
||||||
_AIRFLOW_WWW_USER_CREATE=true
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
### Порты
|
### Порты
|
||||||
|
|
||||||
- `8080` - Airflow Webserver
|
- `8080` - Airflow Webserver
|
||||||
|
|||||||
@@ -42,6 +42,8 @@ start_task → date_task → end_task
|
|||||||
- Execute SQL queries
|
- Execute SQL queries
|
||||||
- Use PostgresOperator
|
- Use PostgresOperator
|
||||||
|
|
||||||
|
**Connection Hint:** `docker-compose run --rm airflow-init` automatically provisions the `postgres_training` connection via `airflow connections add`, so no manual setup is required. You can verify it with `docker-compose exec airflow-webserver airflow connections get postgres_training`.
|
||||||
|
|
||||||
**Tasks:**
|
**Tasks:**
|
||||||
- `create_table`: Create simple table (users, products)
|
- `create_table`: Create simple table (users, products)
|
||||||
- `insert_data`: Insert sample records
|
- `insert_data`: Insert sample records
|
||||||
@@ -242,4 +244,4 @@ CREATE TABLE enrollments (
|
|||||||
- Uses conditional branching
|
- Uses conditional branching
|
||||||
- Implements proper error handling
|
- Implements proper error handling
|
||||||
- Creates reusable components
|
- Creates reusable components
|
||||||
- Optimizes workflow performance
|
- Optimizes workflow performance
|
||||||
|
|||||||
@@ -1,3 +1,15 @@
|
|||||||
|
x-airflow-env: &airflow-default-env
|
||||||
|
AIRFLOW__CORE__LOAD_EXAMPLES: "False"
|
||||||
|
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres-metadata:5432/airflow
|
||||||
|
AIRFLOW__CORE__EXECUTOR: LocalExecutor
|
||||||
|
AIRFLOW__WEBSERVER__SECRET_KEY: replace-me-with-random-string
|
||||||
|
POSTGRES_TRAINING_HOST: postgres-training
|
||||||
|
POSTGRES_TRAINING_PORT: "5432"
|
||||||
|
POSTGRES_TRAINING_DB: training
|
||||||
|
POSTGRES_TRAINING_USER: student
|
||||||
|
POSTGRES_TRAINING_PASSWORD: student
|
||||||
|
AIRFLOW_CONN_POSTGRES_TRAINING: postgresql://student:student@postgres-training:5432/training
|
||||||
|
|
||||||
services:
|
services:
|
||||||
# PostgreSQL for Airflow metadata
|
# PostgreSQL for Airflow metadata
|
||||||
postgres-metadata:
|
postgres-metadata:
|
||||||
@@ -39,10 +51,7 @@ services:
|
|||||||
build: .
|
build: .
|
||||||
image: airflow-optimized:2.9.2
|
image: airflow-optimized:2.9.2
|
||||||
environment:
|
environment:
|
||||||
AIRFLOW__CORE__LOAD_EXAMPLES: "False"
|
<<: *airflow-default-env
|
||||||
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres-metadata:5432/airflow
|
|
||||||
AIRFLOW__CORE__EXECUTOR: LocalExecutor
|
|
||||||
AIRFLOW__WEBSERVER__SECRET_KEY: replace-me-with-random-string
|
|
||||||
command: >
|
command: >
|
||||||
bash -c "
|
bash -c "
|
||||||
airflow webserver
|
airflow webserver
|
||||||
@@ -65,10 +74,7 @@ services:
|
|||||||
build: .
|
build: .
|
||||||
# image: airflow-optimized:2.9.2
|
# image: airflow-optimized:2.9.2
|
||||||
environment:
|
environment:
|
||||||
AIRFLOW__CORE__LOAD_EXAMPLES: "False"
|
<<: *airflow-default-env
|
||||||
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres-metadata:5432/airflow
|
|
||||||
AIRFLOW__CORE__EXECUTOR: LocalExecutor
|
|
||||||
AIRFLOW__WEBSERVER__SECRET_KEY: replace-me-with-random-string
|
|
||||||
command: >
|
command: >
|
||||||
bash -c "
|
bash -c "
|
||||||
airflow scheduler
|
airflow scheduler
|
||||||
@@ -90,9 +96,7 @@ services:
|
|||||||
user: "0:0"
|
user: "0:0"
|
||||||
# image: airflow-optimized:2.9.2
|
# image: airflow-optimized:2.9.2
|
||||||
environment:
|
environment:
|
||||||
AIRFLOW__CORE__LOAD_EXAMPLES: "False"
|
<<: *airflow-default-env
|
||||||
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres-metadata:5432/airflow
|
|
||||||
AIRFLOW__WEBSERVER__SECRET_KEY: replace-me-with-random-string
|
|
||||||
volumes:
|
volumes:
|
||||||
- ./dags:/opt/airflow/dags
|
- ./dags:/opt/airflow/dags
|
||||||
- ./data:/opt/airflow/data
|
- ./data:/opt/airflow/data
|
||||||
@@ -103,7 +107,9 @@ services:
|
|||||||
chown -R airflow:0 /opt/airflow/data || true &&
|
chown -R airflow:0 /opt/airflow/data || true &&
|
||||||
umask 000 &&
|
umask 000 &&
|
||||||
su -s /bin/bash airflow -c 'airflow db migrate' &&
|
su -s /bin/bash airflow -c 'airflow db migrate' &&
|
||||||
su -s /bin/bash airflow -c 'airflow users create --username admin --password admin --firstname Admin --lastname User --role Admin --email admin@example.org'
|
su -s /bin/bash airflow -c 'airflow users create --username admin --password admin --firstname Admin --lastname User --role Admin --email admin@example.org' &&
|
||||||
|
su -s /bin/bash airflow -c 'airflow connections delete postgres_training || true' &&
|
||||||
|
su -s /bin/bash airflow -c \"airflow connections add 'postgres_training' --conn-uri \\\"$${AIRFLOW_CONN_POSTGRES_TRAINING}\\\" --conn-description 'Training exercises database'\"
|
||||||
"
|
"
|
||||||
depends_on:
|
depends_on:
|
||||||
postgres-metadata:
|
postgres-metadata:
|
||||||
|
|||||||
Reference in New Issue
Block a user