[アップデート] AWS Glue ETL ジョブで Glue バージョンに Auto を指定できるようになったので、5.1 から 6.0 への自動アップグレードを試してみた

[アップデート] AWS Glue ETL ジョブで Glue バージョンに Auto を指定できるようになったので、5.1 から 6.0 への自動アップグレードを試してみた

AWS Glue ETL ジョブの Glue バージョンに Auto を指定すると、ジョブの実行を観測して互換性を確認し、承認後に最新の Glue 6.0 で実行して出力・性能・コストを比較したうえで移行が完了します。スクリプトは変更されず、追加料金もかかりません。Glue 5.1 のジョブで 6.0 への移行を試しました。
2026.11.06

クラウド事業統括本部の石川です。AWS Glue の Spark ETL ジョブで、Glue バージョンに「Auto」を指定すると、新しい Glue バージョンへの移行が自動で評価され、承認後に適用されるようになりました。既存の Glue 5.1 のジョブを Auto に変更し、Glue 6.0 へのアップグレードが完了するまでをマネジメントコンソールから試してみました。

https://awsapichanges.com/archive/changes/7e892e-glue.html

AWS Glue の API 変更で、ジョブ定義の GlueVersion に auto を指定できるようになりました。あわせて、自動アップグレードの分析状況を取得・操作する API が 3 つ追加され、GetJob などのレスポンスに自動アップグレードの状態を示す AutoUpgradeMetadata が追加されています。

これまで既存ジョブを新しい Glue バージョンへ移行するには、ジョブ定義の Glue バージョンを書き換えるか、生成 AI による Spark アップグレード(Upgrade analysis)で結果の出力先 S3 パスを指定して分析を実行し、提案されたスクリプトを適用する必要がありました。

https://docs.aws.amazon.com/glue/latest/dg/upgrade-analysis.html

Glue 6.0 の発表ブログでも、既存ジョブを auto-upgrade 機能で Glue 6.0 に自動アップグレードできることに触れられています。

https://aws.amazon.com/blogs/aws/aws-glue-6-0-now-available-with-30-lower-price-and-full-apache-iceberg-v3-support/

検証を行った 2026 年 11 月 6 日の午前の時点では、この機能の What's New とユーザーガイドは見つかりませんでした。そのためこの検証は、API 変更の内容、SDK リファレンス、マネジメントコンソールの表示、実際の動作の観測結果に基づいています。

https://docs.aws.amazon.com/glue/latest/dg/auto-version-upgrades.html

https://docs.aws.amazon.com/glue/latest/dg/auto-version-upgrades-how-an-auto-upgrade-evaluation-works.html

Glue バージョンの自動アップグレード(Auto)とは

Spark ETL ジョブの Glue バージョンを Auto にすると、AWS Glue がジョブの実行を観測して新しいバージョンへの移行が可能かを評価し、利用者の承認を得てから新しいバージョンで実行するようになります。コンソールの Glue version の選択肢には「Auto - New versions are assessed automatically and applied with your approval」と表示されます。

今回の検証で観測した状態の遷移は次のとおりです。点線は、今回は検証しておらず、コンソールやレポートの説明文に基づく遷移です。

追加された API は次の 3 つです。

API 内容
GetJobUpgradeAnalysis ジョブ名と分析 ID を指定して、分析の状態・移行元と移行先のバージョン・レポートの URI を取得する
StartJobUpgradeAnalysis WAITING_FOR_CONSENT の分析を upgradeConsent=APPROVE または DECLINE で再開する
StopJobUpgradeAnalysis 進行中の分析を停止する

https://docs.aws.amazon.com/boto3/latest/reference/services/glue/client/get_job_upgrade_analysis.html

https://docs.aws.amazon.com/boto3/latest/reference/services/glue/client/start_job_upgrade_analysis.html

状態を表す値は、ジョブ側の AutoUpgradeMetadata.Status と分析側の GetJobUpgradeAnalysis の status とで種類が異なります。

