AWS CDK v2.87.0 で Glue Job の実行オプションとして FLEX を指定できるようになりました

2023.07.14

こんにちは、CX事業本部 Delivery部の若槻です。

昨年に AWS Glue Job の実行オプションとして Flex がサポートされました。

Flex を有効にすると、専用ではなく予備のコンピューティングリソースを利用して AWS Glue Job が実行されるようになり、最大 34 % のコスト削減を行うことができます。よって緊急度の低いワークロードでの利用に適したオプションとなっています。

今回、AWS CDK v2.87.0 で、Glue Job の ExecutionClass に FLEX を指定できるようになりました

Alpha modules (2.87.0-alpha.0)

Features
glue: add ExecutionClass for FLEX (#26203) (db923dd), closes #22224

ドキュメントはこちらです。

glue.ExecutionClass allows you to specify FLEX or STANDARD. FLEX is appropriate for non-urgent jobs such as pre-production jobs, testing, and one-time data loads.

試してみた

CDK で作成する

CDK(TypeScript)のコードです。

Job.executionClassExecutionClass を使用して FLEX を指定します。(既定では STANDARD となる)

lib/cdk-sample-stack.ts

import { Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as glue_alpha from '@aws-cdk/aws-glue-alpha';

export class CdkSampleStack extends Stack {
  public readonly myFileObjectKey: string;

  constructor(scope: Construct, id: string, props: StackProps) {
    super(scope, id, props);

    new glue_alpha.Job(this, 'MyJob', {
      jobName: 'MyJob',
      executable: glue_alpha.JobExecutable.pythonEtl({
        glueVersion: glue_alpha.GlueVersion.V4_0,
        pythonVersion: glue_alpha.PythonVersion.THREE,
        script: glue_alpha.Code.fromAsset('src/hello_world.py'),
      }),
      executionClass: glue_alpha.ExecutionClass.FLEX,
      workerType: glue_alpha.WorkerType.G_1X,
      workerCount: 10,
    });
  }
}

CDK Deploy で Glue Job をデプロイします。

デプロイされた Glue Job を取得すると、ExecutionClass が FLEX のJob が作成されていることが確認できます。

$ aws glue get-job --job-name MyJob
{
    "Job": {
        "Name": "MyJob",
        "Role": "arn:aws:iam::XXXXXXXXXXXX:role/CdkSampleStack-MyJobServiceRoleE6853162-CMPOPFYA9906",
        "CreatedOn": "2023-07-14T21:28:31.668000+09:00",
        "LastModifiedOn": "2023-07-14T21:28:31.668000+09:00",
        "ExecutionProperty": {
            "MaxConcurrentRuns": 1
        },
        "Command": {
            "Name": "glueetl",
            "ScriptLocation": "s3://cdk-hnb659fds-assets-XXXXXXXXXXXX-ap-northeast-1/735485bcaaf0e69fa8e6b3b9761342c61140967db2c81ef46e6f69dcf9ea41ec.py",
            "PythonVersion": "3"
        },
        "DefaultArguments": {
            "--job-language": "python"
        },
        "MaxRetries": 0,
        "AllocatedCapacity": 10,
        "Timeout": 120,
        "MaxCapacity": 10.0,
        "WorkerType": "G.1X",
        "NumberOfWorkers": 10,
        "GlueVersion": "4.0",
        "ExecutionClass": "FLEX"
    }
}

動作確認

作成された Job を実行します。

job_run_id=$(aws glue start-job-run --job-name MyJob --query 'JobRunId' --output text)

少し待ってからジョブの実行状況を確認すると、実行が成功していますね。

$ aws glue get-job-run --job-name MyJob --run-id ${job_run_id}
{
    "JobRun": {
        "Id": "jr_1b964c414279126a99a1239d111dae85d17f97653c500aacaaedb599edb6bda8",
        "Attempt": 0,
        "JobName": "MyJob",
        "StartedOn": "2023-07-14T21:35:30.038000+09:00",
        "LastModifiedOn": "2023-07-14T21:36:34.446000+09:00",
        "CompletedOn": "2023-07-14T21:36:34.446000+09:00",
        "JobRunState": "SUCCEEDED",
        "PredecessorRuns": [],
        "AllocatedCapacity": 10,
        "ExecutionTime": 56,
        "Timeout": 120,
        "MaxCapacity": 10.0,
        "WorkerType": "G.1X",
        "NumberOfWorkers": 10,
        "LogGroupName": "/aws-glue/jobs",
        "GlueVersion": "4.0",
        "DPUSeconds": 60.0,
        "ExecutionClass": "FLEX"
    }
}

遭遇したエラー

CDK でジョブを作成する際にいくつかエラーに遭遇しました。

FLEX で指定可能な WorkerType はG_1X または G_2X のみ

次のように WorkerType に G_4X を指定してデプロイします。

lib/cdk-sample-stack.ts

    new glue_alpha.Job(this, 'MyJob', {
      jobName: 'MyJob',
      executable: glue_alpha.JobExecutable.pythonEtl({
        glueVersion: glue_alpha.GlueVersion.V4_0,
        pythonVersion: glue_alpha.PythonVersion.THREE,
        script: glue_alpha.Code.fromAsset('src/hello_world.py'),
      }),
      executionClass: glue_alpha.ExecutionClass.FLEX,
      workerType: glue_alpha.WorkerType.G_4X,
      workerCount: 10,
    });

すると、次のようなエラーが発生します。FLEX で指定可能な WorkerType は G_1X または G_2X のみのためです。

$ cdk deploy
/Users/wakatsuki.ryuta/projects/cm-rwakatsuki/cdk_sample_app/node_modules/@aws-cdk/aws-glue-alpha/lib/job.ts:718
        throw new Error('FLEX ExecutionClass is only available for WorkerType G_1X or G_2X');

FLEX を利用できるのは JobType ETL の Job のみ

次のように JobType として PythonShell を指定してデプロイします。

lib/cdk-sample-stack.ts

    new glue_alpha.Job(this, 'MyJob', {
      jobName: 'MyJob',
      executable: glue_alpha.JobExecutable.pythonShell({
        glueVersion: glue_alpha.GlueVersion.V1_0,
        pythonVersion: glue_alpha.PythonVersion.THREE_NINE,
        script: glue_alpha.Code.fromAsset('src/hello_world.py'),
      }),
      executionClass: glue_alpha.ExecutionClass.FLEX,
    });

すると、次のようなエラーが発生します。FLEX で指定可能な JobType は ETL のみのためです。

$ cdk deploy
/Users/wakatsuki.ryuta/projects/cm-rwakatsuki/cdk_sample_app/node_modules/@aws-cdk/aws-glue-alpha/lib/job.ts:712
        throw new Error('FLEX ExecutionClass is only available for JobType.ETL jobs');

おわりに

AWS CDK v2.87.0 で Glue Job の実行オプションとして FLEX を指定できるようになったのでご紹介しました。

プロダクションなどでの利用は想定されていないオプションである点には気をつけて、コスト削減に役立てていただければと思います。

以上