

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 故障排除： DAGs、操作员、连接和其他问题
<a name="t-apache-airflow-202"></a>

本页的主题介绍了 Apache Airflow v2 和 v3 Python 依赖项、自定义 DAGs插件、操作员、连接、任务以及您在适用于 Apache Airflow 的亚马逊托管工作流程环境中可能遇到的网络服务器问题的解决方案。

**Contents**
+ [Connections](#troubleshooting-conn-202)
  + [我无法连接 Secrets Manager](#access-secrets-manager)
  + [如何在我的执行角色策略中配置 `secretsmanager:ResourceTag/<tag-key>` Secrets Manager 条件或资源限制？](#access-secrets-manager-condition-keys)
  + [我无法连接 Snowflake](#missing-snowflake)
  + [我无法在 Airflow UI 中找到我的连接](#connection-type-missing)
+ [Webserver](#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)

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

以下主题描述了您在使用 Apache Airflow 连接或其他数据库时可能收到的错误。 AWS 

### 我无法连接 Secrets Manager
<a name="access-secrets-manager"></a>

我们建议您完成以下步骤：

1. 了解如何为 Apache Airflow 连接和变量创建密钥，请参阅 [使用密钥配置 Apache Airflow 连接 AWS Secrets Manager](connections-secrets-manager.md)。

1. 要了解如何使用 Apache Airflow 变量 (`test-variable`) 的密钥，请参阅 [为 Apache Airflow 变量使用 AWS Secrets Manager 中的密钥](samples-secrets-manager-var.md)。

1. 要了解如何使用密钥进行 Apache Airflow 连接 (`myconn`)，请参阅 [使用 AWS Secrets Manager 中的密钥进行 Apache Airflow 连接](samples-secrets-manager.md)。

### 如何在我的执行角色策略中配置 `secretsmanager:ResourceTag/<tag-key>` Secrets Manager 条件或资源限制？
<a name="access-secrets-manager-condition-keys"></a>

**注意**  
适用于 Apache Airflow 版本 2.0 及更早版本。

目前，由于 Apache Airflow 中存在已知问题，您无法通过在环境的执行角色中使用条件密钥或其他资源限制来限制对 Secrets Manager 密钥的访问。

### 我无法连接 Snowflake
<a name="missing-snowflake"></a>

我们建议您完成以下步骤：

1. 使用[aws-mwaa-docker-images](https://github.com/aws/amazon-mwaa-docker-images)在本地测试你的 DAGs自定义插件和 Python 依赖关系 GitHub。

1. 将以下条目添加到适合环境的 requirements.txt 中。

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

1. 将以下导入添加至 DAG：

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

确保 Apache Airflow 连接对象包含以下键值对：

1. **连接 ID：**snowflake\$1conn

1. **连接类型：**Snowflake

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

1. **Schema：**<my schema>

1. **登录：**<my user name>

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. 要了解如何交替使用 Apache Airflow UI 中的连接模板来处理 Amazon MWAA 上的 Apache Airflow UI 中没有的连接类型，请参阅 [连接类型概述](manage-connection-types.md)。

## Webserver
<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`。验证在 `requirements.txt` 中列出的 Airflow “Extras”程序包和其他库是否与 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 元数据库是[亚马逊 MWAA 服务架构的一部分，在](what-is-mwaa.md#architecture-mwaa)您的中不可用。 AWS 账户
与数据库相关的错误通常是计划程序失败的症状，而不是根本原因。

1. 如果计划程序未运行，则可能是由于多种因素造成的，例如[依赖项安装失败](best-practices-dependencies.md)或[计划程序过载](best-practices-tuning.md)。通过访问日志中的 CloudWatch 相应日志组，确认您的 DAGs插件和要求是否正常运行。要了解更多信息，请参阅 [Amazon MWAA 的监控和指标](cw-metrics.md)。

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

以下主题描述了在环境中执行 Apache Airflow 任务时可能收到的错误。

### 我的任务卡顿或者没有完成
<a name="stranded-tasks-202"></a>

如果 Apache Airflow 任务 “卡顿” 或未完成，我们建议您执行以下步骤：

1. 可能有大量 DAGs 已定义的。减少环境的数量 DAGs 并执行环境更新（例如更改日志级别）以强制重置。

   1. Airflow 会解析它们 DAGs 是否已启用。如果您使用的容量超过环境容量的 50%，则可能会开始让 Apache Airflow 计划程序不堪重负。这会导致 CloudWatch 指标中的*总解析时间过*长，或者 CloudWatch 日志中的 DAG 处理时间过长。还有其他优化 Apache Airflow 配置的方法，这些方法不在本指南的讨论范围之内。

   1. 要详细了解调整环境性能我们建议的最佳实践，请参阅 [Amazon MWAA 上的 Apache Airflow 的性能调整](best-practices-tuning.md)。

1. 队列中可能有大量任务。这通常表现为该`None`州大量且不断增长的任务，或者显示为大量任务。`Queued Tasks` and/or `Tasks Pending` CloudWatch出现此错误的原因如下：

   1. 如果要运行的任务多于环境的运行能力， and/or 则在自动缩放之前排队的大量任务有时间检测任务并部署更多工作人员。

   1. 如果要运行的任务多于环境的运行能力，我们建议**减少同时**运行的任务数量， and/or 增加 Apache DAGs Airflow 工作线程的最低数量。

   1. 如果在自动缩放有时间检测和部署更多工作人员之前有大量任务排队，我们建议**错**开任务部署，以 and/or 增加最少 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_cn/mwaa/latest/userguide/images/mwaa-airflow-scaling.png)

   1. 选择滞留任务的圆圈，然后选择**清除**（如图所示）。这允许 Amazon MWAA 缩减员工规模；否则，如果仍有排队的任务，Amazon MWAA 无法确定 DAGs 哪些已启用或禁用，也无法缩小规模。  
![\[Apache Airflow 操作\]](http://docs.aws.amazon.com/zh_cn/mwaa/latest/userguide/images/mwaa-airflow-scaling-menu.png)

1. 要详细了解 Apache Airflow 任务生命周期，请参阅*《Apache Airflow 参考指南》*的[概念](https://airflow.apache.org/docs/apache-airflow/stable/concepts.html#task-lifecycle)。

### 我在 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>

以下主题介绍了您在 AWS Command Line Interface中运行 Airflow CLI 命令时可能收到的错误。

### 在 CLI 中触发 DAG 时我收到“503”错误
<a name="cli-toomany-202"></a>

Airflow CLI 在 Apache Airflow Web 服务器上运行，该服务器的并发性有限。通常，它最多可以同时运行 4 个 CLI 命令。

### 为什么 `dags backfill` Apache Airflow CLI 命令会失败？ 是否有解决方法？
<a name="troubleshooting-cli-backfill"></a>

**注意**  
以下内容仅适用于 Apache Airflow v2.0.2 环境。

与`backfill`其他 Apache Airflow CLI 命令一样，该命令在处理 DAGs 任何命令之前都会在本地解析 DAGs 所有命令，无论该 CLI 操作适用于哪个 DAG。在使用 Apache Airflow v2.0.2 的 Amazon MWAA 环境中，由于在 CLI 命令运行时，Web 服务器上尚未安装插件和要求，因此解析操作将失败，并且不会调用 `backfill` 操作。如果环境中没有任何要求或插件，则 `backfill` 操作将成功。

为了能够运行 `backfill` CLI 命令，我们建议在 bash 运算符中调用它。在 bash 运算符中，`backfill`是从工作程序启动的，允许成功解析，因为所有必要的需求和插件都可用并已安装。DAGs 按照以下示例使用 `BashOperator` 创建 DAG 来运行 `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>

以下主题描述了您在使用运算符时可能收到的错误。

### 我在使用 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. 使用[aws-mwaa-docker-images](https://github.com/aws/amazon-mwaa-docker-images)在本地测试你的 DAGs自定义插件和 Python 依赖关系 GitHub。

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)中的步骤进行操作。