取得元 値
GetJob などの AutoUpgradeMetadata.Status OBSERVING / WAITING_FOR_CONSENT / UPGRADING / UPGRADE_SUCCEEDED / UPGRADE_FAILED / STOPPED
GetJobUpgradeAnalysis の status OBSERVING / WAITING_FOR_CONSENT / UPGRADING / SUCCEEDED / FAILED / TIMEOUT / STOPPED

移行先の Glue 6.0 は Spark 4.1 と Python 3.13 で動作し、Spark SQL の ANSI モードが既定で有効になるなどの変更があります。

https://docs.aws.amazon.com/glue/latest/dg/migrating-version-60.html

やってみた

前提条件

  • 検証環境: 東京リージョン
  • AWS CLI: 2.39.5(執筆時点の最新バージョンが必須)

AWS CLI 2.39.5 には get-job-upgrade-analysis、start-job-upgrade-analysis、stop-job-upgrade-analysis の 3 つのコマンドが含まれていました。

検証用のジョブを作成する

20 行の注文データ(CSV)を顧客ごとに集計し、Parquet で S3 に書き出す PySpark スクリプトを用意しました。実行時のランタイムを確認するため、Spark のバージョン、Python のバージョン、spark.sql.ansi.enabled の値をログに出力しています。

orders_agg.py
import sys
from awsglue.utils import getResolvedOptions
from awsglue.context import GlueContext
from awsglue.job import Job
from pyspark.context import SparkContext
from pyspark.sql import functions as F
from pyspark.sql.types import StructType, StructField, StringType, IntegerType, DoubleType, DateType

args = getResolvedOptions(sys.argv, ["JOB_NAME", "input_path", "output_path"])

sc = SparkContext.getOrCreate()
glue_context = GlueContext(sc)
spark = glue_context.spark_session
job = Job(glue_context)
job.init(args["JOB_NAME"], args)

print(f"[runtime] spark.version={spark.version}")
print(f"[runtime] python={sys.version.split()[0]}")
print(f"[runtime] spark.sql.ansi.enabled={spark.conf.get('spark.sql.ansi.enabled')}")

schema = StructType([
    StructField("order_id", IntegerType(), False),
    StructField("customer_id", StringType(), False),
    StructField("unit_price", DoubleType(), False),
    StructField("quantity", IntegerType(), False),
    StructField("order_date", DateType(), False),
])

orders = spark.read.option("header", "true").schema(schema).csv(args["input_path"])

summary = (
    orders.withColumn("amount", F.col("unit_price") * F.col("quantity"))
    .groupBy("customer_id")
    .agg(F.count("order_id").alias("order_count"), F.round(F.sum("amount"), 2).alias("total_amount"))
    .orderBy("customer_id")
)

summary.write.mode("overwrite").parquet(args["output_path"])

rows = summary.collect()
print(f"[result] input_rows={orders.count()} output_rows={len(rows)}")
for r in rows:
    print(f"[result] {r['customer_id']} order_count={r['order_count']} total_amount={r['total_amount']}")

job.commit()

ジョブは Glue 5.1、G.1X × 2 ワーカーで作成しました。

create_job.json
{
  "Name": "glue-autoupg-orders",
  "Description": "Verification job for Glue auto version upgrade",
  "Role": "arn:aws:iam::123456789012:role/AWSGlueServiceRoleDefault",
  "Command": {"Name": "glueetl", "ScriptLocation": "s3://glue-autoupg-123456789012-20261106/scripts/orders_agg.py", "PythonVersion": "3"},
  "DefaultArguments": {
    "--job-language": "python",
    "--job-bookmark-option": "job-bookmark-disable",
    "--TempDir": "s3://glue-autoupg-123456789012-20261106/temporary/",
    "--enable-continuous-cloudwatch-log": "true",
    "--input_path": "s3://glue-autoupg-123456789012-20261106/input/",
    "--output_path": "s3://glue-autoupg-123456789012-20261106/output/orders_summary/"
  },
  "MaxRetries": 0,
  "Timeout": 10,
  "GlueVersion": "5.1",
  "WorkerType": "G.1X",
  "NumberOfWorkers": 2,
  "ExecutionProperty": {"MaxConcurrentRuns": 1}
}
% aws glue create-job --cli-input-json file://create_job.json
% aws glue start-job-run --job-name glue-autoupg-orders

