ULC Lab · implementação reproduzível
Laboratório: Pipeline ETL automatizado de BI com Apache Airflow, PostgreSQL e Pandas
Você vai implementar um pipeline de ETL automatizado com Apache Airflow, extraindo dados de um banco PostgreSQL, transformando com Pandas e carregando em outro banco. Tempo estimado: 2 a 3 horas.

- Duração estimada
- 120 min
- Passos
- 11
- Validações
- 4
- Versões da documentação consultada
- Apache Airflow 2.8.1 · PostgreSQL 16 · Python 3.10 · Pandas 2.2.2
Demonstrar, de ponta a ponta, a orquestração de um fluxo ETL típico de BI usando apenas ferramentas de código aberto. O laboratório cobre desde a instalação do Airflow até a automação de tarefas reais, simulando um cenário corporativo de integração entre fontes de dados e BI, em ambiente isolado e reproduzível.
Topologia
Três componentes principais: 1) Apache Airflow (192.168.56.10) orquestra o pipeline; 2) Banco PostgreSQL de origem (192.168.56.11) fornece dados brutos; 3) Banco PostgreSQL de destino (192.168.56.12) recebe os dados tratados. O Airflow conecta-se a ambos os bancos via rede privada.
+--------------------+
| Apache Airflow |
| 192.168.56.10 |
+--------+----------+
|
+----------+----------+
| |
+---+---+ +-----+---+
| Origem| | Destino |
|Postgre| |Postgre |
|.11 | |.12 |
+-------+ +---------+Equipamentos e software
| Item | Requisito, licença ou versão |
|---|---|
| VM ou notebook para Airflow | 2 vCPU, 4GB RAM, 10GB disco, Ubuntu 22.04+ |
| VM para PostgreSQL origem | 1 vCPU, 1GB RAM, 5GB disco, Ubuntu 22.04+ |
| VM para PostgreSQL destino | 1 vCPU, 1GB RAM, 5GB disco, Ubuntu 22.04+ |
| Apache Airflow | Apache 2.0 · 2.8.1 |
| PostgreSQL | PostgreSQL License · 16 |
| Python | PSF License · 3.10 |
| Pandas | BSD · 2.2.2 |
Roteiro
- Preparar as VMs e rede
Crie três VMs (ou containers) em uma rede privada (ex: 192.168.56.0/24). Garanta comunicação entre elas.
O que você deve ver: Ping entre as VMs funciona; acesso SSH disponível.
- Instalar PostgreSQL nas VMs de origem e destino
Instale e configure o PostgreSQL em ambas as VMs. Defina senhas e permita conexões pela rede privada.
sudo apt update && sudo apt install postgresql sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'postgres';" # Edite /etc/postgresql/16/main/pg_hba.conf e /etc/postgresql/16/main/postgresql.conf conforme a documentação.O que você deve ver: Serviço PostgreSQL ativo em ambas as VMs, aceitando conexões remotas.
- Criar bancos e tabelas de teste
Crie um banco 'bi_origem' na origem e 'bi_destino' no destino. Crie tabelas simples para simular dados brutos e tratados.
sudo -u postgres createdb bi_origem sudo -u postgres createdb bi_destino # Na origem: sudo -u postgres psql -d bi_origem -c "CREATE TABLE vendas (id serial PRIMARY KEY, produto text, valor numeric, data_venda date);" # No destino: sudo -u postgres psql -d bi_destino -c "CREATE TABLE vendas_tratadas (id serial PRIMARY KEY, produto text, valor numeric, data_venda date, valor_com_imposto numeric);"O que você deve ver: Tabelas criadas em ambos os bancos.
- Popular dados de teste na origem
Insira alguns registros fictícios na tabela de origem para simular dados reais.
sudo -u postgres psql -d bi_origem -c "INSERT INTO vendas (produto, valor, data_venda) VALUES ('Fibra 100M', 100, '2024-06-01'), ('Fibra 200M', 180, '2024-06-02');"O que você deve ver: Dados disponíveis na tabela vendas da origem.
- Instalar Apache Airflow na VM dedicada
Instale o Apache Airflow com suporte a PostgreSQL e Pandas. Use ambiente virtual Python para isolar dependências.
sudo apt install python3-venv python3 -m venv airflow_venv source airflow_venv/bin/activate pip install "apache-airflow[postgres,pandas]==2.8.1" --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.8.1/constraints-3.10.txt"O que você deve ver: Airflow e dependências instalados sem erros.
- Inicializar e configurar o Airflow
Inicialize o banco de dados do Airflow e crie um usuário admin. Configure o Airflow para rodar localmente.
export AIRFLOW_HOME=~/airflow airflow db init airflow users create --username admin --password admin --firstname Admin --lastname User --role Admin --email admin@lab.localO que você deve ver: Airflow inicializado e usuário admin criado.
- Configurar conexões do Airflow com os bancos
Adicione conexões no Airflow para os dois bancos PostgreSQL usando a interface web ou CLI.
airflow connections add 'pg_origem' --conn-uri 'postgresql+psycopg2://postgres:postgres@192.168.56.11:5432/bi_origem' airflow connections add 'pg_destino' --conn-uri 'postgresql+psycopg2://postgres:postgres@192.168.56.12:5432/bi_destino'O que você deve ver: Conexões pg_origem e pg_destino criadas no Airflow.
- Criar DAG ETL no Airflow
Implemente um DAG que: 1) extrai dados do banco origem, 2) transforma com Pandas (adiciona coluna de imposto), 3) carrega no banco destino.
mkdir -p ~/airflow/dags touch ~/airflow/dags/etl_bi.py # Exemplo de DAG: # Consulte https://airflow.apache.org/docs/apache-airflow/stable/howto/operator/python.html para detalhes. # Veja trecho abaixo: from airflow import DAG from airflow.providers.postgres.hooks.postgres import PostgresHook from airflow.operators.python import PythonOperator from datetime import datetime import pandas as pd def extrair(**context): hook = PostgresHook(postgres_conn_id='pg_origem') df = hook.get_pandas_df('SELECT * FROM vendas;') df.to_csv('/tmp/vendas.csv', index=False) def transformar(**context): df = pd.read_csv('/tmp/vendas.csv') df['valor_com_imposto'] = df['valor'] * 1.1 df.to_csv('/tmp/vendas_tratadas.csv', index=False) def carregar(**context): hook = PostgresHook(postgres_conn_id='pg_destino') df = pd.read_csv('/tmp/vendas_tratadas.csv') for _, row in df.iterrows(): hook.run( "INSERT INTO vendas_tratadas (produto, valor, data_venda, valor_com_imposto) VALUES (%s, %s, %s, %s)", parameters=(row['produto'], row['valor'], row['data_venda'], row['valor_com_imposto']) ) default_args = {'start_date': datetime(2024, 6, 1)} with DAG('etl_bi', schedule_interval=None, default_args=default_args, catchup=False) as dag: t1 = PythonOperator(task_id='extrair', python_callable=extrair) t2 = PythonOperator(task_id='transformar', python_callable=transformar) t3 = PythonOperator(task_id='carregar', python_callable=carregar) t1 >> t2 >> t3O que você deve ver: Arquivo etl_bi.py criado em ~/airflow/dags.
- Iniciar o Airflow Scheduler e Webserver
Suba o scheduler e o webserver do Airflow para monitorar e executar o DAG.
airflow scheduler & airflow webserver --port 8080 &O que você deve ver: Airflow acessível em http://localhost:8080.
- Executar o DAG manualmente
No painel do Airflow, ative e execute o DAG etl_bi. Observe o status das tarefas.
O que você deve ver: Execução do DAG com três tarefas: extrair, transformar, carregar.
- Verificar dados no banco de destino
Confirme que os dados tratados chegaram corretamente ao banco de destino.
sudo -u postgres psql -d bi_destino -c "SELECT * FROM vendas_tratadas;"O que você deve ver: Registros com coluna valor_com_imposto presentes na tabela vendas_tratadas.
Como saber que funcionou
| Teste | Comando | Critério |
|---|---|---|
| Conexão do Airflow com ambos os bancos | airflow connections get pg_origem | Dados de conexão exibidos corretamente |
| Execução do DAG sem falhas | Todas as tarefas do DAG aparecem como 'success' no Airflow | |
| Dados transformados corretamente | sudo -u postgres psql -d bi_destino -c "SELECT valor_com_imposto FROM vendas_tratadas;" | Valores correspondem a valor * 1.1 |
| Webserver acessível | curl http://localhost:8080 | Página HTML do Airflow retornada |
Troubleshooting
| Sintoma | Causa provável | Correção |
|---|---|---|
| Erro de conexão ao banco de dados | Configuração incorreta de host, porta ou senha | Revise o comando de conexão e permissões no pg_hba.conf |
| DAG não aparece no painel | Arquivo DAG com erro de sintaxe ou fora da pasta correta | Corrija o código e salve em ~/airflow/dags |
| Tarefa de transformação falha | Pandas não instalado ou erro de leitura de arquivo | Verifique instalação do Pandas e caminhos de arquivos |
| Webserver não inicia | Porta 8080 ocupada ou variável AIRFLOW_HOME incorreta | Libere a porta ou ajuste a variável e tente novamente |
Segurança e hardening
- Nunca use senhas padrão em ambientes de produção
- Restrinja o acesso às portas do PostgreSQL apenas à rede privada
- Evite salvar dados sensíveis em arquivos temporários sem criptografia
- Configure roles e permissões mínimas necessárias no PostgreSQL
- Desative usuários e conexões não utilizados após o laboratório
Checklist final
Referências
- Documentação oficial do Apache Airflow · Apache Software Foundation (Airflow) (airflow.apache.org)
- Documentação do Docker (opcional para ambiente) · Docker, Inc. (docs.docker.com)
- Publicado
- 09/09/2026
- Última revisão
- 09/09/2026
- Versão do conteúdo
- 1.0
- Referências
- 2 oficiais
- Revisão técnica
- redação e revisão por IA, URLs conferidas na publicação
- Status
- Atual
