AWS Glue での Python ライブラリの使用
AWS Glue ETL で使用する追加の Python モジュールとライブラリをインストールできます。AWS Glue 2.0 以上の場合、AWS Glue は Python パッケージインストーラ (pip3) を使用して、AWS Glue ETL で使用する追加モジュールをインストールします。AWSGlue には、追加の Python モジュールを AWS Glue ジョブ環境に持ち込むための複数のオプションが用意されています。Python wheel ファイル、Requirements ファイル (requirement.txt、AWS Glue 5.0 以降)、またはカンマ区切りの Python モジュールのリストを使用してモジュールを取り込むため、「—additional-python-modules」パラメータを使用できます。
トピック
| AWS Glue のバージョン | Python バージョン | 基本のイメージ | glibc バージョン |
|---|---|---|---|
| 5.0 | 3.11 | Amazon Linux 2023 (AL2023) |
2.34 |
| 4.0 | 3.10 | Amazon Linux 2 (AL2) |
2.26 |
| 3.0 | 3.7 | Amazon Linux 2 (AL2) |
2.26 |
| 2.0 | 3.7 | Amazon Linux AMI (AL1) |
2.17 |
| 1.0 | 3.6 | Amazon Linux AMI (AL1) |
2.17 |
| 0.9 | 2.7 | Amazon Linux AMI (AL1) |
2.17 |
AWS 責任共有モデル
AWS Glue は、ジョブ環境でのネイティブコードのコンパイルをサポートしていません。ただし、AWS Glue のジョブは、Amazon マネージド Linux 環境内での実行が可能です。Python Wheel ファイルを通じて、ネイティブの依存関係をコンパイルされた形式で提供できる場合があります。AWS Glue のバージョンの互換性の詳細については、上記の表を参照してください。
Python の依存関係が、ネイティブのコンパイル済みコードに過渡的に依存している場合、AWS Glue がジョブ環境でのネイティブコードのコンパイルをサポートしていない、という制限による影響を受ける場合があります。ただし、AWS Glue のジョブは、Amazon マネージド Linux 環境内での実行が可能です。Wheel ディストリビューションを通じて、ネイティブの依存関係をコンパイルされた形式で提供できる場合があります。AWS Glue のバージョンの互換性の詳細については、上記の表を参照してください。
重要
互換性のない依存関係を使用すると、ターゲット環境のアーキテクチャとシステムライブラリと一致する必要があるネイティブ拡張機能を持つライブラリの場合は特に、ランタイムの問題が発生する可能性があります。各 AWS Glue バージョンは、ライブラリとシステム設定がプリインストールされた特定の Python バージョンで実行します。
pip を使用して追加の Python モジュールを AWS Glue 2.0 以降にインストールする
AWS Glue は Python パッケージインストーラー (pip3) を使用して、AWS Glue ETL で使用する追加モジュールをインストールします。--additional-python-modules パラメータでコンマ区切りの Python モジュールのリストを指定することで、新しいモジュールを追加したり、既存のモジュールのバージョンを変更したりできます。Amazon S3 にディストリビューションをアップロードすることでライブラリのカスタムディストリビューションをインストールできます。その後で、モジュールのリストに Amazon S3 オブジェクトへのパスを含めます。
--python-modules-installer-option パラメータを使用すると、pip3 に追加オプションを渡すことができます。例えば "--upgrade" を渡すことで、"--additional-python-modules" で指定されたパッケージをアップグレードできます。その他の例については、AWS Glue 2.0 を使用して Spark ETL ワークロード用のホイールから Python モジュールを構築する
AWS Glue では、Amazon S3 に保存されている wheel (.whl) ファイルを使用したカスタム Python パッケージのインストールをサポートしています。AWS Glue ジョブに wheel ファイルを含めるには、s3 に保存されている wheel ファイルのカンマ区切りリストを --additional-python-modules ジョブパラメータに渡します。例:
--additional-python-modules s3://amzn-s3-demo-bucket/path/to/package-1.0.0-py3-none-any.whl,s3://your-bucket/path/to/another-package-2.1.0-cp311-cp311-linux_x86_64.whl
このアプローチでは、カスタムディストリビューションが必要な場合や、適切なオペレーティングシステム用にプリコンパイルされたネイティブの依存関係を持つパッケージが必要な場合でもサポートされます。その他の例については、Building Python modules from a wheel for Spark ETL workloads using AWS Glue 2.0
--additional-python-modules は、AWS Glue コンソールの [ジョブパラメータ] フィールドを使用して指定するか、AWS SDK でジョブの引数を変更して指定します。ジョブパラメータの設定の詳細については、AWS Glue ジョブでジョブパラメータを使用する を参照してください。
AWS Glue 5.0 では、Python ライブラリの依存関係を管理するための業界標準である requirements.txt を指定できます。そのためにはまず、次の 2 つのジョブパラメータを指定します。
-
キー:
--python-modules-installer-option値:
-r -
キー:
--additional-python-modules値:
s3://path_to_requirements.txt
AWS Glue 5.0 ノードは、requirements.txt で指定された Python ライブラリを最初にロードします。
次に requirements.txt の例を示します。
awswrangler==3.9.1 elasticsearch==8.15.1 PyAthena==3.9.0 PyMySQL==1.1.1 PyYAML==6.0.2 pyodbc==5.2.0 pyorc==0.9.0 redshift-connector==2.1.3 scipy==1.14.1 scikit-learn==1.5.2 SQLAlchemy==2.0.36
重要
requirements.txt では、固定されていないライブラリバージョンは避けて、ジョブに対して信頼性が高く確定的な AWS Glue 環境を確保してください。
直接的な依存関係に wheel を使用すると、一時的な依存関係が正しく固定されていない場合、互換性のないバージョンを取り込む可能性があります。ベストプラクティスとして、AWS Glue ジョブの一貫性を保つために、すべてのライブラリバージョンを固定する必要があります。AWSGlue では、本番環境のワークロードの一貫性と信頼性を確保するために、Python 環境を wheel ファイルにパッケージ化することをお勧めします。
新しい Python モジュール AWS Glue を更新または追加するには、カンマ区切りの Python モジュールのリストを値として --additional-python-modules パラメータを渡すことができます。例えば、更新や新しい scikit-learn モジュールの追加には、"--additional-python-modules",
"scikit-learn==0.21.3" のキー/値を使用します。Python モジュールを直接設定するには 2 つのオプションがあります。
-
固定された Python モジュール (推奨)
"--additional-python-modules", "scikit-learn==0.21.3,ephem==4.1.6" -
固定されていない Python モジュール: (本番稼働用ワークロードには推奨されません)
"--additional-python-modules", "scikit-learn>==0.20.0,ephem>=4.0.0"または
"--additional-python-modules", "scikit-learn,ephem"
重要
--additional-python-modules で python モジュールを直接設定する場合、AWS Glue ジョブ環境の一貫性を確保するために、AWS Glue では固定ライブラリバージョンを使用することをお勧めしています。固定されていないライブラリバージョンを使用すると、最新バージョンの python モジュールがプルされますが、これにより重大な変更が発生したり、互換性のない python モジュールが AWS Glue ジョブ環境での python インストールの失敗によるジョブの失敗につながる可能性があります。本番ワークロードには、固定されていないライブラリバージョンを使用しないことをお勧めします。ベストプラクティスとして、AWS Glue では本番環境のワークロードの一貫性と信頼性を確保するために、Python 環境を wheel ファイルにパッケージ化することをお勧めしています。
PySpark のネイティブ機能を使用して Python ファイルを含める
AWS Glue では、PySpark を使用して、AWS Glue ETL ジョブに Python ファイルを含めます。可能な場合には、依存関係を管理するために、--additional-python-modules を使用することが必要になります。Python ファイルをインクルードするには、--extra-py-files ジョブパラメータを使用します。依存関係は Amazon S3 でホストされている必要があり、引数の値は、スペースを含まない Amazon S3 パスのカンマ区切りリストである必要があります。この機能は、Spark で使用する Python の依存関係管理のように動作します。Spark での Python の依存関係管理の詳細については、Apache Spark ドキュメントの「Using PySpark Native Features--extra-py-files が便利です。依存関係ツールをメンテナンス可能にするには、送信する前に依存関係をバンドルする必要があります。
ビジュアル変換を使用するプログラミングスクリプト
AWS Glue Studio のビジュアルインターフェイスを使用して AWS Glue ジョブを作成するとき、マネージドデータトランスフォームノードおよびカスタムビジュアル変換を使用してデータを変換できます。マネージドデータ変換ノードの詳細については、AWS Glue マネージド変換によるデータの変換 を参照してください。カスタムビジュアル変換の詳細については、 カスタムビジュアル変換によるデータの変換 を参照してください。ビジュアル変換を使用するスクリプトは、ジョブの [言語] が Python を使用するように設定されている場合にのみ生成できます。
ビジュアル変換を使用して AWS Glue ジョブを生成する場合、AWS Glue Studio はジョブ設定の --extra-py-files パラメータを使用し、これらの変換をランタイム環境に組み込みます。ジョブパラメータについては、AWS Glue ジョブでジョブパラメータを使用する を参照してください。生成されたスクリプトまたはランタイム環境を変更するとき、スクリプトを正常に実行するためにこのジョブ設定を保存する必要があります。
取り込みのためのライブラリの圧縮
ライブラリは、単一の .py ファイルに含まれていない限り、.zip アーカイブにパッケージ化される必要があります。パッケージディレクトリは、アーカイブのルートにあって、パッケージの __init__.py ファイルを含んでいる必要があります。そうすると、Python は通常の方法でパッケージをインポートできるようになります。
ライブラリが 1 つの .py ファイルにある単一の Python モジュールでのみ構成されている場合、.zip ファイルに入れる必要はありません。
Glue Studio ノートブックでの Python AWS ライブラリのロード
Glue Studio ノートブックで Python AWS ライブラリを指定するには、追加 Python モジュールのインストール を参照してください。
AWS Glue 0.9/1.0 の開発エンドポイントへの Python ライブラリのロード
異なる ETL スクリプトに異なるライブラリセットを使用している場合、各セットに別々の開発エンドポイントをセットアップするか、スクリプトを切り替えるたびに開発エンドポイントがロードするライブラリ .zip ファイルを上書きすることができます。
コンソールを使用して、作成時に開発エンドポイントに 1 つまたは複数のライブラリ .zip ファイルを指定できます。名前と IAM ロールを割り当てた後、[Script Libraries and job parameters (optional)] (スクリプトライブラリおよびジョブパラメータ (任意)) をクリックし、[Python library path] (Python ライブラリパス) ボックスに、ライブラリ .zip ファイルへの完全な Amazon S3 パスを入力します。例:
s3://bucket/prefix/site-packages.zip
必要に応じてファイルへの複数のフルパスを指定できますが、以下のように、スペースなしでカンマで区切ります。
s3://bucket/prefix/lib_A.zip,s3://bucket_B/prefix/lib_X.zip
これらの .zip ファイルを後で更新する場合は、コンソールを使用して開発エンドポイントにそのファイルを再インポートできます。該当する開発エンドポイントに移動し、横にあるチェックボックスをオンにして、[Action] (アクション) メニューから [Update ETL libraries] (ETL ライブラリの更新) を選択します。
同様の方法で、AWS Glue API を使用してライブラリファイルを指定できます。CreateDevEndpoint アクション (Python: create_dev_endpoint) を呼び出して開発エンドポイントを作成する場合、ExtraPythonLibsS3Path パラメータでライブラリへの 1 つ以上のフルパスを指定できます。以下のような呼び出しになります。
dep = glue.create_dev_endpoint(
EndpointName="testDevEndpoint",
RoleArn="arn:aws:iam::123456789012",
SecurityGroupIds="sg-7f5ad1ff",
SubnetId="subnet-c12fdba4",
PublicKey="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCtp04H/y...",
NumberOfNodes=3,
ExtraPythonLibsS3Path="s3://bucket/prefix/lib_A.zip,s3://bucket_B/prefix/lib_X.zip")
開発エンドポイントを更新するときに、DevEndpointCustomLibraries オブジェクトを使用し UpdateEtlLibraries の呼び出し時に True パラメータを UpdateDevEndpoint (update_dev_endpoint) に設定して、ロードするライブラリも更新できます。
ジョブまたは JobRun での Python ライブラリの使用
コンソールで新しいジョブを作成する際、[Script Libraries and job parameters (optional)] (スクリプトライブラリおよびジョブパラメータ (任意)) をクリックし、開発エンドポイント作成時と同じ方法で Amazon S3 ライブラリの完全なパスを入力することで、1 つ以上のライブラリ .zip ファイルを指定できます。
s3://bucket/prefix/lib_A.zip,s3://bucket_B/prefix/lib_X.zip
CreateJob (create_job) を呼び出している場合は、以下のようにデフォルトの --extra-py-files パラメータを使用してデフォルトのライブラリへの 1 つ以上のフルパスを指定できます。
job = glue.create_job(Name='sampleJob',
Role='Glue_DefaultRole',
Command={'Name': 'glueetl',
'ScriptLocation': 's3://my_script_bucket/scripts/my_etl_script.py'},
DefaultArguments={'--extra-py-files': 's3://bucket/prefix/lib_A.zip,s3://bucket_B/prefix/lib_X.zip'})
その後 JobRun を開始するときに、デフォルトのライブラリ設定を別のもので上書きできます。
runId = glue.start_job_run(JobName='sampleJob',
Arguments={'--extra-py-files': 's3://bucket/prefix/lib_B.zip'})
Python の依存関係をプロアクティブに分析する
AWS Glue にデプロイする前に潜在的な依存関係の問題をプロアクティブに特定するには、依存関係分析ツールを使用して、ターゲット AWS Glue 環境に対して Python パッケージを検証できます。
AWS は、AWS Glue 環境専用に設計されたオープンソースの Python 依存関係アナライザーツールを提供します。このツールは AWS Glue サンプルリポジトリで入手でき、デプロイ前にローカルで使用して依存関係を検証できます。
この分析は、一貫した本番稼働用デプロイのためにすべてのライブラリバージョンを固定するという推奨プラクティスを依存関係が確実に遵守するのに役立ちます。詳細については、ツールの README
AWS Glue Python Dependency Analyzer は、ターゲット AWS Glue 環境に一致するプラットフォーム固有の制約で pip のインストールをシミュレートすることで、固定されていない依存関係とバージョン競合を特定するのに役立ちます。
# Analyze a single Glue job python glue_dependency_analyzer.py -j my-glue-job # Analyze multiple jobs with specific AWS configuration python glue_dependency_analyzer.py -j job1 -j job2 --aws-profile production --aws-region us-west-2
このツールでは、次のフラグが付けられます。
-
ジョブ実行間で異なるバージョンをインストールできる固定されていない依存関係
-
パッケージ間のバージョン競合
-
ターゲット AWS Glue 環境で使用できない依存関係
Amazon Q Developer は、生成人工知能 (AI) を活用した会話型アシスタントであり、AWS アプリケーションの理解、構築、拡張、運用を支援します。Amazon Q の入門ガイドの手順に従ってダウンロードできます。
Amazon Q Developer を使用して、Python の依存関係によるジョブの失敗を分析および修正できます。ジョブ <Job-Name> プレースホルダーを Glue ジョブの名前に置き換えて、次のプロンプトを使用することをお勧めします。
I have an AWS Glue job named <Job-Name> that has failed due to Python module installation conflicts. Please assist in diagnosing and resolving this issue using the following systematic approach. Proceed once sufficient information is available. Objective: Implement a fix that addresses the root cause module while minimizing disruption to the existing working environment. Step 1: Root Cause Analysis • Retrieve the most recent failed job run ID for the specified Glue job • Extract error logs from CloudWatch Logs using the job run ID as a log stream prefix • Analyze the logs to identify: • The recently added or modified Python module that triggered the dependency conflict • The specific dependency chain causing the installation failure • Version compatibility conflicts between required and existing modules Step 2: Baseline Configuration Identification • Locate the last successful job run ID prior to the dependency failure • Document the Python module versions that were functioning correctly in that baseline run • Establish the compatible version constraints for conflicting dependencies Step 3: Targeted Resolution Implementation • Apply pinning by updating the job's additional_python_modules parameter • Pin only the root cause module and its directly conflicting dependencies to compatible versions, and do not remove python modules unless necessary • Preserve flexibility for non-conflicting modules by avoiding unnecessary version constraints • Deploy the configuration changes with minimal changes to the existing configuration and execute a validation test run. Do not change the Glue versions. Implementation Example: Scenario: Recently added pandas==2.0.0 to additional_python_modules Error: numpy version conflict (pandas 2.0.0 requires numpy>=1.21, but existing job code requires numpy<1.20) Resolution: Update additional_python_modules to "pandas==1.5.3,numpy==1.19.5" Rationale: Use pandas 1.5.3 (compatible with numpy 1.19.5) and pin numpy to last known working version Expected Outcome: Restore job functionality with minimal configuration changes while maintaining system stability.
プロンプトは Q に次のように指示します。
-
最後に失敗したジョブ実行 ID を取得する
-
関連するログと詳細を検索する
-
変更された Python パッケージを検出するため、正常なジョブ実行を検索する
-
設定を修正し、別のテストランをトリガーする
AWS Glue で提供済みの Python モジュール
これらの提供済みモジュールのバージョンを変更するには、--additional-python-modules ジョブパラメータにより新しいバージョンを指定します。