requirements.txt での Python 依存関係の管理 - Amazon Managed Workflows for Apache Airflow

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

requirements.txt での Python 依存関係の管理

このページでは、Amazon Managed Workflows for Apache Airflow 環境の requirements.txt ファイルに Python の依存関係をインストールして管理するために推奨するベストプラクティスについて説明します。

Amazon MWAACLIユーティリティDAGsを使用したテスト

  • コマンドラインインターフェイス (CLI) ユーティリティは、Amazon Managed Workflows for Apache Airflow 環境をローカルにレプリケートします。

  • は、Amazon MWAA本番稼働用イメージと同様の Docker コンテナイメージをローカルにCLI構築します。これにより、Amazon にデプロイする前に、ローカル Apache Airflow 環境を実行してDAGs、、カスタムプラグイン、依存関係を開発およびテストできますMWAA。

  • を実行するにはCLI、「」のaws-mwaa-local-runner「」を参照してください GitHub。

PyPi.org 要件ファイル形式を使用した Python 依存関係のインストール

次のセクションでは、 PyPi.org 要件ファイル形式 に従って Python 依存関係をインストールするさまざまな方法について説明します。

オプション 1: Python Package インデックスからの Python 依存関係

次のセクションでは、requirements.txt ファイルの Python Package インデックスから Python 依存関係を指定する方法について説明します。

Apache Airflow v2
  1. ローカルでテストしますrequirements.txt ファイルを作成する前に、ライブラリを繰り返し追加してパッケージとバージョンの適切な組み合わせを見つけてください。Amazon MWAACLIユーティリティを実行するには、「」のaws-mwaa-local-runner「」を参照してください GitHub。

  2. Apache Airflow パッケージのエクストラを確認してください。Amazon で Apache Airflow v2 にインストールされているパッケージのリストを表示するにはMWAA、 GitHub ウェブサイトの「Amazon MWAA local runnerrequirements.txt」を参照してください。

  3. 制約ステートメントを追加します。Apache Airflow v2 環境用の制約ファイルを requirements.txt ファイルの先頭に追加します。Apache Airflow の制約ファイルには、Apache Airflow のリリース時点で利用可能なプロバイダーのバージョンが指定されています。

    Apache Airflow v2.7.2 から、要件ファイルには --constraint ステートメントを含める必要があります。制約を指定しない場合、Amazon MWAAは要件に記載されているパッケージが使用している Apache Airflow のバージョンと互換性があることを確認するために制約を指定します。

    次の例では、{environment-version} 環境のバージョン番号、および {Python-version} ご使用の環境と互換性のある Python のバージョンを使用します。

    Apache Airflow 環境と互換性のある Python のバージョンについては、「Apache Airflow バージョン」を参照してください。

    --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-{Airflow-version}/constraints-{Python-version}.txt"

    制約ファイルが xyz==1.0 パッケージが環境内の他のパッケージと互換性がないと判断した場合、pip3 install は環境に互換性のないライブラリがインストールされるのを防ぐために失敗しま す。パッケージのインストールに失敗した場合、各 Apache Airflow コンポーネント (スケジューラ、ワーカー、ウェブサーバー) のエラーログを、対応するログストリームで CloudWatch Logs に表示できます。ログタイプの詳細については、「Amazon での Airflow ログの表示 CloudWatch」を参照してください。

  4. Apache Airflow パッケージ。パッケージエクストラとバージョン (==) を追加します。これにより、同じ名前で異なるバージョンのパッケージが環境にインストールされるのを防ぐことができます。

    apache-airflow[package-extra]==2.5.1
  5. Python ライブラリ パッケージ名とバージョン (==) を requirements.txt ファイルに追加します。これにより、PyPi.org からの将来の重大な更新が自動的に適用されないようにできます。

    library == version
    例 Boto3 と psycopg2-binary

    この例は、デモンストレーションのみを目的としています。boto と psycopg2 のバイナリライブラリは Apache Airflow v2 のベースインストールに含まれており、requirements.txt ファイルで指定する必要はありません。

    boto3==1.17.54 boto==2.49.0 botocore==1.20.54 psycopg2-binary==2.8.6

    バージョンなしでパッケージが指定されている場合、Amazon は PyPi.org から最新バージョンのパッケージMWAAをインストールします。このバージョンは、お客様の requirements.txt 内の他のパッケージと競合する可能性があります。

