

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 搭配 Amazon MWAA 使用 dbt
<a name="samples-dbt"></a>

本主題示範如何搭配 Amazon MWAA 使用 dbt 和 Postgres。在下列步驟中，您將新增必要的相依性到您的 `requirements.txt`，並將範例 dbt 專案上傳至您環境的 Amazon S3 儲存貯體。然後，您將使用範例 DAG 來驗證 Amazon MWAA 已安裝相依性，最後使用 `BashOperator`來執行 dbt 專案。

**Topics**
+ [版本](#samples-dbt-version)
+ [先決條件](#samples-dbt-prereqs)
+ [相依性](#samples-dbt-dependencies)
+ [將 dbt 專案上傳至 Amazon S3](#samples-dbt-upload-project)
+ [使用 DAG 驗證 dbt 相依性安裝](#samples-dbt-test-dependencies)
+ [使用 DAG 執行 dbt 專案](#samples-dbt-run-project)

## 版本
<a name="samples-dbt-version"></a>

您可以使用此頁面上的程式碼範例搭配 Python 3.10 中的 **Apache Airflow v2** 和 Python 3.11 中的 **Apache Airflow v**3。 [https://peps.python.org/pep-0619/](https://peps.python.org/pep-0619/) [https://peps.python.org/pep-0664/](https://peps.python.org/pep-0664/)

## 先決條件
<a name="samples-dbt-prereqs"></a>

在您可以完成下列步驟之前，您將需要下列項目：
+ 使用 Apache Airflow 2.2.2 版的 [Amazon MWAA 環境](get-started.md)。此範例已撰寫，並使用 v2.2.2 進行測試。您可能需要修改範例，以與其他 Apache Airflow 版本搭配使用。
+ 範例 dbt 專案。若要開始使用 dbt 搭配 Amazon MWAA，您可以建立分支，並從 [dbt-labs GitHub 儲存庫複製 dbt 入門專案](https://github.com/dbt-labs/dbt-starter-project)。 GitHub 

## 相依性
<a name="samples-dbt-dependencies"></a>

若要將 Amazon MWAA 與 dbt 搭配使用，請將下列啟動指令碼新增至您的環境。若要進一步了解，請參閱[搭配 Amazon MWAA 使用啟動指令碼](using-startup-script.md)。

```
#!/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 python3-virtualenv
  cd 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-redshift==1.6.1 dbt-postgres==1.6.1
			
  echo "------------------------------"
  echo "Venv libraries..."
  echo "------------------------------"
			
  pip3 list
  dbt --version
			
  echo "------------------------------"
  echo "Deactivating venv..."
  echo "------------------------------"
			
  deactivate
```

在下列各節中，您將上傳 dbt 專案目錄至 Amazon S3，並執行 DAG，以驗證 Amazon MWAA 是否已成功安裝所需的 dbt 相依性。

## 將 dbt 專案上傳至 Amazon S3
<a name="samples-dbt-upload-project"></a>

若要將 dbt 專案與 Amazon MWAA 環境搭配使用，您可以將整個專案目錄上傳至環境的`dags`資料夾。當環境更新時，Amazon MWAA 會將 dbt 目錄下載至本機`usr/local/airflow/dags/`資料夾。

**將 dbt 專案上傳至 Amazon S3**

1. 導覽至您複製 dbt 入門專案的目錄。

1. 執行下列 Amazon S3 AWS CLI command，使用 `--recursive` 參數以遞迴方式將專案內容複製到您環境的`dags`資料夾。命令會建立名為 的子目錄`dbt`，可用於所有 dbt 專案。如果子目錄已存在，專案檔案會複製到現有目錄，而且不會建立新的目錄。命令也會在此特定入門專案的 `dbt` 目錄中建立子目錄。

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

   您可以針對專案子目錄使用不同的名稱，在父`dbt`目錄中組織多個 dbt 專案。

## 使用 DAG 驗證 dbt 相依性安裝
<a name="samples-dbt-test-dependencies"></a>

下列 DAG 使用 `BashOperator`和 bash 命令來驗證 Amazon MWAA 是否已成功安裝 中指定的 dbt 相依性`requirements.txt`。

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

執行下列動作來存取任務日誌，並確認已安裝 dbt 及其相依性。

1. 導覽至 Amazon MWAA 主控台，然後從可用環境清單中選擇 **Open Airflow UI**。

1. 在 Apache Airflow UI 上，從清單中尋找 `dbt-installation-test` DAG，然後在`Last Run`欄中選擇日期以開啟最後一個成功任務。

1. 使用**圖形檢視**，選擇`bash_command`任務以開啟任務執行個體詳細資訊。

1. 選擇**日誌**以開啟任務日誌，然後驗證日誌是否成功列出我們在 中指定的 dbt 版本`requirements.txt`。

## 使用 DAG 執行 dbt 專案
<a name="samples-dbt-run-project"></a>

下列 DAG 使用 `BashOperator`將上傳到 Amazon S3 的 dbt 專案從本機`usr/local/airflow/dags/`目錄複製到可寫入`/tmp`目錄，然後執行 dbt 專案。bash 命令會假設名為 的入門 dbt 專案`dbt-starter-project`。根據專案目錄的名稱修改目錄名稱。

```
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/mwaa_dbt_test_project;\
			/usr/local/airflow/python3-virtualenv/dbt-env/bin/dbt run --project-dir /tmp/dbt/mwaa_dbt_test_project --profiles-dir ..;\
			cat /tmp/dbt_logs/dbt.log;\
			rm -rf /tmp/dbt/mwaa_dbt_test_project"
			)
```