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

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

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

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

Amazon MWAA CLI ユーティリティを使用した DAG のテスト

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

  • CLI は、Amazon MWAA のプロダクションイメージに似た Docker コンテナイメージをローカルでビルドします。これにより、Amazon MWAA にデプロイする前に、ローカルの Apache Airflow 環境を実行して DAG、カスタムプラグイン、依存関係を開発およびテストできます。

  • 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 MWAA CLI ユーティリティを実行するには、「」の「aws-mwaa-local-runner」を参照してください GitHub。

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

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

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

    次の例では、{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 MWAA は PyPi.org から最新バージョンのパッケージをインストールします。このバージョンは、お客様の requirements.txt 内の他のパッケージと競合する可能性があります。

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

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

  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. アパッチ・エアフロー v1.10.12 パッケージ。「Airflow パッケージエクストラ」と Apache Airflow v1.10.12 バージョン (==) を追加します。これにより、同じ名前で異なるバージョンのパッケージが環境にインストールされるのを防ぐことができます。

    apache-airflow[package]==1.10.12
    例 Secure Shell (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 MWAA は PyPi.org から最新バージョンのパッケージをインストールします。このバージョンは、お客様の 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/*。このプロセスは、Python 依存関係および Apache Airflow サービスの起動のための Amazon MWAA の pip3 install -r requirements.txt 前に始まります。plugins.zip ファイルは、環境実行中に継続的に変更されたくないファイル、またはDAGを作成するユーザーにアクセス権を与えたくないファイルに使用できます。たとえば、Python ライブラリのホイールファイル、証明書 PEM ファイル、構成 YAML ファイルなどです。

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

  1. 必要な WHL ファイルをダウンロードします。Amazon MWAA「ローカルランナー」または別の「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 ホイールを取得し、環境にインストールします。

URL にホストされている WHL ファイルを使用する

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

  • URL を指定してくださいrequirements.txt 内のホイールの URL を指定します。

    例 公開 URL でのホイールアーカイブ

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

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

    Amazon 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://{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ログと WARNINGERRORCRITICALログレベルを 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 MWAA の Apache Airflow で発生する可能性のある最も一般的なエラーは次のとおりです。

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 アクセスポリシー: AmazonMWAAWebServer アクセスアクセス許可が必要です。

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

  2. 環境を選択します。

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

requirements.txt シナリオ例

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

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

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

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