Amazon MWAA 環境にライブラリをインストールするにはどうすればいいですか。

最終更新日: 2022 年 3 月 2 日

Amazon Managed Workflows for Apache Airflow (Amazon MWAA) 環境にライブラリをインストールしたいと思っています。

簡単な説明

Amazon MWAA 環境を作成すると、Apache Airflow の基本インストールにいくつかの基本パッケージ/ディストリビューションが取り込まれます。Amazon MWAA 環境の requirements.txt または plugins.zip ファイルを使用して、基本インストールに取り込まれたパッケージとは別のパッケージをインストールできます。

デフォルトでは、パッケージはパブリックリポジトリ (PyPi.org) から Amazon MWAA にインストールされます。JFROG や AWS CodeArtifact など、プライベートにホストされているリポジトリからパッケージをインストールすることもできます。

解決方法

ライブラリは、デフォルトのパブリックリポジトリ (PyPi.org) またはプライベートリポジトリからインストールできます。ユースケースに最も適したアプローチを選択してください。

パブリックリポジトリからインストールする

デフォルトのパブリックリポジトリからパッケージをインストールするには、requirements.txt ファイルにパッケージ名とバージョン (==) を追加するだけです。次に、requirements.txt ファイルを Simple Storage Service (Amazon S3) バケットにアップロードします。Amazon MWAA コンソールを使用して環境を更新するときに、[Requirements file] (要件ファイル) フィールドにこのファイルのバージョンを指定します。

プライベートリポジトリまたはローカルリポジトリからインストールする

パブリックリポジトリからパッケージをインストールするためのインターネットアクセスが環境にない場合、プライベートにホストされている PyPi リポジトリからライブラリ/カスタムパッケージをインストールできます。そのためには、すべてのパッケージをダウンロードし、JFROG、AWS CodeArtifact、またはその他のリポジトリなどのローカルリポジトリにこれらのパッケージを取り込みます。パッケージをリポジトリに追加したら、リポジトリの URL を使用してこれらのパッケージをインポートします。プライベートライブラリをインポートするには、requirements.txt ファイルでリポジトリ URL (--index-url) を指定します。

ローカルリポジトリからパッケージ (例: redis==3.5.3) をインストールするには、次のいずれかのオプションを使用します。

プライベートリポジトリを使用している場合は、requirements.txt ファイルを更新して以下を取り込みます。

--trusted-host artifactory-aws.example-org.com
--index-url https://artifactory-aws.example-org.com/artifactory/api/pypi/pypi-virtual/simple
redis==3.5.3

JFROG リポジトリを使用している場合は、requirements.txt ファイルを更新して以下を取り込みます。

--index-url=https://${AIRFLOW__JFROG__USER}:${AIRFLOW__JFROG__PASS}@<server-name>.jfrog.io/artifactory/api/pypi/<repository>/simple
redis==3.5.3

requirements.txt ファイルに URL を直接追加する代わりに、--index-url をテキストファイルに取り込むこともできます。テキストファイル (codeartifact.txt など)--index-url を指定することで、codeartifact.txt/dags フォルダの下の S3 バケットにアップロードできます。

次に、 requirements.txt ファイルを更新して codeartifact.txt ファイルのパスを追加します。

-r /usr/local/airflow/dags/codeartifact.txt
<br>redis==3.5.3

以下の方法については、「Amazon MWAA for Analytics ワークショップ - プライベート PyPi リポジトリ」を参照してください。

注: このソリューションでは、codeartifact.txt ファイルを使用して--index-url を指定します。

  • AWS CodeArtifact を使用して、外部ソースに接続するプライベート PyPi リポジトリを作成します。
  • パブリックインターネットに接続せずにプライベート MWAA 環境をプロビジョニングし、VPC エンドポイントを活用して AWS CodeArtifact に接続します。
  • Lambda 関数を作成して、プライベート PyPi リポジトリの認可トークンを最新の状態に保ちます。

パッケージをインストールする

パブリックリポジトリまたはプライベートリポジトリからパッケージをインストールするには、requirement.txt ファイルを取り込むように環境を更新します。

  1. requirements.txt ファイルのローカルコピーを作成し、Simple Storage Service (Amazon S3) コンソールまたは AWS Command Line Interface (AWS CLI) を使用して、このコピーを Amazon Simple Storage Service (Amazon S3) バケット (例: s3://example-bucket/requirements.txt) にアップロードします。
    注: S3 バケットではバージョニングを必ずオンにしてください。
  2. 環境を編集するために、Amazon MWAA コンソールの [Environments] (環境) ページを開きます。
  3. リストから環境を選択し、[Edit] (編集) をクリックします。
    注:requirements.txt ファイルを初めて環境にアップロードする場合は、ステップ 4、5、6 に従います。既にファイルをアップロードして最近更新した場合は、ステップ 6 のみを実行します。
  4. [Specify details] (詳細の指定) ページの [DAG code in Amazon S3] (Simple Storage Service (Amazon S3) の DAG コード) セクションで、[Requirements file - optional] (要件ファイル - オプション) フィールドの [Browse S3] (S3 を参照) を選択します。
  5. Simple Storage Service (Amazon S3) バケット内の requirements.txt ファイルを選択した上で、[Choose] (選択) をクリックします。
  6. [Requirements file - optional] (要件ファイル - オプション) フィールドの [Choose a version] (バージョンの選択) で、アップロードした最新バージョンを選択します。
  7. [Next] (次へ) を選択してから [Save] (次へ) を選択します。

環境が更新された直後に、新しいパッケージの使用をスタートできます。

環境が更新されるまで 15~20 分かかります。環境が更新されると、requirements.txt ファイルにリストされているパッケージがインストールされます。従属関係が 10 分以内にインストールされない場合、AWS Fargate サービスがタイムアウトし、環境を安定した状態にロールバックしようとする可能性があります。

インストールプロセスのトラブルシューティング

これらのパッケージのインストール中に問題が発生した場合は、Apache Airflow Worker/Scheduler のいずれかのロググループからログファイル (requirements_install_ip) を表示できます。

ログファイルにパッケージエラーがある場合は、別のバージョンのパッケージを追加して、パッケージのインストールを再試行できます。requirements.txt ファイルの前に制約ファイルを付けるのがベストプラクティスです。

例:

--constraint "https://raw.githubusercontent.com/apache/airflow/constraints-example-Airflow-version/constraints-3.7.txt"

注: example-Airflow-version は必ずご使用の環境のバージョン番号に置き換えてください。

重要: Amazon MWAA 環境にパッケージをインストールする前に、Amazon MWAA CLI ユーティリティ (aws-mwaa-local-runner) を使用して Python の従属関係をテストすることがベストプラクティスです。