Apache Airflow v1
  1. ローカルでテストしますrequirements.txt ファイルを作成する前に、ライブラリを繰り返し追加してパッケージとバージョンの適切な組み合わせを見つけてください。Amazon MWAACLIユーティリティを実行するには、「」のaws-mwaa-local-runner「」を参照してください GitHub。

  2. Airflow パッケージのエクストラを確認してください。Apache Airflow v1.10.12 で利用可能なパッケージのリストは、https://raw.githubusercontent.com/apache/「airflow/constraints-1.10.12/constraints-3.7.txt」で確認してください。

  3. 制約ファイルを追加します。Apache Airflow v1.10.12 の制約ファイルを requirements.txt ファイルの先頭に追加します。制約ファイルが xyz==1.0 パッケージが環境内の他のパッケージと互換性がないと判断した場合、pip3 install は環境に互換性のないライブラリがインストールされるのを防ぐために失敗しま す。

    --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-1.10.12/constraints-3.7.txt"
  4. Apache Airflow v1.10.12 パッケージAirflow パッケージエクストラと Apache Airflow v1.10.12 バージョン (==) を追加します。これにより、同じ名前で異なるバージョンのパッケージが環境にインストールされるのを防ぐことができます。

    apache-airflow[package]==1.10.12
    例 セキュアシェル (SSH)

    次のサンプルrequirements.txtファイルは、Apache Airflow v1.10.12 SSH用に をインストールします。

    apache-airflow[ssh]==1.10.12
  5. Python ライブラリ パッケージ名とバージョン (==) を requirements.txt ファイルに追加します。これにより、PyPi.org からの将来の重大な更新が自動的に適用されないようにできます。

    library == version
    例 Boto3

    次の例では、requirements.txt ファイルは、Apache Airflow v1.10.12 用の Boto3 ライブラリをインストールします。

    boto3 == 1.17.4

    バージョンなしでパッケージが指定されている場合、Amazon は PyPi.org から最新バージョンのパッケージMWAAをインストールします。このバージョンは、お客様の requirements.txt 内の他のパッケージと競合する可能性があります。

