Amazon EventBridge SchedulerとAWS Glue Python Shellの定期実行をCDKで構築する

Amazon EventBridge SchedulerとAWS Glue Python Shellの定期実行をCDKで構築する

Clock Icon2024.11.07

データ事業本部インテグレーション部機械学習チーム・新納(にいの)です。

Lambdaで実行するには時間がかかるPythonスクリプトを定期的に実行したい場合、Glue Python Shellが便利です。EventBridge Schedulerから定期実行させる構成をCDK化する際に少し工夫が必要でしたので備忘録として書き残します。

前提・構成

以下をデプロイします。

glue-eventbridge-overview20241107

実装

スタックの実装は以下の通りです。

https://github.com/niinokaori/glue-python-shell-cdk/blob/main/lib/test_glue-stack.ts

以下のAWSリソースを作成するスタックを定義しています。

  • Glue Python Shell用のスクリプトを格納するS3バケット
  • Glue Python Shell本体
  • Glue Python Shellを定期実行するためのEventBridge Scheduler

主要コンポーネントの解説

大事なポイントをかいつまんで解説します。

1. S3バケットの作成

const scriptBucket = new s3.Bucket(this, 'ScriptBucket', {
  bucketName: `${config.glueJob.scriptBucketName}-${accountID}-${config.region}`,
  // ...
});

Glue Python Shellのスクリプトを格納するためのS3バケットを作成しています。

2. IAMロールの設定

const glueJobRole = new iam.Role(this, 'GlueJobRole', {
  assumedBy: new iam.ServicePrincipal('glue.amazonaws.com'),
  // ...
});

Glue Python Shell実行用のIAMロールを作成し、AWSGlueServiceRoleポリシーとS3バケットへのアクセス権限を付与します。

3. スクリプトのデプロイ

new s3deploy.BucketDeployment(this, 'DeployGlueScript', {
  sources: [s3deploy.Source.asset('./script')],
  destinationBucket: scriptBucket,
  // ...
});

ルートディレクトリ配下の./scriptディレクトリにあるGlue Python Shell用の.pyファイルをS3バケットにアップロードします。

4. Glue Jobの作成

const glueJob = new glue.CfnJob(this, 'GlueSampleJob', {
  name: config.glueJob.jobName,
  role: glueJobRole.roleArn,
  // ...
});

Glue Python ShellタイプのGlue Jobを作成します。実行時の設定(最大同時実行数、タイムアウト時間など)もここで定義しておきます。

5. EventBridge Schedulerの設定

const schedule = new scheduler.CfnSchedule(this, 'GlueJobSchedule', {
      name: config.scheduler.scheduleName,
      scheduleExpression: config.scheduler.scheduleExpression,
      flexibleTimeWindow: {
        mode: 'OFF',
      },
      target: {
        arn: 'arn:aws:scheduler:::aws-sdk:glue:startJobRun',
        roleArn: schedulerRole.roleArn,
        input: JSON.stringify({
          JobName: config.glueJob.jobName,
        }),
      },
    });

Glue Python Shellを定期実行するためのスケジューラーを作成しています。

AWS CDKのL2コンストラクタ(aws-events-targets)にはGlue Jobのターゲットクラスが用意されていません。

そのため、CloudFormationのリソースに1対1でマッピングされるL1コンストラクタ(CfnSchedule)を使用して定義しました。'arn:aws:scheduler:::aws-sdk:glue:startJobRun'を指定することでGlueのstartJobRunを呼び出しています。

最後に

EventBridge SchedulerからGlue Python Shellを定期実行させる仕組みをCDK化した方法の解説でした。aws-events-targetsにGlueのターゲットクラスがなかったので少しつまづいてしまいましたが、L1コンストラクタを使ってターゲット設定しました。

CDKのコード一式は冒頭のリポジトリにアップロードしていますので、ご興味があればご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.