在 requirements.txt 中管理 Python 依赖项
本主题介绍了在 requirements.txt 文件中如何为 Amazon MWAA 环境安装和管理 Python 依赖项。
目录
使用 Amazon MWAA CLI 实用工具测试 DAG
-
命令行界面 (CLI) 实用工具可在本地复制 Amazon MWAA 环境。
-
CLI 在本地构建 Docker 容器镜像,类似于 Amazon MWAA 生产镜像。您可以使用它运行本地 Apache Airflow 环境来开发和测试 DAG、自定义插件和依赖项,然后部署到 Amazon MWAA。
-
要运行 CLI,请参阅 GitHub 上的 aws-mwaa-docker-images
。
使用 Pypi.org 要求文件格式安装 Python 依赖项
下一节介绍了根据 Pypi.org 要求文件格式
选项一:来自 Python 程序包索引的 Python 依赖关系
下一节介绍如何在 requirements.txt 文件中指定 Python 程序包索引
选项二:Python Wheel(.whl)
Python Wheel 是一种程序包格式,旨在发布包含已编译构件的库。将 Wheel 程序包作为在 Amazon MWAA 中安装依赖项的方法有几个好处:
-
安装速度更快 — WHL 文件作为单个 ZIP 文件复制到容器中,然后安装到本地,无需下载每个文件。
-
减少冲突-您可以提前确定程序包的版本兼容性。因此,无需
pip以递归方式计算出兼容版本。 -
更高的弹性 — 对于外部托管的库,下游要求可能会发生变化,从而导致 Amazon MWAA 环境中容器之间的版本不兼容。由于不依赖外部来源来获取依赖项,因此无论每个容器何时实例化,其上每个容器都有相同的库。
我们建议使用以下方法来安装 requirements.txt 中来自 Python Wheel 档案 (.whl) 的 Python 依赖项。
在 Amazon S3 存储桶上使用 plugins.zip 文件
在启动期间,Apache Airflow 计划程序、工作线程和 Web 服务器(适用于 Apache Airflow v2.2.2 及更高版本)在 /usr/local/airflow/plugins/ 中环境 AWS 托管的 Fargate 容器上搜索自定义插件。此过程在 Python 依赖项的 Amazon MWAA 的 *pip3 install -r requirements.txt 和 Apache Airflow 服务启动之前开始。plugins.zip 文件用于您在环境执行期间不想持续更改的任何文件,或者您可能不想向编写 DAG 的用户授予访问权限的任何文件。例如,Python 库 Wheel 文件、证书 PEM 文件和配置 YAML 文件。
下一节介绍如何在 Amazon S3 存储桶上安装 plugins.zip 文件中的 Wheel。
-
下载必要的 WHL 文件,您可以在 Amazon MWAA aws-mwaa-docker-images
或另一个 Amazon Linux 2 容器上,将 pip download和现有 requirements.txt一起使用来解析和下载必要的 Python Wheel 文件。pip3 download -r "$AIRFLOW_HOME/dags/requirements.txt" -d "$AIRFLOW_HOME/plugins"cd "$AIRFLOW_HOME/plugins"zip "$AIRFLOW_HOME/plugins.zip" * -
在
requirements.txt中指定路径。使用--find-links指定位于 requirements.txt 顶部的插件目录,并指示 pip不要使用--no-index从其他来源安装,如下面的代码所列: --find-links /usr/local/airflow/plugins --no-index例 在 requirements.txt 中的 wheel
以下示例假设您已将 Wheel 上传到 Amazon S3 存储桶根目录中的
plugins.zip文件中。例如:--find-links /usr/local/airflow/plugins --no-index numpyAmazon MWAA 从
plugins文件夹中提取numpy-1.20.1-cp37-cp37m-manylinux1_x86_64.whlWheel 并将其安装到环境中。
使用托管在 URL 上的 WHL 文件
下一节将介绍如何安装托管在 URL 上的 Wheel。此 URL 必须是可公开访问的,或者可以从您为 Amazon MWAA 环境指定的自定义 Amazon VPC 中访问。
-
提供 URL。向
requirements.txt中的 Wheel 提供 URL。例 公有 URL 上的 Wheel 档案
以下示例从公有站点下载 Wheel。
--find-links https://files.pythonhosted.org/packages/ --no-indexAmazon MWAA 从您指定的 URL 中获取 Wheel 并将其安装到环境中。
注意
从 Amazon MWAA v2.2.2 及更高版本中安装要求的私有 Web 服务器上无法访问 URL。
从 DAG 创建 WHL 文件
如果私有 Web 服务器使用 Apache Airflow v2.2.2 或更高版本,并且由于环境无法访问外部存储库而无法安装要求,则可以使用以下 DAG 来获取现有的 Amazon MWAA 要求并将其打包到 Amazon S3 上:
from airflow import DAG from airflow.operators.bash_operator import BashOperator from airflow.utils.dates import days_ago S3_BUCKET = 'my-s3-bucket' S3_KEY = 'backup/plugins_whl.zip' with DAG(dag_id="create_whl_file", schedule_interval=None, catchup=False, start_date=days_ago(1)) as dag: cli_command = BashOperator( task_id="bash_command", bash_command=f"mkdir /tmp/whls;pip3 download -r /usr/local/airflow/requirements/requirements.txt -d /tmp/whls;zip -j /tmp/plugins.zip /tmp/whls/*;aws s3 cp /tmp/plugins.zip s3://amzn-s3-demo-bucket/{S3_KEY}" )
运行 DAG 后,使用这个新文件作为 Amazon MWAA plugins.zip,也可以选择与其他插件一起打包。然后通过在前面添加 --find-links /usr/local/airflow/plugins 和 --no-index,但不添加 --constraint 来更新 requirements.txt。
此方法允许您离线使用相同的库。
选项三:Python 依赖项托管在兼容 PyPi/PEP-503 的私有存储库上
下一节介绍如何安装托管在私有 URL 上且经过身份验证的 Apache Airflow Extra。
-
将用户名和密码添加为 Apache Airflow 配置选项。例如:
-
foo.user:YOUR_USER_NAME -
foo.pass:YOUR_PASSWORD
-
-
创建
requirements.txt文件 用私有 URL 以及作为 Apache Airflow 配置选项添加的用户名和密码替换以下示例中的占位符。例如:--index-url https://${AIRFLOW__FOO__USER}:${AIRFLOW__FOO__PASS}@my.privatepypi.com -
将任何其他库添加到
requirements.txt文件中。例如:--index-url https://${AIRFLOW__FOO__USER}:${AIRFLOW__FOO__PASS}@my.privatepypi.com my-private-package==1.2.3
在 Amazon MWAA 控制台上启用日志
Amazon MWAA 环境的执行角色需要权限方可将日志发送到 CloudWatch Logs。要更新执行角色的权限,请参阅 Amazon MWAA 执行角色。
您可以启用 INFO、WARNING、ERROR 或 CRITICAL 级别的 Apache Airflow 日志。当您选择日志级别时,Amazon MWAA 会发送该级别和所有更高级别的严重性级别的日志。例如,如果您启用 INFO 级别日志,Amazon MWAA 会向 CloudWatch Logs 发送 INFO 日志以及 WARNING、ERROR、和 CRITICAL 日志级别。我们建议启用 INFO 级别的 Apache Airflow 日志,以便计划程序访问为 requirements.txt 收到的日志。
在 CloudWatch Logs 控制台上访问日志
您可以访问调度工作流程并解析 dags 文件夹的计划程序的 Apache Airflow 日志。以下步骤介绍如何在 Amazon MWAA 控制台上打开计划程序的日志组,以及如何在 CloudWatch Logs 控制台上访问 Apache Airflow 日志。
访问 requirements.txt 的日志
-
在 Amazon MWAA 控制台上打开环境页面
。 -
选择环境。
-
在监控窗格上选择 Airflow 计划程序日志组。
-
在日志流中选择
requirements_install_ip日志。 -
请参阅
/usr/local/airflow/.local/bin上环境中安装的程序包列表。例如:Collecting appdirs==1.4.4 (from -r /usr/local/airflow/.local/bin (line 1)) Downloading https://files.pythonhosted.org/packages/3b/00/2344469e2084fb28kjdsfiuyweb47389789vxbmnbjhsdgf5463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl Collecting astroid==2.4.2 (from -r /usr/local/airflow/.local/bin (line 2)) -
查看程序包列表以及其中任何程序包在安装过程中是否遇到错误。如果出现问题,您可能会收到类似以下内容的错误:
2021-03-05T14:34:42.731-07:00 No matching distribution found for LibraryName==1.0.0 (from -r /usr/local/airflow/.local/bin (line 4)) No matching distribution found for LibraryName==1.0.0 (from -r /usr/local/airflow/.local/bin (line 4))
在 Apache Airflow UI 中访问错误
您可能还需要检查 Apache Airflow UI,以确定错误是否与其他问题有关。在 Amazon MWAA 上使用 Apache Airflow 时,您可能遇到的最常见错误是:
Broken DAG: No module namedx
如果您在 Apache Airflow UI 中发现此错误,则 requirements.txt 文件中可能缺少必需的依赖项。
登录 Apache Airflow
您需要在 AWS Identity and Access Management (IAM) 中拥有 AWS 账户 的 Apache Airflow UI 访问策略:AmazonMWAAWebServerAccess 权限才能访问 Apache Airflow UI。
要访问 Apache Airflow UI,请执行以下操作
-
在 Amazon MWAA 控制台上打开环境页面
。 -
选择环境。
-
选择打开 Airflow UI。
示例 requirements.txt 应用场景
您可以在 requirements.txt 中混合搭配不同的格式。以下示例使用不同方式的组合来安装 Extras。
例 PyPi.org 上的 Extras 和公有 URL
除了在公有 URL 上指定程序包(例如兼容 PEP 503 的自定义 repo URL)之外,当从 PyPi.org 指定程序包时,您还需要使用 --index-url 选项。
aws-batch == 0.6 phoenix-letter >= 0.3 --index-url http://dist.repoze.org/zope2/2.10/simple zopelib