Amazon EventBridge SchedulerとAWS Glue Python Shellの定期実行をCDKで構築する
データ事業本部インテグレーション部機械学習チーム・新納(にいの)です。
Lambdaで実行するには時間がかかるPythonスクリプトを定期的に実行したい場合、Glue Python Shellが便利です。EventBridge Schedulerから定期実行させる構成をCDK化する際に少し工夫が必要でしたので備忘録として書き残します。
前提・構成
以下をデプロイします。
実装
スタックの実装は以下の通りです。
以下の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のコード一式は冒頭のリポジトリにアップロードしていますので、ご興味があればご覧ください。