

# AWS Glue ジョブスクリプトのローカルでの開発およびテスト
<a name="aws-glue-programming-etl-libraries"></a>

AWS Glue for Spark ジョブスクリプトを開発およびテストする場合、以下のような複数のオプションが用意されています。
+ AWS Glue Studio コンソール
  + Visual editor (ビジュアルエディタ)
  + スクリプトエディタ
  + AWS Glue Studio ノートブック
+ インタラクティブなセッション
  + Jupyter Notebook
+ Docker イメージ
  + ローカル開発
  + リモート開発

ユーザーは、要件に基づいて、上記のオプションのいずれかを選択できます。

コードを記述したくない、あるいは記述する量を減らしたい場合は、AWS Glue Studio のビジュアルエディタが便利です。

ノートブックのインタラクティブな操作を希望する場合は、AWS Glue Studio ノートブックが適しています。詳細については、「[AWS Glue Studio および AWS Glue ノートブックによるコードの作成](https://docs.aws.amazon.com/glue/latest/ug/notebooks-chapter.html)」を参照してください。独自のローカル環境を使用するユーザーには、インタラクティブセッションが適しています。詳細については、「[インタラクティブセッションで AWS Glue ジョブを構築する](https://docs.aws.amazon.com/glue/latest/dg/interactive-sessions-chapter.html)」を参照してください。

開発をローカル/リモートの両方で行いたい場合は、Docker イメージが便利です。これにより、Spark ジョブスクリプト用の AWS Glue の開発とテストを好きな場所で行うことができ、AWS Glue のコストもかかりません。

Docker を使用せずにローカルで開発したい場合は、AWS Glue ETL ライブラリディレクトリをローカルにインストールします。

## AWS Glue Studio を使用した開発
<a name="develop-using-studio"></a>

AWS Glue Studio のビジュアルエディタは、AWS Glue での抽出、変換、ロード (ETL) ジョブの作成、実行、およびモニタリングを簡単に行うことができるグラフィカルなインターフェイスです。データ変換ワークフローを視覚的に作成し、それらを AWS Glue の Apache Spark ベースのサーバーレス ETL エンジン上でシームレスに実行することができます。ジョブの各ステップでスキーマとデータの結果を調べることができます。詳細については、「[AWS Glue Studio ユーザーガイド](https://docs.aws.amazon.com/glue/latest/ug/what-is-glue-studio.html)」を参照してください。

## インタラクティブセッションによる開発
<a name="develop-using-interactive-sessions"></a>

インタラクティブセッションでは、お好みの環境からアプリケーションを構築し、そのテストが行えます。詳細については、「[インタラクティブセッションで AWS Glue ジョブを構築する](https://docs.aws.amazon.com/glue/latest/dg/interactive-sessions-chapter.html)」を参照してください。

# Docker イメージを使用してローカルで AWS Glue ジョブを開発およびテストする
<a name="develop-local-docker-image"></a>

 本番環境対応のデータプラットフォームの場合、AWS Glue ジョブ向けの開発プロセスや CI/CD パイプラインで検討すべきです。Docker コンテナでは、AWS Glue のジョブの開発やテストが柔軟に行えます。AWS Glue は Docker Hub に Docker イメージをホストすることで、追加のユーティリティを使用する開発環境をセットアップします。IDE、ノートブック、または、AWS Glue ETL ライブラリを使用する REPL などを、ご自分で選択して使用できます。このトピックでは、Docker コンテナ上で Docker イメージを使用して AWS Glue バージョン 5.0 のジョブを開発およびテストする方法について説明します。

## 利用可能な Docker イメージ
<a name="develop-local-available-docker-images-ecr"></a>

 [Amazon ECR](https://gallery.ecr.aws/glue/aws-glue-libs) の AWS Glue では、以下の Docker イメージが利用可能です。
+  AWS Glue バージョン 5.0 の場合: `public.ecr.aws/glue/aws-glue-libs:5` 
+ AWS Glue バージョン 4.0 の場合: `public.ecr.aws/glue/aws-glue-libs:glue_libs_4.0.0_image_01`
+ AWS Glue バージョン 3.0 の場合: `public.ecr.aws/glue/aws-glue-libs:glue_libs_3.0.0_image_01`
+ AWS Glue バージョン 2.0 の場合: `public.ecr.aws/glue/aws-glue-libs:glue_libs_2.0.0_image_01`

**注記**  
 AWS Glue Docker イメージは x86\$164 と arm64 の両方と互換性があります。

 この例では、ローカルマシン (Mac/Windows/Linux) での `public.ecr.aws/glue/aws-glue-libs:5` の使用法とコンテナを実行するための方法を示します。このコンテナイメージは、AWS Glue バージョン 5.0 の Spark ジョブでテスト済みです。このイメージには、以下が含まれます。
+  Amazon Linux 2023 
+  AWS Glue ETL ライブラリ 
+  Apache Spark 3.5.4 
+  オープンテーブル形式のライブラリ; Apache Iceberg 1.7.1、Apache Hudi 0.15.0、Delta Lake 3.3.0 
+  AWS Glue データカタログクライアント 
+  Amazon Redshift Apache Spark 用 コネクタ 
+  Amazon DynamoDB Apache Hadoop 用 コネクタ 

 コンテナを設定するには、ECR Public Gallery からイメージを取得して、コンテナを実行します。このトピックでは、要件に応じて以下の各方法でコンテナを実行する方法を示します。
+ `spark-submit`
+ REPL シェル `(pyspark)`
+ `pytest`
+ Visual Studio Code

## 前提条件
<a name="develop-local-docker-image-prereq"></a>

作業を開始する前に、Docker がインストール済みであり、Docker デーモンが実行中であることを確認します。インストールの手順については、[Mac](https://docs.docker.com/docker-for-mac/install/) または [Linux](https://docs.docker.com/engine/install/) 向けの Docker ドキュメントを参照してください。AWS Glue コンテナは、Docker を実行しているマシンでホストされます。また、Docker を実行しているホスト上のイメージ用として、少なくとも 7 GB のディスク領域が必要です。

 AWS Glue のコードをローカルで開発する際の制限については、「[ローカル開発の制限](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-libraries.html#local-dev-restrictions)」を参照してください。

### AWS の設定
<a name="develop-local-docker-image-config-aws-credentials"></a>

コンテナから AWS API コールを有効にするには、以下の手順に従って AWS 認証情報をセットアップします。以下のセクションでは、この AWS により名前が指定されたプロファイルを使用します。

1.  [AWS の名前付きプロファイルを作成します](https://docs.aws.amazon.com//cli/latest/userguide/cli-configure-files.html)。

1.  Windows または Mac/Linux のターミナルで `cmd` を開き、ターミナル上で次のコマンドを実行します。

   ```
   PROFILE_NAME="<your_profile_name>"
   ```

以下のセクションでは、この AWS の名前付きプロファイルを使用します。

### 
<a name="develop-local-docker-pull-image-from-ecr-public"></a>

 Windows で Docker を実行している場合は、Docker アイコンを右クリックし、イメージを取得する前に **[Switch to Linux containers]** (Linux コンテナに切り替える) を選択します。

ECR Public からイメージを取得するには、次のコマンドを実行します。

```
docker pull public.ecr.aws/glue/aws-glue-libs:5 
```

## コンテナを実行する
<a name="develop-local-docker-image-setup-run"></a>

ここまでの操作により、取得したイメージを使用してコンテナを実行できるようになります。ご自身の要件に応じて、以下のいずれかを選択できます。

### spark-submit
<a name="develop-local-docker-image-setup-run-spark-submit"></a>

コンテナで `spark-submit` コマンドを使用して、AWS Glue のジョブスクリプトを実行できます。

1.  以下の例のようにスクリプトを記述して `sample.py` として保存し、さらに以下のコマンドを使用して `/local_path_to_workspace/src/` ディレクトリに保存します。

   ```
   $ WORKSPACE_LOCATION=/local_path_to_workspace
   $ SCRIPT_FILE_NAME=sample.py
   $ mkdir -p ${WORKSPACE_LOCATION}/src
   $ vim ${WORKSPACE_LOCATION}/src/${SCRIPT_FILE_NAME}
   ```

1.  これらの変数は、以下の Docker 実行コマンドで使用されます。以下の spark-submit コマンドで使用されるサンプルコード (sample.py) は、このトピックの最後にある付録に含まれています。

    以下のコマンドにより、コンテナで `spark-submit` コマンドを使用して、新しい Spark アプリケーションをサブミットします。

   ```
   $ docker run -it --rm \
       -v ~/.aws:/home
       /hadoop/.aws \
       -v $WORKSPACE_LOCATION:/home/hadoop/workspace/ \
       -e AWS_PROFILE=$PROFILE_NAME \
       --name glue5_spark_submit \
       public.ecr.aws/glue/aws-glue-libs:5 \
       spark-submit /home/hadoop/workspace/src/$SCRIPT_FILE_NAME
   ```

1. (オプション) 環境に合わせて `spark-submit` を構成します。たとえば、`--jars` 設定を使用して依存関係を渡すことができます。詳細については、Spark ドキュメントの「[Dynamically Loading Spark Properties (Spark プロパティの動的ロード)](https://spark.apache.org/docs/latest/configuration.html)」を参照してください。

### REPL シェル (Pyspark)
<a name="develop-local-docker-image-setup-run-repl-shell"></a>

 REPL (`read-eval-print loops`) シェルを実行すると、インタラクティブな開発を行うことができます。次のコマンドにより、コンテナ上で PySpark コマンドを実行し、REPL シェルを起動します。

```
$ docker run -it --rm \
    -v ~/.aws:/home/hadoop/.aws \
    -e AWS_PROFILE=$PROFILE_NAME \
    --name glue5_pyspark \
    public.ecr.aws/glue/aws-glue-libs:5 \
    pyspark
```

 この場合、次の出力が返されます。

```
Python 3.11.6 (main, Jan  9 2025, 00:00:00) [GCC 11.4.1 20230605 (Red Hat 11.4.1-2)] on linux
Type "help", "copyright", "credits" or "license" for more information.
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 3.5.4-amzn-0
      /_/

Using Python version 3.11.6 (main, Jan  9 2025 00:00:00)
Spark context Web UI available at None
Spark context available as 'sc' (master = local[*], app id = local-1740643079929).
SparkSession available as 'spark'.
>>>
```

 この REPL シェルを使用することで、インタラクティブなコーディングとテストを実行できます。

### Pytest
<a name="develop-local-docker-image-setup-run-pytest"></a>

 ユニットテストの場合、AWS Glue の Spark ジョブスクリプトで `pytest` を使用できます。以下のコマンドを実行し、準備を行います。

```
$ WORKSPACE_LOCATION=/local_path_to_workspace
$ SCRIPT_FILE_NAME=sample.py
$ UNIT_TEST_FILE_NAME=test_sample.py
$ mkdir -p ${WORKSPACE_LOCATION}/tests
$ vim ${WORKSPACE_LOCATION}/tests/${UNIT_TEST_FILE_NAME}
```

 以下のコマンドの実行により、`docker run` を使用して `pytest` を実行します。

```
$ docker run -i --rm \
    -v ~/.aws:/home/hadoop/.aws \
    -v $WORKSPACE_LOCATION:/home/hadoop/workspace/ \
    --workdir /home/hadoop/workspace \
    -e AWS_PROFILE=$PROFILE_NAME \
    --name glue5_pytest \
    public.ecr.aws/glue/aws-glue-libs:5 \
    -c "python3 -m pytest --disable-warnings"
```

 `pytest` がユニットテストの実行を完了すると、出力は次のようになります。

```
============================= test session starts ==============================
platform linux -- Python 3.11.6, pytest-8.3.4, pluggy-1.5.0
rootdir: /home/hadoop/workspace
plugins: integration-mark-0.2.0
collected 1 item

tests/test_sample.py .                                                   [100%]

======================== 1 passed, 1 warning in 34.28s =========================
```

### Visual Studio Code を使用するためのコンテナのセットアップ
<a name="develop-local-docker-image-setup-visual-studio"></a>

 Visual Studio Code でコンテナを設定するには、次の手順を実行します。

1. Visual Studio Code をインストールします。

1. [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python) をインストールします。

1. [Visual Studio Code Remote – コンテナ](https://code.visualstudio.com/docs/remote/containers)をインストールします。

1. Visual Studio Code でワークスペースフォルダを開きます。

1. `Ctrl+Shift+P` (Windows/Linux) または `Cmd+Shift+P` (Mac) を押します。

1. 「`Preferences: Open Workspace Settings (JSON)`」と入力します。

1. Enter キーを押します。

1. 次の JSON を貼り付け、保存します。

   ```
   {
       "python.defaultInterpreterPath": "/usr/bin/python3.11",
       "python.analysis.extraPaths": [
           "/usr/lib/spark/python/lib/py4j-0.10.9.7-src.zip:/usr/lib/spark/python/:/usr/lib/spark/python/lib/",
       ]
   }
   ```

 コンテナを設定するには: 

1. Docker コンテナを実行します。

   ```
   $ docker run -it --rm \
       -v ~/.aws:/home/hadoop/.aws \
       -v $WORKSPACE_LOCATION:/home/hadoop/workspace/ \
       -e AWS_PROFILE=$PROFILE_NAME \
       --name glue5_pyspark \
       public.ecr.aws/glue/aws-glue-libs:5 \
       pyspark
   ```

1. Visual Studio Code を起動します。

1.  左側のメニューで **[Remote Explorer]** (リモートエクスプローラー) を選択した上で、`amazon/aws-glue-libs:glue_libs_4.0.0_image_01` を選択します。

1.  右クリックし、**[Attach in Current Window]** (現在のウィンドウにアタッチする) を選択します。  
![\[右クリックすると、[Attach in Current Window] のオプションを含むウィンドウが表示されます。\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/vs-code-other-containers.png)

1.  次のダイアログが表示されたら、**[Got it]** (取得しました) を選択します。  
![\[「コンテナにアタッチすると任意のコードが実行される可能性があります」というメッセージを含むウィンドウ警告。\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/vs-code-warning-got-it.png)

1. `/home/handoop/workspace/` を開きます。  
![\[[Workspace] (ワークスペース) オプションを含むウィンドウ ドロップダウンが強調表示されます。\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/vs-code-open-workspace.png)

1.  AWS Glue PySpark スクリプトを作成し、**[Run]** (実行) を選択します。

   このスクリプトは正常に実行されたことが表示されます。  
![\[スクリプトが正常に実行されました。\]](http://docs.aws.amazon.com/ja_jp/glue/latest/dg/images/vs-code-run-successful-script.png)

## AWS Glue 4.0 と AWS Glue 5.0 の Docker イメージの変更点
<a name="develop-local-docker-glue4-glue5-changes"></a>

 AWS Glue 4.0 と AWS Glue 5.0 の Docker イメージの主な変更点: 
+  AWS Glue 5.0 では、バッチジョブとストリーミングジョブの両方に 1 つのコンテナイメージがあります。これは、バッチ用とストリーミング用にそれぞれ別のイメージがあった Glue 4.0 とは異なります。
+  AWS Glue 5.0 では、コンテナのデフォルトのユーザー名は `hadoop` です。AWS Glue 4.0 では、デフォルトのユーザー名は `glue_user` でした。
+  AWS Glue 5.0 では、JupyterLab や Livy など、いくつかの追加ライブラリがイメージから削除されています。これらのライブラリは手動でインストールできます。
+  AWS Glue 5.0 では、Iceberg、Hudi、Delta のすべてのライブラリがデフォルトでプリロードされるようになり、環境変数 `DATALAKE_FORMATS` は不要になりました。AWS Glue 4.0 以前は、環境変数 `DATALAKE_FORMATS` を使用して、ロードする特定のテーブル形式を指定していました。

 上記のリストは Docker イメージ固有のものです。AWS Glue 5.0 の更新の詳細については、「[Introducing AWS Glue 5.0 for Apache Spark](https://aws.amazon.com/blogs/big-data/introducing-aws-glue-5-0-for-apache-spark/)」および「[Migrating AWS Glue for Spark jobs to AWS Glue version 5.0](https://docs.aws.amazon.com/glue/latest/dg/migrating-version-50.html)」を参照してください。

## 考慮事項
<a name="develop-local-docker-considerations"></a>

 AWS Glue コンテナイメージを使用してジョブスクリプトをローカルで開発する場合、以下の機能はサポートされていないことに注意してください。
+  [ジョブのブックマーク](https://docs.aws.amazon.com/glue/latest/dg/monitor-continuations.html) 
+  AWS Glue Parquet ライター ([AWS Glue で Parquet 形式を使用する場合](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-format-parquet-home.html)) 
+  [FillMissingValues 変換](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-pyspark-transforms-fillmissingvalues.html) 
+  [FindMatches 変換](https://docs.aws.amazon.com/glue/latest/dg/machine-learning.html#find-matches-transform) 
+  [ベクトル化された SIMD CSV リーダー](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-format-csv-home.html#aws-glue-programming-etl-format-simd-csv-reader) 
+  Amazon S3 パスから JDBC ドライバーをロードする際の [customJdbcDriverS3Path](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-connect.html#aws-glue-programming-etl-connect-jdbc) プロパティ 
+  [AWS Glue Data Quality](https://docs.aws.amazon.com/glue/latest/dg/glue-data-quality.html) 
+  [機密データの検出](https://docs.aws.amazon.com/glue/latest/dg/detect-PII.html) 
+  AWS Lake Formation アクセス許可ベースの認証情報供給 

## 付録: JDBC ドライバーと Java ライブラリの追加
<a name="develop-local-docker-image-appendix"></a>

 コンテナで現在使用できない JDBC ドライバーを追加するには、必要な JAR ファイルを使用してワークスペースの下に新しいディレクトリを作成し、Docker 実行コマンド内でディレクトリを `/opt/spark/jars/` にマウントします。コンテナ内の `/opt/spark/jars/` の下にある JAR ファイルは Spark Classpath に自動的に追加され、ジョブの実行中に使用できます。

 たとえば、次の Docker 実行コマンドを使用して、PySpark REPL シェルに JDBC ドライバー jar を追加できます。

```
docker run -it --rm \
    -v ~/.aws:/home/hadoop/.aws \
    -v $WORKSPACE_LOCATION:/home/hadoop/workspace/ \
    -v $WORKSPACE_LOCATION/jars/:/opt/spark/jars/ \
    --workdir /home/hadoop/workspace \
    -e AWS_PROFILE=$PROFILE_NAME \
    --name glue5_jdbc \
    public.ecr.aws/glue/aws-glue-libs:5 \
    pyspark
```

 「**考慮事項**」で強調されているように、`customJdbcDriverS3Path` 接続オプションを使用して Amazon S3 から AWS Glue コンテナイメージにカスタム JDBC ドライバーをインポートすることはできません。