Entrar ou criar conta

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.

DataOps para BI: orquestração e automação com Apache Airflow
Ligado ao treinamento DataOps para BI: orquestração e automação com Apache Airflow
ULC-LAB-BI-0003 · Status de validaçãoNão validado pela Upnetix: roteiro derivado da documentação oficial, para você executar e validar
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
Objetivo

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

ItemRequisito, licença ou versão
VM ou notebook para Airflow2 vCPU, 4GB RAM, 10GB disco, Ubuntu 22.04+
VM para PostgreSQL origem1 vCPU, 1GB RAM, 5GB disco, Ubuntu 22.04+
VM para PostgreSQL destino1 vCPU, 1GB RAM, 5GB disco, Ubuntu 22.04+
Apache AirflowApache 2.0 · 2.8.1
PostgreSQLPostgreSQL License · 16
PythonPSF License · 3.10
PandasBSD · 2.2.2

Roteiro

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.local

    O que você deve ver: Airflow inicializado e usuário admin criado.

  7. 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.

  8. 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 >> t3

    O que você deve ver: Arquivo etl_bi.py criado em ~/airflow/dags.

  9. 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.

  10. 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.

  11. 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

TesteComandoCritério
Conexão do Airflow com ambos os bancosairflow connections get pg_origemDados de conexão exibidos corretamente
Execução do DAG sem falhasTodas as tarefas do DAG aparecem como 'success' no Airflow
Dados transformados corretamentesudo -u postgres psql -d bi_destino -c "SELECT valor_com_imposto FROM vendas_tratadas;"Valores correspondem a valor * 1.1
Webserver acessívelcurl http://localhost:8080Página HTML do Airflow retornada

Troubleshooting

SintomaCausa provávelCorreção
Erro de conexão ao banco de dadosConfiguração incorreta de host, porta ou senhaRevise o comando de conexão e permissões no pg_hba.conf
DAG não aparece no painelArquivo DAG com erro de sintaxe ou fora da pasta corretaCorrija o código e salve em ~/airflow/dags
Tarefa de transformação falhaPandas não instalado ou erro de leitura de arquivoVerifique instalação do Pandas e caminhos de arquivos
Webserver não iniciaPorta 8080 ocupada ou variável AIRFLOW_HOME incorretaLibere 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

  1. Documentação oficial do Apache Airflow · Apache Software Foundation (Airflow) (airflow.apache.org)
  2. Documentação do Docker (opcional para ambiente) · Docker, Inc. (docs.docker.com)
Verificação editorial
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
Encontrou um erro? Escreva para comercial@upnetix.com.br com o endereço da página. A revisão semestral por IA nunca altera comandos ou configurações sem passar pela fila de revisão.