Auto に変更する前のベースラインとして 1 回実行し、ログを確認しました。

% aws logs filter-log-events \
  --log-group-name /aws-glue/jobs/output \
  --log-stream-name-prefix jr_13753386a96c53c81ec9af57ce88fa231361bcc56a411b534fe85e8eb26e3419 \
  --filter-pattern '?"[runtime]" ?"[result]"' \
  --query 'events[].message' --output text
[runtime] spark.version=3.5.6-amzn-1
[runtime] python=3.11.15
	[runtime] spark.sql.ansi.enabled=false
	[result] input_rows=20 output_rows=5
[result] C001 order_count=4 total_amount=6000.0
[result] C002 order_count=4 total_amount=6550.5
[result] C003 order_count=4 total_amount=7950.0
[result] C004 order_count=4 total_amount=5780.0
[result] C005 order_count=4 total_amount=5303.0

Glue 5.1 では Spark 3.5.6、Python 3.11 で動作し、ANSI モードは無効でした。

Glue version を Auto に変更する

AWS Glue Studio でジョブを開き、[Job details]タブの[Glue version]のプルダウンを開くと、先頭に Auto の選択肢が表示されました。

Auto を選ぶと、プルダウンの下に「Your job will be assessed for upgrade eligibility to Glue 6.0, and automatically for future versions. Upgrades are applied only with your approval.」と表示されます。Glue 6.0 への移行可否が評価され、将来のバージョンについても自動で評価されること、アップグレードは承認した場合にのみ適用されることが書かれています。

[Save]を押したところ、[Number of retries]に「Value must be an integer between 1 and 2147483647.」と表示されて保存できませんでした。CLI でジョブを作成した際に MaxRetries を 0 にしていたためです。今回は 1 に変更して保存しました。

ユーザーガイドによると、Auto を使うには MaxRetries が 1 以上である必要があります。新しいバージョンでの実行が失敗したとき、AWS Glue はこの再試行を使って元のバージョンで実行し直すためです。この再試行は、ジョブの通常の再試行回数に含まれます。あわせて、ジョブ実行のキューイング(Job run queuing)が無効であることも要件として挙げられています。

保存直後に CLI でジョブ定義を取得しました。

% aws glue get-job --job-name glue-autoupg-orders --output json
{
    "Job": {
        "Name": "glue-autoupg-orders",
        "JobMode": "SCRIPT",
        "JobRunQueuingEnabled": false,
        "Description": "Verification job for Glue auto version upgrade",
        "Role": "arn:aws:iam::123456789012:role/AWSGlueServiceRoleDefault",
        "CreatedOn": "2026-11-06T09:04:58.321000+09:00",
        "LastModifiedOn": "2026-11-06T09:09:01.284000+09:00",
        "ExecutionProperty": {
            "MaxConcurrentRuns": 1
        },
        "Command": {
            "Name": "glueetl",
            "ScriptLocation": "s3://glue-autoupg-123456789012-20261106/scripts/orders_agg.py",
            "PythonVersion": "3"
        },
        "DefaultArguments": {
            "--enable-job-insights": "true",
            "--enable-observability-metrics": "false",
            "--enable-continuous-cloudwatch-log": "true",
            "--input_path": "s3://glue-autoupg-123456789012-20261106/input/",
            "--job-bookmark-option": "job-bookmark-disable",
            "--job-language": "python",
            "--TempDir": "s3://glue-autoupg-123456789012-20261106/temporary/",
            "--output_path": "s3://glue-autoupg-123456789012-20261106/output/orders_summary/"
        },
        "MaxRetries": 1,
        "AllocatedCapacity": 2,
        "Timeout": 10,
        "MaxCapacity": 2.0,
        "WorkerType": "G.1X",
        "NumberOfWorkers": 2,
        "GlueVersion": "auto",
        "ExecutionClass": "STANDARD",
        "AutoUpgradeMetadata": {
            "TargetVersion": "6.0",
            "SourceVersion": "5.1",
            "Status": "OBSERVING",
            "AnalysisId": "ja-a7da8000-acd7-4f9c-9cf1-2e3fefe829ba"
        }
    }
}

