

# AWS Glue での Python シェルジョブに関するジョブプロパティの設定
<a name="add-job-python"></a>

 Python シェルジョブを使用して、AWS Glue でシェルとして Python スクリプトを実行できます。Python シェルジョブを使用すると、Python 3.6 または Python 3.9 と互換性のあるスクリプトを実行することができます。

**注記**  
 Pyshell v3.6 のサポートは 2026 年 3 月 1 日に終了します。ワークロードを移行するには、[Migrate from AWS Glue Python shell jobs](https://docs.aws.amazon.com/glue/latest/dg/pyshell-migration.html) を参照してください。Python シェル v3.9 を続行する場合は、[Python シェル 3.6 から Python シェル 3.9 への移行](#migrating-version-pyshell36-to-pyshell39) を参照してください。

**Topics**
+ [制限事項](#python-shell-limitations)
+ [実行環境](#python-shell-execution-environment)
+ [Python シェルジョブのジョブプロパティの定義](#create-job-python-properties)
+ [サポートされている Python シェルジョブのライブラリ](#python-shell-supported-library)
+ [独自の Python ライブラリの提供](#create-python-extra-library)
+ [AWS Glue の Python シェルジョブで AWS CloudFormation を使用する](#python-shell-jobs-cloudformation)
+ [Python シェル 3.6 から Python シェル 3.9 への移行](#migrating-version-pyshell36-to-pyshell39)
+ [AWS Glue Python シェルジョブからの移行](pyshell-migration.md)

## 制限事項
<a name="python-shell-limitations"></a>

Python シェルジョブには、次の制限があることに注意してください。
+  Python シェルを使用してジョブのブックマークを使用することはできません。
+ Python 3.9 以降では、`.egg` ファイルとして Python ライブラリをパッケージ化することはできません。代わりに `.whl` を使用してください。
+ S3 データの一時的なコピーには制限があるため、`--extra-files` オプションは使用できません。

## 実行環境
<a name="python-shell-execution-environment"></a>

Python シェルジョブは、一時的なデータ処理のためにローカルストレージへのアクセスを提供するマネージド実行環境で実行されます。

**ローカル一時ストレージ**  
`/tmp` ディレクトリは、ジョブの実行中に一時ストレージとして使用できます。このディレクトリには、以下の用途に使用できる約 14 GiB の空き容量があります。  
+ 一時的なファイル処理
+ 中間データストレージ
+ 小さなデータセットのキャッシュ
`/tmp` ディレクトリは一時的なものであり、ジョブの完了後にクリーンアップされます。重要なデータの永続的な保存には使用しないでください。

## Python シェルジョブのジョブプロパティの定義
<a name="create-job-python-properties"></a>

このセクションでは、AWS Glue Studio でのジョブプロパティの定義、または AWS CLI の使用について説明します。

### AWS Glue Studio
<a name="create-job-python-properties-studio"></a>

AWS Glue Studio で Python シェルジョブを定義する場合、次のいくつかのプロパティを指定します。

**IAM ロール**  
ジョブの実行とデータストアへのアクセスに使用されるリソースの認可に使用する AWS Identity and Access Management IAM ロールを指定します。AWS Glue でジョブを実行するためのアクセス権限の詳細については、[AWS Glue のアイデンティティとアクセスの管理](security-iam.md) を参照してください。

**タイプ**  
[**Python シェル**] を選択して、`pythonshell` という名前のジョブコマンドを使用して Python スクリプトを実行します。

**Python バージョン**  
Python のバージョンを選択します。デフォルトは Python 3.9 です。有効なバージョンは Python 3.6 および Python 3.9 です。

**共通分析ライブラリを読み込む (推奨)**  
Python 3.9 用の共通ライブラリを Python シェルに含めるには、このオプションを選択します。  
ライブラリがカスタムであったり、インストール済みのライブラリと競合する場合は、共通ライブラリをインストールしないことを選択することができます。しかしながら、共通ライブラリ以外のライブラリを追加でインストールすることは可能です。  
このオプションを選択する場合、`library-set` オプションが `analytics` に設定されます。このオプションの選択を外す場合、`library-set` オプションが `none` に設定されます。

**スクリプトのファイル名とスクリプトパス**  
スクリプトのコードでジョブの手続きロジックを定義します。Amazon Simple Storage Service (Amazon S3) でスクリプト名と場所を指定します。パスのスクリプトディレクトリと同じ名前のファイルが存在していないことを確認します。スクリプトの使用の詳細については、[AWS Glue プログラミングガイド](edit-script.md) を参照してください。

**スクリプト**  
スクリプトのコードでジョブの手続きロジックを定義します。Python 3.6 または Python 3.9 でスクリプトをコーディングできます。スクリプトは AWS Glue Studio で編集できます。

**データ処理単位**  
このジョブの実行に割り当てられる AWS Glue データ処理ユニット (DPU) の最大数。DPU は処理能力を相対的に測定するもので、4 個の vCPU のコンピューティング性能と 16 GB のメモリで構成されています。詳細については、[AWS Glue 料金表](https://aws.amazon.com/glue/pricing/) を参照してください。  
値を 0.0625 または 1 に設定できます。デフォルトは 0.0625 です。いずれの場合も、インスタンスのローカルディスクは 20 GB になります。

### CLI
<a name="create-job-python-properties-cli"></a>

 また、以下の例のように、AWS CLI を使用して **Python シェル**ジョブを作成することもできます 

```
 aws glue create-job --name python-job-cli --role Glue_DefaultRole 
     --command '{"Name" :  "pythonshell", "PythonVersion": "3.9", "ScriptLocation" : "s3://amzn-s3-demo-bucket/scriptname.py"}'  
     --max-capacity 0.0625
```

**注記**  
 `--glue-version` パラメータは AWS Glue シェルジョブに適用されないため、AWS Glue のバージョンを指定する必要はありません。指定されたバージョンは無視されます。

 AWS CLI で作成したジョブはデフォルトで Python 3 になります。有効な Python バージョンは 3 (3.6 に対応) と 3.9 です。Python 3.6 を指定するには、`--command` パラメータにこのタプルを追加します: `"PythonVersion":"3"` 

 Python 3.9 を指定するには、`--command` パラメータにこのタプルを追加します: `"PythonVersion":"3.9"` 

 Python シェルジョブによって使用される最大容量を設定するには、`--max-capacity` パラメータを指定します。Python シェルジョブに `--allocated-capacity` パラメータは使用できません。

## サポートされている Python シェルジョブのライブラリ
<a name="python-shell-supported-library"></a>

 Python 3.9 を使用する Python シェルでは、必要に応じて事前にパッケージ済みのライブラリセットを使用するようにライブラリセットを選択できます。ライブラリセットを選択するには、`library-set` オプションを使用します。有効な値は、`analytics` および `none` です。

Python シェルジョブを実行する環境は、次のライブラリをサポートしています。


| Python バージョン | Python 3.6 | Python 3.9 | 
| --- | --- | --- | 
| ライブラリセット | 該当なし | 分析 | なし | 
| avro |  | 1.11.0 |  | 
| awscli | 116.242 | 1.23.5 | 1.23.5 | 
| awswrangler |  | 2.15.1 |  | 
| botocore | 1.12.232 | 1.24.21 | 1.23.5 | 
| boto3 | 1.9.203 | 1.21.21 |  | 
| elasticsearch |  | 8.2.0 |  | 
| numpy | 1.16.2 | 1.22.3 |  | 
| pandas | 0.24.2 | 1.4.2 |  | 
| psycopg2 |  | 2.9.3 |  | 
| pyathena |  | 2.5.3 |  | 
| PyGreSQL | 5.0.6 |  |  | 
| PyMySQL |  | 1.0.2 |  | 
| pyodbc |  | 4.0.32 |  | 
| pyorc |  | 0.6.0 |  | 
| redshift-connector |  | 2.0.907 |  | 
| リクエスト | 2.22.0 | 2.27.1 |  | 
| scikit-learn | 0.20.3 | 1.0.2 |  | 
| scipy | 1.2.1 | 1.8.0 |  | 
| SQLAlchemy |  | 1.4.36 |  | 
| s3fs |  | 2022.3.0 |  | 

科学計算用の Python シェルジョブで、`NumPy` ライブラリを使用できます。詳細については、[NumPy](http://www.numpy.org) を参照してください。以下の例は、Python シェルジョブで使用できる NumPy スクリプトを示しています。このスクリプトは、「Hello world」といくつかの数値計算の結果を出力します。

```
import numpy as np
print("Hello world")

a = np.array([20,30,40,50])
print(a)

b = np.arange( 4 )

print(b)

c = a-b

print(c)

d = b**2

print(d)
```

## 独自の Python ライブラリの提供
<a name="create-python-extra-library"></a>

### PIP を使用する
<a name="create-python-extra-library-pip"></a>

Python 3.9 を使用する Python シェルでは、ジョブレベルで追加の Python モジュールや異なるバージョンを指定することもできます。`--additional-python-modules` オプションでコンマ区切りの Python モジュールのリストを指定することで、新しいモジュールを追加したり、既存のモジュールのバージョンを変更したりできます。Python シェルジョブを使用する場合、Amazon S3 でホストされているカスタム Python モジュールにこのパラメータを指定することはできません。

例えば、`scikit-learn` モジュールを更新したり新しく追加したりするには、次のキー/値を使用します。`"--additional-python-modules", "scikit-learn==0.21.3"`

AWS Glue は Python パッケージインストーラ (pip3) を使用して追加のモジュールをインストールします。`--additional-python-modules` 値の中で、追加の pip3 オプションを渡すことができます。例えば、`"scikit-learn==0.21.3 -i https://pypi.python.org/simple/"`。pip3 からの非互換性や制限は、すべて適用されます。

**注記**  
将来的に互換性が失われないように、Python3.9用にビルドされたライブラリを使用することをお勧めします。

### Egg または Whl ファイルを使用する
<a name="create-python-extra-library-egg-whl"></a>

1 つ以上の Python ライブラリが `.egg` または `.whl` ファイルとして既にパッケージ化されている場合があります。その場合は、次の例のように、「`--extra-py-files`」フラグの下で AWS Command Line Interface (AWS CLI) を使用して、それらをジョブに指定できます。

```
aws glue create-job --name python-redshift-test-cli --role role --command '{"Name" :  "pythonshell", "ScriptLocation" : "s3://MyBucket/python/library/redshift_test.py"}' 
     --connections Connections=connection-name --default-arguments '{"--extra-py-files" : ["s3://amzn-s3-demo-bucket/EGG-FILE", "s3://amzn-s3-demo-bucket/WHEEL-FILE"]}'
```

Python ライブラリから `.egg` ファイルまたは `.whl` ファイルを作成する方法がわからない場合は、次のステップを使用してください。この例は、macOS、Linux、および Windows Subsystem for Linux (WSL) で適用できます。

**Python の .egg ファイルまたは .whl ファイルを作成するには**

1. Virtual Private Cloud (VPC) で Amazon Redshift クラスターを作成し、テーブルにデータを追加します。

1. クラスターを作成した VPC と SecurityGroup とサブネットを組み合わせて AWS Glue 接続を作成します。接続に成功するかどうかをテストします。

1. `redshift_example` という名前のディレクトリを作成して、`setup.py` という名前のファイルを作成します。次のコードを `setup.py` に貼り付けます。

   ```
   from setuptools import setup
   
   setup(
       name="redshift_module",
       version="0.1",
       packages=['redshift_module']
   )
   ```

1. `redshift_example` ディレクトリに `redshift_module` ディレクトリを作成します。`redshift_module` ディレクトリに、ファイル `__init__.py` と `pygresql_redshift_common.py` を作成します。

1. `__init__.py` ファイルは空のままにします。`pygresql_redshift_common.py` 内に次のコードを貼り付けます。*port*、*db\$1name*、*user*、および *password\$1for\$1user* を、Amazon Redshift クラスター固有の詳細に置き換えます。*table\$1name* を Amazon Redshift のテーブルの名前と置き換えます。

   ```
   import pg
   
   
   def get_connection(host):
       rs_conn_string = "host=%s port=%s dbname=%s user=%s password=%s" % (
           host, port, db_name, user, password_for_user)
   
       rs_conn = pg.connect(dbname=rs_conn_string)
       rs_conn.query("set statement_timeout = 1200000")
       return rs_conn
   
   
   def query(con):
       statement = "Select * from table_name;"
       res = con.query(statement)
       return res
   ```

1. `redshift_example` ディレクトリに変更します (現在のディレクトリではない場合)。

1. 次のいずれかを行います。
   + `.egg` ファイルを作成するには、次のコマンドを実行します。

     ```
     python setup.py bdist_egg
     ```
   + `.whl` ファイルを作成するには、次のコマンドを実行します。

     ```
     python setup.py bdist_wheel
     ```

1. 前述のコマンドに必要な依存関係をインストールします。

1. このコマンドでは、`dist` ディレクトリにファイルを作成します。
   + egg ファイルを作成した場合は、`redshift_module-0.1-py2.7.egg` という名前になります。
   + wheel ファイルを作成した場合は、`redshift_module-0.1-py2.7-none-any.whl` という名前になります。

   このファイルを Amazon S3 にアップロードします。

   この例では、アップロードされたファイルパスは *s3://amzn-s3-demo-bucket/EGG-FILE* または *s3://amzn-s3-demo-bucket/WHEEL-FILE* です。

1. AWS Glue ジョブのスクリプトとして使用する Python ファイルを作成し、このファイルに次のコードを追加します。

   ```
   from redshift_module import pygresql_redshift_common as rs_common
   
   con1 = rs_common.get_connection(redshift_endpoint)
   res = rs_common.query(con1)
   
   print "Rows in the table cities are: "
   
   print res
   ```

1. 前述のファイルを Amazon S3 にアップロードします。この例では、アップロードされたファイルパスは *s3://amzn-s3-demo-bucket/scriptname.py* です。

1. このスクリプトを使用して、Python シェルジョブを作成します。AWS Glue コンソールの [**Job properties**] (ジョブプロパティ) ページの [**Python library path**] (Python ライブラリパス) ボックスで `.egg/.whl` ファイルへのパスを指定します。複数の `.egg/.whl` ファイルおよび Python ファイルがある場合は、このボックスにカンマ区切りリストとして指定します。

   `.egg` ファイルを変更または名前変更する場合、ファイル名は「python setup.py bdist\$1egg」コマンドによって生成されたデフォルト名を使用するか、Python モジュールの命名規則に従う必要があります。詳細については、[Style Guide for Python Code](https://www.python.org/dev/peps/pep-0008/) を参照してください。

   次の例のように、AWS CLI でコマンドを使用してジョブを作成します。

   ```
   aws glue create-job --name python-redshift-test-cli --role Role --command '{"Name" :  "pythonshell", "ScriptLocation" : "s3://amzn-s3-demo-bucket/scriptname.py"}' 
        --connections Connections="connection-name" --default-arguments '{"--extra-py-files" : ["s3://amzn-s3-demo-bucket/EGG-FILE", "s3://amzn-s3-demo-bucket/WHEEL-FILE"]}'
   ```

   ジョブが実行されると、スクリプトは、Amazon Redshift クラスターの [*table\$1name*] テーブルに作成された行をプリントします。

## AWS Glue の Python シェルジョブで AWS CloudFormation を使用する
<a name="python-shell-jobs-cloudformation"></a>

 AWS Glue の Python シェルジョブで AWS CloudFormation を使用できます。以下に例を示します。

```
AWSTemplateFormatVersion: 2010-09-09
Resources:
  Python39Job:
    Type: 'AWS::Glue::Job'
    Properties:
      Command:
        Name: pythonshell
        PythonVersion: '3.9'
        ScriptLocation: 's3://bucket/location'
      MaxRetries: 0
      Name: python-39-job
      Role: RoleName
```

 Python シェルジョブ用の Amazon CloudWatch Logs グループは、`/aws-glue/python-jobs/output` です。エラーについては、ロググループ `/aws-glue/python-jobs/error` を参照してください。

## Python シェル 3.6 から Python シェル 3.9 への移行
<a name="migrating-version-pyshell36-to-pyshell39"></a>

 Python シェルのジョブを最新の AWS Glue バージョンに移行するには: 

1.  AWS Glue コンソール ([https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)) で、既存の Python シェルのジョブを選択します。

1.  **[ジョブ]** の詳細タブで、Python バージョンを `Python 3.9` に設定し、**[保存]** を選択します。

1.  ジョブスクリプトが Python 3.9 と互換性があり、正常に実行されることを確認してください。