オプション 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 以降用) は、 の環境の AWSマネージド Fargate コンテナで起動時にカスタムプラグインを探します/usr/local/airflow/plugins/*。このプロセスは、Amazon MWAAの for Python pip3 install -r requirements.txt の依存関係と Apache Airflow サービスの起動の前に開始されます。plugins.zip ファイルは、環境の実行中に継続的に変更したくないファイルや、 を書き込むユーザーにアクセス権を付与したくないファイルに使用されますDAGs。例えば、Python ライブラリのホイールファイル、証明書PEMファイル、設定YAMLファイルなどです。

次のセクションでは、plugins.zip ファイルにあるホイールを Amazon S3 バケットにインストールする方法について説明します。

  1. 必要なWHLファイルをダウンロードします。Amazon MWAA local-runner または別の 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" *
  2. 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 numpy

    Amazon MWAA は pluginsフォルダからnumpy-1.20.1-cp37-cp37m-manylinux1_x86_64.whlホイールを取得し、環境にインストールします。

でホストされているWHLファイルの使用 URL

次のセクションでは、 でホストされているホイールをインストールする方法について説明しますURL。は、パブリックにアクセス可能であるか、Amazon MWAA環境にVPC指定したカスタム Amazon 内からアクセス可能であるURL必要があります。

  • を指定しますURL。のホイールURLに を指定しますrequirements.txt

    例 パブリックのホイールアーカイブ URL

    次の例では、公開サイトからホイールをダウンロードします。

    --find-links https://files.pythonhosted.org/packages/ --no-index

    Amazon MWAA は、URL指定した からホイールを取得し、環境にインストールします。

    注記

    URLs は、Amazon v2.2.2 MWAA 以降で要件をインストールするプライベートウェブサーバーからアクセスできません。

からのWHLファイルの作成 DAG

Apache Airflow v2.2.2 以降を使用するプライベートウェブサーバーがあり、環境が外部リポジトリにアクセスできないために要件をインストールできない場合は、以下を使用して既存の Amazon MWAA要件DAGを取得し、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://{S3_BUCKET}/{S3_KEY}" )

を実行したらDAG、この新しいファイルを Amazon MWAA として使用します。plugins.zipオプションで、他のプラグインにパッケージ化されています。次に、 を追加--no-indexせずにrequirements.txt、 の前に --find-links /usr/local/airflow/pluginsと を更新します--constraint

この方法では、同じライブラリをオフラインで使用できます。

オプション 3: プライベート PyPi/PEP-503 準拠リポジトリでホストされる Python 依存関係

次のセクションでは、認証URLを使用してプライベートでホストされる Apache Airflow エクストラをインストールする方法について説明します。

  1. ユーザー名とパスワードを Apache Airflow 構成オプションとして追加します。例:

    • foo.user : YOUR_USER_NAME

    • foo.pass : YOUR_PASSWORD

  2. requirements.txt ファイルを作成します。次の例のプレースホルダーをプライベート に置き換えURL、Apache Airflow 設定オプション として追加したユーザー名とパスワードに置き換えます。例:

    --index-url https://${AIRFLOW__FOO__USER}:${AIRFLOW__FOO__PASS}@my.privatepypi.com
  3. その他のライブラリを 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 ログは INFOWARNINGERROR または CRITICAL レベルで有効にできます。ログレベルを選択すると、Amazon はそのレベルと重要度の高いレベルのログMWAAを送信します。例えば、 INFOレベルでログを有効にすると、Amazon MWAAはINFOログと WARNINGERROR、および CRITICALログレベルを CloudWatch Logs に送信します。requirements.txt で受信したログをスケジューラーに表示できるように、INFO レベルで Apache Airflow ログを有効にすることをお勧めします。

このイメージは、 INFO レベルでログを有効にする方法を示しています。

Logs コンソールでの CloudWatch ログの表示

ワークフローのスケジュール設定と dags フォルダーの解析を行うスケジューラーの Apache Airflow ログを表示できます。次の手順では、Amazon MWAAコンソールでスケジューラのロググループを開き、Logs コンソールで Apache Airflow CloudWatch ログを表示する方法について説明します。

requirements.txt のログを表示するには
  1. Amazon MWAAコンソールで環境ページを開きます。

  2. 環境を選択します。

  3. [モニタリング] ペインで [Airflow スケジューラーロググループ] を選択します。

  4. [ログストリーム]requirements_install_ip ログを選択します。

  5. /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))
  6. パッケージのリストを確認し、インストール中にエラーが発生したパッケージがないか確認してください。何か問題が発生した場合、以下のようなエラーが表示されることがあります。

    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 で Apache Airflow で発生する可能性のある最も一般的なエラーMWAAは次のとおりです。

Broken DAG: No module named x

Apache Airflow UI にこのエラーが表示される場合は、requirements.txt のファイルに必要な依存関係が欠けている可能性があります。

Apache Airflow へのログイン

Apache Airflow UI を表示するには、 AWS Identity and Access Management (IAM) の AWS アカウントのApache Airflow UI アクセスポリシー: AmazonMWAAWebServerAccessアクセス許可が必要です。

Apache Airflow UI にアクセスするには
  1. Amazon MWAAコンソールで環境ページを開きます。

  2. 環境を選択します。

  3. [Airflow UI を開く] を選択します。

requirements.txt シナリオ例

requirements.txt では異なるフォーマットを組み合わせることができます。次の例では、さまざまな方法を組み合わせてエクストラをインストールしています。

例 PyPi.org とパブリックの追加 URL

カスタム 503 準拠リポジトリ などのパブリック のパッケージに加えてURL、 PyPi.org PEP からパッケージを指定する場合は、 --index-urlオプションを使用する必要がありますURLs。

aws-batch == 0.6 phoenix-letter >= 0.3 --index-url http://dist.repoze.org/zope2/2.10/simple zopelib