GlueVersion が auto になり、AutoUpgradeMetadata に移行元 5.1、移行先 6.0、状態 OBSERVING、分析 ID が設定されました。分析 ID を指定して、分析の状態も取得しました。

% aws glue get-job-upgrade-analysis \
  --job-name glue-autoupg-orders \
  --analysis-id ja-a7da8000-acd7-4f9c-9cf1-2e3fefe829ba \
  --output json
{
    "jobName": "glue-autoupg-orders",
    "analysisId": "ja-a7da8000-acd7-4f9c-9cf1-2e3fefe829ba",
    "status": "OBSERVING",
    "sourceVersion": "5.1",
    "targetVersion": "6.0",
    "analysisType": "AUTO_UPGRADE"
}

分析の種類は AUTO_UPGRADE です。この時点ではレポートの URI のフィールドは含まれていませんでした。

コンソールの[Upgrade analysis]タブにも分析が表示されています。画面下部の[Analysis details]パネルの中央の列に[Observation job runs][Upgraded runs]、右の列に[Auto upgrade eligibility summary][Auto upgrade evaluation summary]があり、この時点では値は空欄(-)です。

状態の横の情報アイコンを押すと、「AWS Glue is observing this job's runs to check if it can upgrade to AWS Glue 6.0. Run the job at least 3 times to complete the analysis. Nothing upgrades without your consent.」と表示されました。分析を完了するには、ジョブを 3 回以上実行する必要があります。

観測(OBSERVING)のためにジョブを 3 回実行する

コンソールの[Run]でジョブを 3 回実行しました。get-job-runs で取得した各実行の結果は次のとおりです。

開始時刻 終了時刻 状態 Glue バージョン 実行時間 DPU 秒
09:09:47 09:12:05 SUCCEEDED 5.1 123 秒 247
09:13:21 09:14:59 SUCCEEDED 5.1 75 秒 151
09:16:33 09:18:19 SUCCEEDED 5.1 85 秒 170

OBSERVING の間、ジョブ定義の GlueVersion は auto ですが、実行は移行元の 5.1 で行われました。

