Lesson 11 / 25
Connections, Variables and Secrets
Store credentials as Connections or in a secrets backend, and keep them out of DAG code.
Credentials do not belong in DAG files
A Connection stores how to reach an external system (host, login, password, extras) under a name such as warehouse_db; operators and hooks take that name, so DAG code never contains secrets. A Variable stores a small configuration value. Both can be set in the UI, through the CLI, via environment variables (AIRFLOW_CONN_WAREHOUSE_DB), or, best for production, read from a secrets backend such as AWS Secrets Manager, Google Secret Manager or HashiCorp Vault. Restrict who can view connections, since passwords are masked but still accessible to admins.
A connection as an environment variable
The name after AIRFLOW_CONN_ becomes the connection ID (warehouse_db). The value is a URI. Use placeholders here, never real passwords in documentation or Git.
export AIRFLOW_CONN_WAREHOUSE_DB="postgresql://loader:<password>@warehouse.internal:5432/analytics"
# in a DAG, only the ID appears:
# PostgresOperator(task_id="load", postgres_conn_id="warehouse_db", sql="sql/load_orders.sql")Quick check: Where should a database password for a DAG live?
- In a public repository
- Hard-coded in the DAG file
- In a task name
- In a Connection or a secrets backend
Answer
In a Connection or a secrets backend — Connections and secrets backends keep credentials out of source control.