View a markdown version of this page

Uso de dbt con Amazon MWAA - Amazon Managed Workflows para Apache Airflow

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Uso de dbt con Amazon MWAA

Con Amazon MWAA, puede usar dbt (herramienta de creación de datos) y PostgreSQL para crear y ejecutar flujos de trabajo de transformación de datos. En los pasos siguientes, añada las dependencias necesarias mediante un script de inicio y suba un proyecto de dbt de muestra al bucket de Amazon S3 de su entorno. A continuación, utilice un DAG de muestra para comprobar que Amazon MWAA ha instalado las dependencias. Por último, utilícelo BashOperator para ejecutar el proyecto dbt.

Versión

Puede usar el ejemplo de código de esta página con Apache Airflow v2 en Python 3.12 en el sitio web de Python y Apache Airflow v3 en Python 3.12 en el sitio web de Python.

Requisitos previos

Antes de poder completar los pasos siguientes, necesitará lo siguiente:

  • Un entorno Amazon MWAA que utilice Apache Airflow v2.11.2. Este ejemplo se escribió y probó con la versión 2.11.2. Es posible que tenga que modificar el ejemplo para usarlo con otras versiones de Apache Airflow.

  • Un ejemplo de proyecto de dbt. Para empezar a usar dbt con Amazon MWAA, puede crear una bifurcación y clonar el proyecto inicial de dbt desde el repositorio dbt-labs. GitHub

Dependencias

Para usar Amazon MWAA con dbt, agregue el siguiente script de inicio a su entorno. Para obtener más información, consulte Cómo usar un script de inicio con 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
Configuración de la variable DBT_ENV_PATH

Puede configurarlo $DBT_ENV_PATH en el script de inicio o configurarlo como una configuración de Airflow en su entorno de Amazon MWAA.

En las siguientes secciones, suba el directorio de su proyecto de dbt a Amazon S3 y ejecute un DAG que valide si Amazon MWAA ha instalado correctamente las dependencias de dbt requeridas.

Carga de un proyecto de dbt en Amazon S3

Para poder utilizar un proyecto dbt con su entorno Amazon MWAA, cargue todo el directorio del proyecto a la carpeta de dags de su entorno. Cuando el entorno se actualice, Amazon MWAA descargará el directorio dbt en la carpeta local de usr/local/airflow/dags/.

Pasos para cargar un proyecto de dbt en Amazon S3
  1. Vaya al directorio en el que clonó el proyecto de inicio de dbt.

  2. Ejecute el siguiente AWS CLI comando de Amazon S3 para copiar de forma recursiva el contenido del proyecto a la carpeta de su entorno mediante el parámetro. dags --recursive El comando creará un subdirectorio llamado “dbt” que puede usar para todos sus proyectos de dbt. Si el subdirectorio ya existe, los archivos del proyecto se copiarán en el directorio existente, no se creará un nuevo directorio. El comando también creará un subdirectorio dentro del directorio de dbt para este proyecto inicial específico.

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

    Puede utilizar diferentes nombres para los subdirectorios de los proyectos a fin de organizar varios proyectos de dbt dentro del directorio principal de dbt.

Uso de un DAG para verificar la instalación de la dependencia de dbt

El siguiente DAG utiliza un comando BashOperator y un comando bash para verificar si Amazon MWAA ha instalado correctamente las dependencias de dbt especificadas en el script de inicio.

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" )

Realice los siguientes pasos para ver los registros de tareas y comprobar que dbt y sus dependencias se hayan instalado.

  1. Vaya a la consola de Amazon MWAA y, a continuación, seleccione Abrir interfaz de usuario de Airflow en la lista de entornos disponibles.

  2. En la UI de Apache Airflow, busque el DAG de dbt-installation-test en la lista y, a continuación, elija la fecha que aparece debajo de la columna Last Run para abrir la última tarea completada.

  3. Con Vista de gráfico, elija la tarea bash_command para abrir los detalles de la instancia de la tarea.

  4. Elija Log para abrir los registros de tareas y, a continuación, compruebe que los registros incluyen correctamente la versión de dbt especificada en el script de inicio.

Cree y cargue un dbt profiles.yml

Para conectarse a la base de datos de destino, dbt necesita un archivo. profiles.yml El DAG de la siguiente sección pasa--profiles-dir /tmp/dbt, por lo que dbt lo busca profiles.yml directamente dentro del /tmp/dbt directorio. Esta es la dbt carpeta que ha subido a Amazon S3.

El nombre del perfil profiles.yml debe coincidir con el profile: valor definido en el proyecto inicialdbt_project.yml. Los usuarios default del proyecto dbt starter.

Para crear y subir un profiles.yml
  1. En el directorio en el que clonaste el proyecto inicial, crea un archivo llamado profiles.yml con los detalles de conexión a la base de datos.

    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. Cargue el archivo al dbt subdirectorio de la carpeta DAG de su entorno.

    aws s3 cp profiles.yml s3://amzn-s3-demo-bucket/dags/dbt/profiles.yml
Proteger las credenciales de la base

Para evitar almacenar credenciales en texto plano, haga referencia a los secretos mediante la función dbtenv_var(). Proporcione los valores mediante variables de entorno de Amazon MWAA o AWS Secrets Manager, por ejemplo,. password: "{{ env_var('DBT_PASSWORD') }}" Asegúrese también de que los grupos de seguridad de la VPC de Amazon MWAA permitan a los trabajadores acceder a la base de datos en el puerto configurado.

Uso de un DAG para ejecutar un proyecto dbt

El siguiente DAG utiliza un BashOperator para copiar los proyectos dbt que ha cargado en Amazon S3 desde el directorio local usr/local/airflow/dags/ al directorio accesible para escritura /tmp y, a continuación, ejecuta el proyecto dbt. Los comandos de bash asumen un proyecto dbt inicial titulado “dbt-starter-project”. Modifique el nombre del directorio de acuerdo con el nombre del directorio de su proyecto.

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" )