実行時の引数を比較すると、Auto に変更した後の実行には、ジョブ定義にない次の引数が付与されていました。Auto に変更する前のベースライン実行には付いていません。

  • --conf spark.plugins.defaultList=com.amazonaws.services.glue.spark.SparkMetadataTrackerPlugin
  • --conf spark.sql.operation.metadata.path=presigned-b64:<masked>(値は Base64 でエンコードされた署名付き URL で、一時認証情報を含むため伏せています。デコードすると、AWS 側の S3 バケット glue-auto-version-artifacts-prod-ap-northeast-1 の実行ごとのパスを指していました。1 回目の観測実行では https://glue-auto-version-artifacts-prod-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/123456789012/ja-a7da8000-acd7-4f9c-9cf1-2e3fefe829ba/data_quality_artifacts/job_run_metadata/jr_f1b499ffb342bd1c2d9c61bb8c02894ea31335f4f240a00710458f79d3b91909/metadata.json に、署名のクエリ文字列が付いた URL でした)

実行時の引数には --enable-job-insights(true)と --enable-observability-metrics(false)も含まれていました。ただしこの 2 つは、前述の保存直後の get-job の出力のとおり、ジョブ定義の DefaultArguments に入っています。CLI でジョブを作成した時点の定義には含まれていなかったため、コンソールで保存したときにジョブ定義へ追加されたものです。

なお、2 回目の実行が終わった直後(CloudTrail の記録で 09:15:37)に[Run]を押したところ、ConcurrentRunsExceededException で開始に失敗しました。get-job-runs では実行中のジョブはありませんでした。このジョブは同時実行数(MaxConcurrentRuns)を 1 にしています。

このあと[Observation job runs]には 4 つ目の実行 ID(jr_c4cf04fa4982aeb9cadecece745627a6f9c8e76ab4c06f7d854f3637d1d89668)が表示されましたが、この ID を get-job-run で照会すると EntityNotFoundException が返りました。後述する評価サマリーのベースラインは「3 observation runs」と記載されていました。

同意レポートを確認して承認する

3 回目の観測実行が 09:18:19 に終わり、09:19:47 に CLI で取得した時点で状態は WAITING_FOR_CONSENT になっていました。

% aws glue get-job-upgrade-analysis \
  --job-name glue-autoupg-orders \
  --analysis-id ja-a7da8000-acd7-4f9c-9cf1-2e3fefe829ba \
  --output json
{
    "jobName": "glue-autoupg-orders",
    "analysisId": "ja-a7da8000-acd7-4f9c-9cf1-2e3fefe829ba",
    "status": "WAITING_FOR_CONSENT",
    "sourceVersion": "5.1",
    "targetVersion": "6.0",
    "analysisType": "AUTO_UPGRADE",
    "autoUpgradeEligibilitySummary": "https://glue-auto-version-artifacts-prod-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/123456789012/ja-a7da8000-acd7-4f9c-9cf1-2e3fefe829ba/upgrade_eligibility_report.md?X-Amz-Security-Token=<masked>&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20261106T001948Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Credential=<masked>&X-Amz-Signature=<masked>"
}

autoUpgradeEligibilitySummary には同意レポートの URI が設定されています。レポートは自分の S3 バケットではなく、AWS 側のバケット glue-auto-version-artifacts-prod-ap-northeast-1 に置かれ、有効期限 3,600 秒の署名付き URL で返されました。

コンソールでは状態が[Waiting for consent]になり、[Analysis details]に[Approve][Decline]ボタンが表示されました。ページ上部にも「1 jobs are waiting for your consent to upgrade to Glue 6.0」という通知が出ます。

同意レポート(upgrade_eligibility_report.md)は Markdown 形式で、主な内容は次のとおりでした。

  • 冒頭に「This job is eligible for upgrade.」と記載されている
  • Compatibility Summary として次の 3 項目を確認しており、すべて PASS だった
項目 確認内容
Configuration --conf 引数の非推奨の Spark 設定、ジョブのデフォルト引数の非推奨の Glue 機能
Application Code スクリプト、extra-py-files、extra-files の移行先バージョンでの Spark・Python の互換性
Dependencies additional-python-modules の互換性のないバージョン指定、移行先でデフォルトに含まれなくなったモジュールの import、別の Python バージョン向けの wheel ファイル
  • Write Paths として、観測実行で書き込まれたパス(s3://glue-autoupg-123456789012-20261106/output/orders_summary)、モード(overwrite)、形式(parquet)が記録されている
  • アップグレードの検証フェーズでは、新しいバージョンでの実行が失敗して現行バージョンで再実行された場合、両方の実行が同じパスに書き込む可能性があると説明されている。append モードのジョブでは出力が重複する可能性があり、overwrite モードであれば対応は不要と書かれている
  • Approve すると次の実行から新しいバージョンで動き、Decline すると Auto が無効になり元の Glue バージョンに戻ると書かれている

内容を確認したうえで、コンソールの[Approve]を押しました。

状態はすぐに[Upgrading]になりました。情報アイコンには「Your job is now running on AWS Glue 6.0. AWS Glue is monitoring its runs and will revert to the previous Glue version if a run fails. No action is needed.」と表示されました。6.0 での実行が失敗した場合は、元のバージョンに戻されます。

承認後(UPGRADING)にジョブを実行する

承認後、コンソールの[Run]でジョブを 3 回実行しました。

開始時刻 終了時刻 状態 Glue バージョン 実行時間 DPU 秒
09:21:43 09:22:45 SUCCEEDED 6.0 56 秒 112
09:24:11 09:25:26 SUCCEEDED 6.0 68 秒 136
09:26:46 09:27:50 SUCCEEDED 6.0 58 秒 116

ジョブ定義の GlueVersion は auto のままで、実行は 6.0 で行われました。1 回目の実行のログは次のとおりです。

% aws logs filter-log-events \
  --log-group-name /aws-glue/jobs/output \
  --log-stream-name-prefix jr_cf561e77f5b85dc22f9a7759396fe0c4a943c5cd60277ba4da37bd36c18b3921 \
  --filter-pattern '?"[runtime]" ?"[result]"' \
  --query 'events[].message' --output text
[runtime] spark.version=4.1.1-amzn-0
[runtime] python=3.13.14
	[runtime] spark.sql.ansi.enabled=true
	[result] input_rows=20 output_rows=5
[result] C001 order_count=4 total_amount=6000.0
[result] C002 order_count=4 total_amount=6550.5
[result] C003 order_count=4 total_amount=7950.0
[result] C004 order_count=4 total_amount=5780.0
[result] C005 order_count=4 total_amount=5303.0

Spark 4.1.1、Python 3.13 で動作し、ANSI モードは有効になっています。集計結果はベースラインと同じでした。

アップグレードの完了を確認する

承認後 3 回目の実行が終わったあと、09:29:11 に取得した時点で分析は SUCCEEDED、ジョブ側は UPGRADE_SUCCEEDED になっていました。

% aws glue get-job --job-name glue-autoupg-orders --output json
{
    "Job": {
        "Name": "glue-autoupg-orders",
        "JobMode": "SCRIPT",
        "JobRunQueuingEnabled": false,
        "Description": "Verification job for Glue auto version upgrade",
        "Role": "arn:aws:iam::123456789012:role/AWSGlueServiceRoleDefault",
        "CreatedOn": "2026-11-06T09:04:58.321000+09:00",
        "LastModifiedOn": "2026-11-06T09:28:53.756000+09:00",
        "ExecutionProperty": {
            "MaxConcurrentRuns": 1
        },
        "Command": {
            "Name": "glueetl",
            "ScriptLocation": "s3://glue-autoupg-123456789012-20261106/scripts/orders_agg.py",
            "PythonVersion": "3"
        },
        "DefaultArguments": {
            "--enable-job-insights": "true",
            "--enable-observability-metrics": "false",
            "--enable-continuous-cloudwatch-log": "true",
            "--input_path": "s3://glue-autoupg-123456789012-20261106/input/",
            "--job-bookmark-option": "job-bookmark-disable",
            "--job-language": "python",
            "--TempDir": "s3://glue-autoupg-123456789012-20261106/temporary/",
            "--output_path": "s3://glue-autoupg-123456789012-20261106/output/orders_summary/"
        },
        "MaxRetries": 1,
        "AllocatedCapacity": 2,
        "Timeout": 10,
        "MaxCapacity": 2.0,
        "WorkerType": "G.1X",
        "NumberOfWorkers": 2,
        "GlueVersion": "auto",
        "ExecutionClass": "STANDARD",
        "AutoUpgradeMetadata": {
            "TargetVersion": "6.0",
            "SourceVersion": "5.1",
            "Status": "UPGRADE_SUCCEEDED",
            "AnalysisId": "ja-a7da8000-acd7-4f9c-9cf1-2e3fefe829ba"
        }
    }
}
% aws glue get-job-upgrade-analysis \
  --job-name glue-autoupg-orders \
  --analysis-id ja-a7da8000-acd7-4f9c-9cf1-2e3fefe829ba \
  --output json
{
    "jobName": "glue-autoupg-orders",
    "analysisId": "ja-a7da8000-acd7-4f9c-9cf1-2e3fefe829ba",
    "status": "SUCCEEDED",
    "sourceVersion": "5.1",
    "targetVersion": "6.0",
    "analysisType": "AUTO_UPGRADE",
    "autoUpgradeEvaluationSummary": "https://glue-auto-version-artifacts-prod-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/123456789012/ja-a7da8000-acd7-4f9c-9cf1-2e3fefe829ba/auto_upgrade_summary.md?X-Amz-Security-Token=<masked>&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20261106T002912Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3599&X-Amz-Credential=<masked>&X-Amz-Signature=<masked>",
    "autoUpgradeEligibilitySummary": "https://glue-auto-version-artifacts-prod-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/123456789012/ja-a7da8000-acd7-4f9c-9cf1-2e3fefe829ba/upgrade_eligibility_report.md?X-Amz-Security-Token=<masked>&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20261106T002912Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Credential=<masked>&X-Amz-Signature=<masked>"
}

完了後もジョブ定義の GlueVersion は auto のままです。Auto に変更して保存した直後のジョブ定義と比べると、変わっていたのは AutoUpgradeMetadata.Status と LastModifiedOn だけでした。S3 上のスクリプトの内容も変わっていません。

評価サマリー(auto_upgrade_summary.md)の結果は「UPGRADE COMPLETED」でした。5.1 での観測実行 3 回をベースラインとし、6.0 での実行 3 回を Performance(性能)、Correctness(出力の正しさ)、Cost(リソース消費)の 3 つの観点で比較しており、すべて PASS でした。個別のチェック項目は次のとおりです。

チェック項目 期待値 6.0 での実行 1 6.0 での実行 2 6.0 での実行 3 結果
Operation structure 書き込み操作 1 件(数・種類・順序が同じ) Match Match Match PASS
Schema match 完全一致 Match Match Match PASS
Output file format 完全一致 Match Match Match PASS
Output row count 3.50〜6.50 5.00 5.00 5.00 PASS
Output file count 0.70〜1.30 1.00 1.00 1.00 PASS
Execution time 2.85 分以下 0.94 分 1.14 分 0.97 分 PASS
Resource usage 341.69 DPU 秒以下 120.00 136.32 120.00 PASS
Estimated cost (USD) 0.04 以下 0.01 0.01 0.01 PASS

このほかに書き込み・読み込みのスループットと、出力の列ごとのスキーマ・NULL でない値の割合も確認されていました。Next Steps には「Your job now runs on Glue 6.0 and stays enrolled in auto upgrade, so it will be upgraded automatically when a newer version becomes available.」と書かれており、ジョブは 6.0 で実行されるようになったうえで Auto の対象として残り、さらに新しいバージョンが出たときにも自動アップグレードの対象になります。

コンソールでも状態は[Succeeded]になり、[Apply upgraded script]ボタンは無効で、「Your job is already on the latest Glue version」と表示されました。[Job details]タブの[Glue version]は Auto のままです。

完了後にもう 1 回ジョブを実行したところ、Glue 6.0 で SUCCEEDED となり、集計結果もこれまでと同じでした。分析中に付与されていた SparkMetadataTrackerPlugin の --conf は、この実行では付与されていませんでした。[Runs]タブの一覧で、Glue バージョンが 5.1 から 6.0 に変わったことを確認できます。

考察

ジョブ定義からは実行時の Glue バージョンがわからない

Auto にしたジョブは、アップグレードの前後を通じて GlueVersion が auto のままでした。実際に動くバージョンは、分析の状態によって 5.1 から 6.0 に切り替わりました。ジョブ定義だけを見ても実行されるバージョンはわからないため、実際のバージョンは各実行(JobRun)の GlueVersion や、ジョブの AutoUpgradeMetadata で確認する必要があります。

アップグレードの完了にはジョブの実行が必要

今回の検証では、観測に 3 回、承認後の検証に 3 回、合わせて 6 回のジョブ実行が必要でした。コンソールの説明にも 3 回以上の実行が必要とあり、状態が進んだのはいずれも 3 回目の実行が終わった後でした。今回は手動で続けて実行したため約 20 分で完了しましたが、1 日 1 回スケジュール実行するジョブで同じ回数が必要であれば、観測と検証にそれぞれ 3 日かかる計算になります。

承認後の検証は本番の実行で行われる

承認後の 3 回の実行は、検証用の別ジョブではなく、ジョブ本体の通常の実行として 6.0 で行われ、出力先にもそのまま書き込まれました。同意レポートでは、6.0 での実行が失敗して現行バージョンで再実行された場合に、append モードのジョブで出力が重複する可能性があると注意されています。書き込みモードが append のジョブや、下流で重複を許容できないジョブに Auto を設定する場合は、承認の前に同意レポートの Write Paths を確認する必要があります。

分析用の設定とレポートの保存先

Auto の分析中は、ジョブの実行に SparkMetadataTrackerPlugin の設定と、実行メタデータを AWS 側の S3 バケットに書き込むための署名付き URL が付与されていました。同意レポートと評価サマリーも AWS 側のバケットに置かれ、有効期限付きの署名付き URL で取得する方式でした。既存の生成 AI による Spark アップグレードのように、利用者が結果の出力先 S3 パスを指定する手順はありませんでした。レポートを保管したい場合は、署名付き URL の有効期限内に取得して保存する必要があります。

ジョブ実行時に起きたこと

  • 直前の実行が SUCCEEDED になった直後に開始しようとすると、ConcurrentRunsExceededException になる場合がありました。今回のジョブは同時実行数を 1 にしていました。原因は確認できていません
  • 開始に失敗した後、コンソールの[Observation job runs]に、get-job-run で見つからない実行 ID が表示されました。評価サマリーのベースラインは 3 回と記載されていました
  • CLI で MaxRetries を 0 にしていたジョブは、コンソールで Auto に変更して保存する際に 1 以上への変更が必要でした。ユーザーガイドでも、MaxRetries が 1 以上であることが Auto の要件とされています

ユーザーガイドに記載されている点

次の 2 点は今回検証していませんが、ユーザーガイドに説明があります。

  • 新規作成時に最初から GlueVersion を auto にしたジョブは、ベースラインも承認すべきバージョン変更もないため、観測・互換性チェック・承認を行わずに、移行先のバージョンで実行されます。最初の実行が成功すると評価は完了し、ジョブは Auto のまま残ります。最初の実行が失敗した場合は、新規ジョブの既定の Glue バージョンが設定されます。記事と同じ流れ(観測から承認まで)を試すには、既存のバージョンで作成してから Auto に変更する必要があります
  • Auto の対象は Glue 2.0 以降の Spark ETL ジョブ(glueetl)です。Streaming、Python shell、Ray のジョブは対象外です

最後に

AWS Glue の Spark ETL ジョブで Glue バージョンを Auto に設定し、既存の Glue 5.1 のジョブが Glue 6.0 にアップグレードされるまでを試しました。Auto にすると、AWS Glue が 5.1 でのジョブ実行を 3 回観測して互換性を確認し、承認後は 6.0 で 3 回実行して出力・性能・リソース消費を比較したうえでアップグレードを完了しました。承認しない限りアップグレードされず、コンソールの[Upgrade analysis]タブから同意レポートの確認と承認を行えます。

一方で、ジョブ定義の GlueVersion は auto のままになるため、実際に動くバージョンは実行ごとに確認する必要があります。また、承認後の検証はジョブ本体の通常の実行で行われるため、書き込みモードや下流の処理への影響を承認前に確認してください。

Glue のバージョン移行では Spark や Python のバージョンが変わり、Glue 6.0 の移行ガイドにも破壊的変更が挙げられています。Auto を使うと、移行前後の互換性の確認と出力の比較を、AWS Glue が通常のジョブ実行の中で行います。まずは検証環境のジョブで、同意レポートと評価サマリーの内容を確認してみてください。

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事