TerraformでAWS Glue ジョブ 定期実行させてみた(EventBridge スケジュール vs Glue トリガー)
こんにちは、ともぞうです。
今回のブログでは、Terraformを用いてAWS Glueジョブをある決まった時刻(毎日 JST AM9:00等)に定期実行させる方法(リソース)を2つ紹介します。
- EventBridge スケジュール
- Glue トリガー
前提
今回はTerraformを使用するため事前にインストールが必要になります。
使用したバージョンは下記となります。
- Terraform・・・v1.9.0(provider registry.terraform.io/hashicorp/aws v5.63.0)
Terraformコード
① EventBridge スケジュール
タイムゾーンに日本を設定できます。
# EventBridge Schedulerの設定
resource "aws_scheduler_schedule" "eventbridge_schedule" {
name = "glue-job-invoke-scheduler" # スケジューラの名前を設定
group_name = "default" # デフォルトのグループを使用
# フレキシブルタイムウィンドウをOFFに設定
flexible_time_window {
mode = "OFF"
}
# スケジュール式の設定(例:毎日JST午前9時に実行)
schedule_expression_timezone = "Asia/Tokyo"
schedule_expression = "cron(0 9 ? * * *)"
# ターゲットの設定
target {
# この行が重要: Glueジョブを直接起動するためのAWS SDKアクションARN
arn = "arn:aws:scheduler:::aws-sdk:glue:startJobRun"
# EventBridge Schedulerが使用するIAMロールのARN
role_arn = aws_iam_role.eventbridge_scheduler_role.arn
# 起動するGlueジョブの設定
input = jsonencode({
JobName = "sample-glue-job" # 実行するGlueジョブの名前
})
}
# スケジューラの状態を有効に設定
state = "ENABLED"
}
# EventBridge Scheduler用のIAMロールを作成
resource "aws_iam_role" "eventbridge_scheduler_role" {
name = "scheduled-glue-job-execution-role"
# EventBridge Schedulerがこのロールを引き受けることを許可
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Action = "sts:AssumeRole"
Effect = "Allow"
Principal = {
Service = "scheduler.amazonaws.com"
}
}
]
})
}
# AWSGlueServiceRoleポリシーをロールにアタッチ
resource "aws_iam_role_policy_attachment" "glue_service_role_attach" {
role = aws_iam_role.eventbridge_scheduler_role.name
policy_arn = "arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole"
}
※HashiCorpのAWSプロバイダーに関するドキュメントページを参考にしています。
② Glue トリガー
タイムゾーンはUTCのみ設定できます。
そのため、JST時刻で設定したい場合は想定しているJST時刻から9時間引くことを忘れずに。
resource "aws_glue_trigger" "example_trigger" {
name = "glue-job-invoke-trigger" # Glueトリガーの名前を設定
type = "SCHEDULED" # Glueトリガーのタイプをスケジュールに設定
schedule = "cron(0 0 * * ? *)" # 日本時間午前9時に毎日実行するためのCronスケジュール(UTC時間午前0時)
start_on_creation = true # Glueトリガーを有効化
actions {
job_name = "sample-glue-job" # 実行するGlueジョブの名前を指定
}
}
※HashiCorpのAWSプロバイダーに関するドキュメントページを参考にしています。
まとめ
基本的にどちらの方法を採用しても目的は達成できます。
EventBridge スケジュール、Glue トリガーをそれぞれ採用すべきユースケースを個人的に考えてみました。
-
EventBridge スケジュール
- Glueジョブを定期実行するスケジューラの他にも、LambdaやStepFunctionを定期実行するスケジューラを全てEventBridge スケジュールで作成している場合など(管理がしやすい)
- 何らかの原因(AWSの一時的なサービス障害や人為的ミス)によってスケジューラが正常に動作しない場合、DLQにメッセージを配信し、アラートをすぐに検知したい場合(エラーの迅速な察知ができる)
- UTC時刻に限らず世界各国にスケジュールを管理したい場合(日本だけでなく様々な国の時刻に対応している)
-
Glue トリガー
- EventBridge スケジュールをそもそも使うケースが少なく、スケジューラの一元管理場所がそもそもないケース。(後にEventBridgeスケジュールに移行するケースも考えられる)
- スケジューラが正常に動作しなかったとしても被害がそもそも少ない場合。お試しで1週間だけGlueジョブを動かしてみるPoC等
以上です。
本稿が、Terraformを使ってAWS Glueを定期実行させたい 人の第一歩として参考になれば幸いです。