

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

# 故障診斷：DAGs、運算子、連線和其他問題
<a name="t-apache-airflow-202"></a>

本頁面上的主題說明您在 Amazon Managed Workflows for Apache Airflow 環境中可能遇到的 Apache Airflow v2 和 v3 Python 相依性、自訂外掛程式、DAGs、運算子、連線、任務和 Web 伺服器問題的解決方案。

**Contents**
+ [

## 連線
](#troubleshooting-conn-202)
  + [

### 我無法連線至 Secrets Manager
](#access-secrets-manager)
  + [

### 如何在執行角色政策中設定`secretsmanager:ResourceTag/<tag-key>`秘密管理員條件或資源限制？
](#access-secrets-manager-condition-keys)
  + [

### 我無法連線至 Snowflake
](#missing-snowflake)
  + [

### 我無法在 Airflow UI 中找到我的連線
](#connection-type-missing)
+ [

## Web 伺服器
](#troubleshooting-webserver-202)
  + [

### 我在存取 Web 伺服器時收到 5xx 錯誤
](#5xx-webserver-202)
  + [

### 我收到`The scheduler does not seem to be running`錯誤
](#error-scheduler-202)
+ [

## 任務​
](#troubleshooting-tasks-202)
  + [

### 我讓任務停滯或未完成
](#stranded-tasks-202)
  + [

### 我在 Airflow v3 中收到沒有日誌的任務失敗
](#failed-task-no-log)
+ [

## CLI
](#troubleshooting-cli-202)
  + [

### 在 CLI 中觸發 DAG 時收到「503」錯誤
](#cli-toomany-202)
  + [

### 為什麼 `dags backfill` Apache Airflow CLI 命令會失敗？ 是否有解決方法？
](#troubleshooting-cli-backfill)
+ [

## 運算子
](#troubleshooting-operators-202)
  + [

### 我使用 S3Transform 運算子收到`PermissionError: [Errno 13] Permission denied`錯誤
](#op-s3-transform)

## 連線
<a name="troubleshooting-conn-202"></a>

下列主題說明使用 Apache Airflow 連線或使用另一個 AWS 資料庫時可能收到的錯誤。

### 我無法連線至 Secrets Manager
<a name="access-secrets-manager"></a>

建議下列步驟：

1. 了解如何在 中建立 Apache Airflow 連線和變數的私密金鑰[使用 AWS Secrets Manager 秘密設定 Apache Airflow 連線](connections-secrets-manager.md)。

1. 了解如何在 中使用 Apache Airflow 變數 (`test-variable`) 的私密金鑰[針對 AWS Secrets Manager Apache Airflow 變數在 中使用私密金鑰](samples-secrets-manager-var.md)。

1. 了解如何在 中使用 Apache Airflow 連線 (`myconn`) 的私密金鑰[在 中使用私密金鑰 AWS Secrets Manager 進行 Apache Airflow 連線](samples-secrets-manager.md)。

### 如何在執行角色政策中設定`secretsmanager:ResourceTag/<tag-key>`秘密管理員條件或資源限制？
<a name="access-secrets-manager-condition-keys"></a>

**注意**  
適用於 Apache Airflow 2.0 版及更早版本。

目前，由於 Apache Airflow 中的已知問題，您無法在環境執行角色中使用條件金鑰或其他資源限制來限制對 Secrets Manager 秘密的存取。

### 我無法連線至 Snowflake
<a name="missing-snowflake"></a>

建議下列步驟：

1. 在 GitHub 上使用 [aws-mwaa-docker-images](https://github.com/aws/amazon-mwaa-docker-images)，在本機測試您的 DAGs、自訂外掛程式和 Python 相依性。

1. 將下列項目新增至您環境的 requirements.txt。

   ```
   apache-airflow-providers-snowflake==1.3.0
   ```

1. 將下列匯入新增至您的 DAG：

   ```
   from airflow.providers.snowflake.operators.snowflake import SnowflakeOperator
   ```

確保 Apache Airflow 連線物件包含下列鍵值對：

1. **Conn ID：**nowflake\$1conn

1. **Conn 類型：**Snowflake

1. **主機：**<my account>.<my region if not us-west-2>.snowflakecomputing.com

1. **結構描述：**<my 結構描述>

1. **登入：**<我的使用者名稱>

1. **密碼：**\$1\$1\$1\$1\$1\$1\$1

1. **連接埠：**<port， if any>

1. **額外： **

   ```
   {
   						"account": "<my account>",
   						"warehouse": "<my warehouse>",
   						"database": "<my database>",
   						"region": "<my region if not using us-west-2 otherwise omit this line>"
   						}
   ```

例如：

```
>>> import json
				>>> from airflow.models.connection import Connection
				>>> myconn = Connection(
				...    conn_id='snowflake_conn',
				...    conn_type='Snowflake',
				...    host='123456789012.us-east-1.snowflakecomputing.com',
				...    schema='YOUR_SCHEMA'
				...    login='YOUR_USERNAME',
				...    password='YOUR_PASSWORD',
				...    port='YOUR_PORT'
				...    extra=json.dumps(dict(account='123456789012', warehouse='YOUR_WAREHOUSE', database='YOUR_DB_OPTION', region='us-east-1')),
				... )
```

### 我無法在 Airflow UI 中找到我的連線
<a name="connection-type-missing"></a>

Apache Airflow 在 Apache Airflow UI 中提供連線範本。無論連線類型為何，它都會使用此字串來產生連線 URI 字串。如果 Apache Airflow UI 中無法使用連線範本，則可以使用替代連線範本來產生連線 URI 字串，例如使用 HTTP 連線範本。

建議下列步驟：

1. 在 的 Apache Airflow UI 中存取 Amazon MWAA 提供的連線類型[安裝在 Amazon MWAA 環境上的 Apache Airflow 提供者套件](connections-packages.md)。

1. 存取命令，在 的 CLI 中建立 Apache Airflow 連線[Apache Airflow CLI 命令參考](airflow-cli-command-reference.md)。

1. 了解如何針對 Amazon MWAA 上的 Apache Airflow UI 中無法使用的連線類型，交替使用 Apache Airflow UI 中的連線範本[連線類型概觀](manage-connection-types.md)。

## Web 伺服器
<a name="troubleshooting-webserver-202"></a>

下列主題說明 Amazon MWAA 上 Apache Airflow Web 伺服器可能收到的錯誤。

### 我在存取 Web 伺服器時收到 5xx 錯誤
<a name="5xx-webserver-202"></a>

建議下列步驟：

1. 檢查 Apache Airflow 組態選項。確認您指定為 Apache Airflow 組態選項的鍵值對 AWS Secrets Manager已正確設定，例如 。若要進一步了解，請參閱 [我無法連線至 Secrets Manager](#access-secrets-manager)。

1. 檢查 `requirements.txt`。確認 中列出的 Airflow "extras" `requirements.txt` 套件和其他程式庫與您的 Apache Airflow 版本相容。

1. 探索在`requirements.txt`檔案中指定 Python 相依性的方法，請參閱 [在 requirements.txt 中管理 Python 相依性](best-practices-dependencies.md)。

### 我收到`The scheduler does not seem to be running`錯誤
<a name="error-scheduler-202"></a>

如果排程器似乎未執行，或幾小時前收到最後一個「心跳」，您的 DAGs 可能不會列在 Apache Airflow 中，也不會排定新任務。

建議下列步驟：

1. 確認您的 VPC 安全群組允許傳入存取連接埠 `5432`。需要此連接埠才能連線至您環境的 Amazon Aurora PostgreSQL 中繼資料資料庫。新增此規則後，請給 Amazon MWAA 幾分鐘的時間，錯誤可能會消失。若要進一步了解，請參閱 [Amazon MWAA 上 VPC 的安全性](vpc-security.md)。
**注意**  
Aurora PostgreSQL 中繼資料庫是 [Amazon MWAA 服務架構](what-is-mwaa.md#architecture-mwaa)的一部分，不適用於您的 AWS 帳戶。
資料庫相關錯誤通常是排程器失敗的徵狀，而不是根本原因。

1. 如果排程器未執行，可能是因為[相依性安裝失敗](best-practices-dependencies.md)或[排程器過載](best-practices-tuning.md)等多種因素。透過存取 CloudWatch Logs 中的對應日誌群組，確認您的 DAGs、外掛程式和需求正常運作。若要進一步了解，請參閱 [Amazon Managed Workflows for Apache Airflow 的監控和指標](cw-metrics.md)。

## 任務​
<a name="troubleshooting-tasks-202"></a>

下列主題說明 環境中 Apache Airflow 任務可能收到的錯誤。

### 我讓任務停滯或未完成
<a name="stranded-tasks-202"></a>

如果您的 Apache Airflow 任務「卡住」或未完成，建議您執行下列步驟：

1. 定義了大量 DAGs。減少 DAGs 數量並執行環境更新 （例如變更日誌層級），以強制重設。

   1. 無論是否啟用，氣流都會剖析 DAGs。如果您使用的是環境容量的 50% 以上，您可能會開始讓 Apache Airflow 排程器負擔過重。這會導致 CloudWatch 指標中的大量*總剖析時間*，或 CloudWatch Logs 中的長 DAG 處理時間。還有其他方法可以最佳化本指南範圍之外的 Apache Airflow 組態。

   1. 若要進一步了解我們建議調整環境效能的最佳實務，請參閱 [Amazon MWAA 上 Apache Airflow 的效能調校](best-practices-tuning.md)。

1. 佇列中可能會有大量任務。這通常顯示為大型且不斷增加`None`的 狀態任務數量，或在 `Queued Tasks`和/或 CloudWatch `Tasks Pending` 中顯示為大型任務數量。發生這種情況的原因如下：

   1. 如果執行的任務超過環境的容量，和/或在自動調整規模之前排入佇列的大量任務，則有時間偵測任務並部署額外的工作者。

   1. 如果執行的任務數量多於環境的容量，建議您**減少** DAGs 同時執行的任務數量，和/或增加 Apache Airflow 工作者人數下限。

   1. 如果有許多任務在自動擴展有時間偵測和部署其他工作者之前排入佇列，我們建議**交錯**任務部署和/或增加 Apache Airflow 工作者人數下限。

   1. 您可以使用 AWS Command Line Interface (AWS CLI) 中的 [update-environment](https://docs.aws.amazon.com/cli/latest/reference/mwaa/update-environment.html) 命令來變更在您環境中執行的工作者數量下限或上限。

      ```
      aws mwaa update-environment --name MyEnvironmentName --min-workers 2 --max-workers 10
      ```

   1. 若要進一步了解我們建議調整環境效能的最佳實務，請參閱 [Amazon MWAA 上 Apache Airflow 的效能調校](best-practices-tuning.md)。

1. 如果您的任務卡在「執行中」狀態，您也可以清除任務或將其標記為成功或失敗。這可讓環境的自動擴展元件縮減環境上執行的工作者數量。下圖描述了絞線任務的範例。  
![\[這是具有絞線任務的映像。\]](http://docs.aws.amazon.com/zh_tw/mwaa/latest/userguide/images/mwaa-airflow-scaling.png)

   1. 選擇絞線任務的圓圈，然後選取**清除** （如圖所示）。這可讓 Amazon MWAA 縮減工作者規模；否則，Amazon MWAA 無法判斷要啟用或停用哪些 DAGs，如果仍有佇列的任務，則無法縮減規模。  
![\[Apache Airflow 動作\]](http://docs.aws.amazon.com/zh_tw/mwaa/latest/userguide/images/mwaa-airflow-scaling-menu.png)

1. 請參閱《Apache Airflow 參考指南》中的[概念](https://airflow.apache.org/docs/apache-airflow/stable/concepts.html#task-lifecycle)，進一步了解 Apache Airflow 任務生命週期。 **

### 我在 Airflow v3 中收到沒有日誌的任務失敗
<a name="failed-task-no-log"></a>

如果您的 Apache Airflow 3 任務在沒有日誌的情況下失敗，請遵循下列步驟：
+ 如果工作者日誌出現錯誤，例如任務失敗時`Task handler raised error: WorkerLostError('Worker exited prematurely: exitcode 15 Job: 12.')`，這表示指派給任務的分叉工作者程序可能意外終止。

  若要解決此問題，請考慮使用相同的最小值和最大值來設定 celery.worker\$1autoscale。例如：

  ```
  celery.worker_autoscale=5,5  # for mw1.small
  celery.worker_autoscale=10,10 # for mw1.medium
  celery.worker_autoscale=20,20 # for mw1.large
  ```

  這可確保工作者集區大小保持固定，防止工作者意外終止。

## CLI
<a name="troubleshooting-cli-202"></a>

下列主題說明您在 中執行 Airflow CLI 命令時可能收到的錯誤 AWS Command Line Interface。

### 在 CLI 中觸發 DAG 時收到「503」錯誤
<a name="cli-toomany-202"></a>

Airflow CLI 在 Apache Airflow Webserver 上執行，其並行有限。一般而言，最多可以同時執行 4 個 CLI 命令。

### 為什麼 `dags backfill` Apache Airflow CLI 命令會失敗？ 是否有解決方法？
<a name="troubleshooting-cli-backfill"></a>

**注意**  
以下僅適用於 Apache Airflow v2.0.2 環境。

與其他 Apache Airflow CLI 命令一樣， `backfill`命令會在本機剖析所有 DAGs，再處理任何 DAGs，無論 CLI 操作套用到哪個 DAG。在使用 Apache Airflow 2.0.2 版的 Amazon MWAA 環境中，因為在 CLI 命令執行時，外掛程式和需求尚未安裝在 Web 伺服器上、剖析操作失敗，而且未叫用 `backfill`操作。如果您在環境中沒有任何需求或外掛程式，`backfill`操作將會成功。

若要能夠執行 `backfill` CLI 命令，建議您在 bash 運算子中叫用它。在 bash 運算子中， 從工作者`backfill`啟動，允許 DAGs 成功剖析，因為所有必要的要求和 plguins 都可用並安裝。使用下列範例建立具有 的 DAG`BashOperator`，以執行 `backfill`。

```
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.utils.dates import days_ago

with DAG(dag_id="backfill_dag", schedule_interval=None, catchup=False, start_date=days_ago(1)) as dag:
    cli_command = BashOperator(
        task_id="bash_command",
        bash_command="airflow dags backfill my_dag_id"
    )
```

## 運算子
<a name="troubleshooting-operators-202"></a>

下列主題說明使用 Operators 時可能收到的錯誤。

### 我使用 S3Transform 運算子收到`PermissionError: [Errno 13] Permission denied`錯誤
<a name="op-s3-transform"></a>

如果您嘗試使用 *S3Transform* 運算子執行 Shell 指令碼，且收到`PermissionError: [Errno 13] Permission denied`錯誤，建議您執行下列步驟。下列步驟假設您擁有現有的 plugins.zip 檔案。如果您要*建立新的* plugins.zip，請參閱 [安裝自訂外掛程式](configuring-dag-import-plugins.md)。

1. 在 GitHub 上使用 [aws-mwaa-docker-images](https://github.com/aws/amazon-mwaa-docker-images)，在本機測試您的 DAGs、自訂外掛程式和 Python 相依性。

1. 建立您的「轉換」指令碼。

   ```
   #!/bin/bash
   cp $1 $2
   ```

1. （選用） macOS 和 Linux 使用者可能需要執行下列命令，以確保指令碼可執行。

   ```
   chmod 777 transform_test.sh
   ```

1. 將指令碼新增至您的 plugins.zip。

   ```
   zip plugins.zip transform_test.sh
   ```

1. 請遵循[上傳 plugins.zip 至 Amazon S3](configuring-dag-import-plugins.md#configuring-dag-plugins-upload) 中的步驟。

1. 請遵循 [Amazon MWAA 主控台上指定 plugins.zip 版本](configuring-dag-import-plugins.md#configuring-dag-plugins-s3-mwaaconsole)中的步驟。

1. 建立下列 DAG。

   ```
   from airflow import DAG
   						from airflow.providers.amazon.aws.operators.s3_file_transform import S3FileTransformOperator
   						from airflow.utils.dates import days_ago
   						import os
   						
   						DAG_ID = os.path.basename(__file__).replace(".py", "")
   						
   						with DAG (dag_id=DAG_ID, schedule_interval=None, catchup=False, start_date=days_ago(1)) as dag:
   						file_transform = S3FileTransformOperator(
   						task_id='file_transform',
   						transform_script='/usr/local/airflow/plugins/transform_test.sh',
   						source_s3_key='s3://amzn-s3-demo-bucket/files/input.txt',
   						dest_s3_key='s3://amzn-s3-demo-bucket/files/output.txt'
   						)
   ```

1. 請遵循將 [DAG 程式碼上傳至 Amazon S3](configuring-dag-folder.md#configuring-dag-folder-uploading) 中的步驟。