View a markdown version of this page

Como usar DBT com o Amazon MWAA - Amazon Managed Workflows for Apache Airflow

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Como usar DBT com o Amazon MWAA

Com o Amazon MWAA, você pode usar o dbt (ferramenta de criação de dados) e o PostgreSQL para criar e executar fluxos de trabalho de transformação de dados. Nas etapas a seguir, adicione as dependências necessárias usando um script de inicialização e faça o upload de um projeto dbt de amostra para o bucket Amazon S3 do seu ambiente. Em seguida, use um exemplo de DAG para verificar se o Amazon MWAA instalou as dependências. Finalmente, use o BashOperator para executar o projeto dbt.

Versão

Você pode usar o exemplo de código nesta página com o Apache Airflow v2 em Python 3.12 no site do Python e o Apache Airflow v3 no Python 3.12 no site do Python. https://peps.python.org/pep-0693/

Pré-requisitos

Antes de concluir as etapas a seguir, você precisa do seguinte:

  • Um ambiente Amazon MWAA usando o Apache Airflow v2.11.2. Essa amostra foi escrita e testada com a v2.11.2. Talvez seja necessário modificar o exemplo para usá-lo com outras versões do Apache Airflow.

  • Um exemplo de projeto de DBT. Para começar a usar o dbt com o Amazon MWAA, você pode criar uma bifurcação e clonar o projeto dbt starter do repositório dbt-labs. GitHub

Dependências

Para usar o Amazon MWAA com DBT, adicione o script de inicialização a seguir ao ambiente. Para saber mais, consulte Usar um script de startup com o Amazon MWAA.

#!/bin/bash if [[ "${MWAA_AIRFLOW_COMPONENT}" != "worker" ]] then exit 0 fi echo "------------------------------" echo "Installing virtual Python env" echo "------------------------------" pip3 install --upgrade pip echo "Current Python version:" python3 --version echo "..." sudo pip3 install --user virtualenv sudo mkdir -p /usr/local/airflow/python3-virtualenv cd /usr/local/airflow/python3-virtualenv sudo python3 -m venv dbt-env sudo chmod -R 777 * echo "------------------------------" echo "Activating venv in $DBT_ENV_PATH" echo "------------------------------" source dbt-env/bin/activate pip3 list echo "------------------------------" echo "Installing libraries..." echo "------------------------------" # do not use sudo, as it will install outside the venv pip3 install dbt-core==1.9.4 dbt-redshift==1.9.1 dbt-postgres==1.9.0 echo "------------------------------" echo "Venv libraries..." echo "------------------------------" pip3 list dbt --version echo "------------------------------" echo "Deactivating venv..." echo "------------------------------" deactivate
Configurando a variável DBT_ENV_PATH

Você pode defini-lo $DBT_ENV_PATH no script de inicialização ou configurá-lo como uma configuração do Airflow em seu ambiente Amazon MWAA.

Nas seções a seguir, faça o upload do diretório do seu projeto dbt para o Amazon S3 e execute um DAG que valida se o Amazon MWAA instalou com êxito as dependências dbt necessárias.

Faça o upload de um projeto de DBT para o Amazon S3

Para poder usar um projeto de DBT com seu ambiente Amazon MWAA, é possível fazer o upload todo o diretório do projeto na pasta dags do seu ambiente. Quando o ambiente é atualizado, o Amazon MWAA baixa o diretório DBT para a pasta local usr/local/airflow/dags/.

Para fazer upload de um projeto de DBT no Amazon S3
  1. Navegue até o diretório em que você clonou o projeto inicial de DBT.

  2. Execute o seguinte AWS CLI comando do Amazon S3 para copiar recursivamente o conteúdo do projeto para a dags pasta do seu ambiente usando o --recursive parâmetro. O comando cria um subdiretório chamado dbt que é possível usar para todos os seus projetos de DBT. Se o subdiretório já existir, os arquivos do projeto serão copiados para o diretório existente e um novo diretório não será criado. O comando também cria um subdiretório dentro do diretório dbt para esse projeto inicial específico.

    aws s3 cp dbt-starter-project s3://amzn-s3-demo-bucket/dags/dbt/dbt-starter-project --recursive

    É possível usar nomes diferentes para os subdiretórios do projeto para organizar vários projetos de DBT dentro do diretório principal dbt.

