requirements.txt での Python 依存関係の管理
このトピックでは、Amazon Managed Workflows for Apache Airflow 環境の requirements.txt ファイルに Python の依存関係をインストールして管理する方法について説明します。
目次
Amazon MWAA CLI ユーティリティを使用した DAG のテスト
-
コマンドラインインターフェイス (CLI) ユーティリティは、Amazon Managed Workflows for Apache Airflow 環境をローカルに複製します。
-
CLI は、Amazon MWAA のプロダクションイメージに似た Docker コンテナイメージをローカルでビルドします。Amazon MWAA にデプロイする前に、ローカルの Apache Airflow 環境を実行して DAG、カスタムプラグイン、依存関係を開発およびテストできます。
-
CLI を実行するには、GitHub の aws-mwaa-docker-images
を参照してください。
PyPI.org 要件ファイルフォーマットを使用した Python 依存関係のインストール
次のセクションでは、PyPI.org 要件ファイル形式
オプション 1: Python Package インデックスからの Python 依存関係
次のセクションでは、requirements.txt ファイルの Python Package インデックス
オプション 2: Python wheel (.whl)
Python wheel は、コンパイルされたアーティファクトをライブラリに同梱するために設計されたパッケージ形式です。Amazon MWAA に依存関係をインストールする方法として、ホイールパッケージにはいくつかの利点があります。
-
より速いインストール — WHL ファイルは 1 つの ZIP としてコンテナにコピーされ、ローカルにインストールされます。各ファイルをダウンロードする必要はありません。
-
より少ないコンフリクト — パッケージのバージョン互換性を事前に判断できます。その結果、
pipが互換性のあるバージョンを再帰的に調べる必要がなくなります。 -
耐障害性の向上 — 外部でホストされているライブラリでは、ダウンストリームの要件が変更され、Amazon MWAA 環境上のコンテナ間でバージョン互換性がなくなる可能性があります。依存関係を外部ソースに依存しないことで、各コンテナがいつインスタンス化されたかに関係なく、上のすべてのコンテナに同じライブラリが割り当てられます。
requirements.txt の Python wheel アーカイブ (.whl) から Python 依存関係をインストールするには、次の方法をお勧めします。
Amazon S3 バケット上の plugins.zip ファイルを使用する
Apache Airflow スケジューラー、ワーカー、ウェブサーバー (Apache Airflow v2.2.2 以降用) は、起動時に、/usr/local/airflow/plugins/ でお使いの環境の AWS マネージド Fargate コンテナーでカスタムプラグインを検索します。このプロセスは、Python 依存関係および Apache Airflow サービスの起動のための Amazon MWAA の *pip3 install -r requirements.txt 前に始まります。plugins.zip ファイルは、環境実行中に継続的に変更されたくないファイル、またはDAGを作成するユーザーにアクセス権を与えたくないファイルに使用できます。例えば、Python ライブラリのホイールファイル、証明書 PEM ファイル、設定 YAML ファイルなどです。
次のセクションでは、plugins.zip ファイルにあるホイールを Amazon S3 バケットにインストールする方法について説明します。
-
必要な WHL ファイルをダウンロードします。Amazon MWAA aws-mwaa-docker-images
または別の Amazon Linux 2 コンテナにある既存の requirements.txtとpip downloadを使用して、必要な 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でパスを指定します。次のコードに示すように、requirements.txt の先頭に--find-linksを使用してプラグインディレクトリを指定し、 pipに他のソースからインストールしないように--no-indexを用いて指示します。ースからインストールしないように指示します。 --find-links /usr/local/airflow/plugins --no-index例 requirements.txt 内のホイール
次の例では、Amazon S3 バケットのルートにある
plugins.zipファイルにホイールをアップロードしたことを前提としています。例:--find-links /usr/local/airflow/plugins --no-index numpyAmazon MWAA は
pluginsフォルダからnumpy-1.20.1-cp37-cp37m-manylinux1_x86_64.whlホイールを取得し、環境にインストールします。
URL にホストされている WHL ファイルを使用する
次のセクションでは、URL でホストされるホイールをインストールする方法について説明します。URL は、パブリックにアクセス可能であるか、Amazon MWAA 環境用に指定したカスタム Amazon VPC 内からアクセスできる必要があります。
-
URL を指定してください。
requirements.txt内のホイールの URL を指定します。例 公開 URL でのホイールアーカイブ
次の例では、公開サイトからホイールをダウンロードします。
--find-links https://files.pythonhosted.org/packages/ --no-indexAmazon MWAA は、指定した URL からホイールを取得し、お使いの環境にインストールします。
注記
Amazon MWAA v2.2.2 以降では、要件をインストールするプライベートウェブサーバーから URL にアクセスすることはできません。
DAG から WHL ファイルを作成
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 として使用します。オプションで、他のプラグインと一緒にパッケージ化することもできます。次に、--constraint を追加せずに --find-links /usr/local/airflow/plugins および --no-index の前に requirements.txt を更新してください。
この方法では、同じライブラリをオフラインで使用できます。
オプション3: PyPI/PEP-503 準拠のプライベートリポジトリでホストされている Python の依存関係
次のセクションでは、認証付きのプライベート URL でホストされている Apache Airflow エクストラをインストールする方法について説明します。
-
ユーザー名とパスワードを 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 実行ロール を参照してください。
Apache Airflow ログは INFO、WARNING、ERROR または CRITICAL レベルで有効にできます。ログレベルを選択すると、Amazon MWAA はそのレベルとそれ以上の重要度レベルのすべてのログを送信します。例えば、INFO レベルでログを有効にすると、Amazon MWAA は INFO ログと WARNING、ERROR、CRITICAL のログレベルを CloudWatch Logs に送信します。requirements.txt で受信したログをスケジューラーにアクセスできるように、INFO レベルで Apache Airflow ログを有効にすることをお勧めします。
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 へのログイン
Apache Airflow UI にアクセスするためには、AWS Identity and Access Management (IAM) で AWS アカウント に対して Apache Airflow UI アクセスポリシー: AmazonMWAAWebServerAccess のアクセス許可が必要です。
Apache Airflow UI にアクセスするには
-
Amazon MWAA コンソールで、環境ページ
を開きます。 -
環境を選択します。
-
Airflow UI を開く を選択します。
requirements.txt シナリオ例
requirements.txt では異なるフォーマットを組み合わせることができます。次の例では、さまざまな方法を組み合わせてエクストラをインストールしています。
例 PyPI.org のエクストラとパブリック 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