Use um DAG para verificar a instalação da dependência de DBT

O DAG a seguir usa um comando bash BashOperator e um comando para verificar se o Amazon MWAA instalou com êxito as dependências dbt especificadas no script de inicialização.

from airflow import DAG from airflow.operators.bash_operator import BashOperator from airflow.utils.dates import days_ago with DAG(dag_id="dbt-installation-test", schedule_interval=None, catchup=False, start_date=days_ago(1)) as dag: cli_command = BashOperator( task_id="bash_command", bash_command="/usr/local/airflow/python3-virtualenv/dbt-env/bin/dbt --version" )

Faça o seguinte para acessar os logs de tarefas e verificar se o dbt e as dependências dele foram instalados.

  1. Navegue até o console do Amazon MWAA e escolha Abrir IU do Airflow na lista de ambientes disponíveis.

  2. Na IU do Apache Airflow, encontre o DAG dbt-installation-test na lista e escolha a data na coluna Last Run para abrir a última tarefa bem-sucedida.

  3. Usando a Exibição de gráfico, escolha a bash_command tarefa para abrir os detalhes da instância da tarefa.

  4. Escolha Registro para abrir os registros de tarefas e, em seguida, verifique se os registros listam com êxito a versão dbt especificada no script de inicialização.

Crie e faça upload de um dbt profiles.yml

Para se conectar ao seu banco de dados de destino, o dbt requer um profiles.yml arquivo. O DAG na próxima seção é aprovado--profiles-dir /tmp/dbt, então o dbt procura profiles.yml diretamente dentro do /tmp/dbt diretório. Essa é a dbt pasta que você enviou para o Amazon S3.

O nome do perfil em profiles.yml deve corresponder ao profile: valor definido no projeto inicial. dbt_project.yml O projeto dbt starter usa. default

Para criar e fazer upload de um profiles.yml
  1. No diretório em que você clonou o projeto inicial, crie um arquivo chamado profiles.yml com os detalhes da conexão do banco de dados.

    default: target: dev outputs: dev: type: postgres host: your-db-endpoint.region.rds.amazonaws.com port: 5432 user: your_db_user password: your_db_password dbname: your_database schema: your_schema threads: 4
  2. Faça o upload do arquivo para o dbt subdiretório na pasta DAGs do seu ambiente.

    aws s3 cp profiles.yml s3://amzn-s3-demo-bucket/dags/dbt/profiles.yml
Protegendo credenciais do banco de dados

Para evitar o armazenamento de credenciais de texto simples, faça referência a segredos usando a função dbt. env_var() Forneça os valores por meio de variáveis de ambiente do Amazon MWAA ou AWS Secrets Manager—por exemplo,. password: "{{ env_var('DBT_PASSWORD') }}" Além disso, certifique-se de que seus grupos de segurança do Amazon MWAA VPC permitam que seus funcionários acessem seu banco de dados na porta configurada.

Use um DAG para executar um projeto de DBT

O DAG a seguir usa um código BashOperator para copiar os projetos de DBT que você fez o upload para o Amazon S3 do diretório local usr/local/airflow/dags/ para o diretório acessível para gravação /tmp e, em seguida, executa o projeto de DBT. Os comandos bash pressupõem um projeto inicial de DBT intitulado dbt-starter-project. Modifique o nome do diretório de acordo com o nome do diretório do seu projeto.

from airflow import DAG from airflow.operators.bash_operator import BashOperator from airflow.utils.dates import days_ago import os DAG_ID = os.path.basename(__file__).replace(".py", "") # assumes all files are in a subfolder of DAGs called dbt with DAG(dag_id=DAG_ID, schedule_interval=None, catchup=False, start_date=days_ago(1)) as dag: cli_command = BashOperator( task_id="bash_command", bash_command="source /usr/local/airflow/python3-virtualenv/dbt-env/bin/activate;\ cp -R /usr/local/airflow/dags/dbt /tmp;\ echo 'listing project files:';\ ls -R /tmp;\ cd /tmp/dbt/dbt-starter-project;\ /usr/local/airflow/python3-virtualenv/dbt-env/bin/dbt run --project-dir /tmp/dbt/dbt-starter-project --profiles-dir /tmp/dbt;\ cat /tmp/dbt/dbt-starter-project/logs/dbt.log;\ rm -rf /tmp/dbt/dbt-starter-project" )