概要
最近はEventBridgeではなくSchedulerのほうが推奨されているらしいので、やってみました。
参考URL -> https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_Amazon-EventBridge-Scheduler_0930_v1.pdf (P.9参照)
環境
- Terraform 1.9.1
- Terraform AWS Provider 5.36.0
コード
# Lambda関数
resource "aws_lambda_function" "sample" {
# 省略
}
# EventBridge Scheduler使用するIAMロール
resource "aws_iam_role" "sample_scheduler" {
name = "sample-scheduler-role"
assume_role_policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Sid = ""
Effect = "Allow"
Principal = {
Service = "scheduler.amazonaws.com"
}
Action = "sts:AssumeRole"
}
]
})
}
# Lambda関数を実行する権限を与える
resource "aws_iam_role_policy" "sample_scheduler" {
role = aws_iam_role.sample_scheduler.name
policy = jsonencode(
{
Version = "2012-10-17",
Statement = [
{
Action = [
"lambda:InvokeFunction",
],
Effect = "Allow",
Resource = aws_lambda_alias.sample.arn,
},
],
}
)
}
# Lambda関数を起動するスケジューラー
# EventBridgeではなく、Schedulerのほうが推奨されている
# https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_Amazon-EventBridge-Scheduler_0930_v1.pdf (P.9参照)
resource "aws_scheduler_schedule" "sample" {
name = "run-sample"
schedule_expression_timezone = "Asia/Tokyo" # 日本のタイムゾーンを指定
schedule_expression = "cron(0 1 * * ? *)" # 日本時間で設定可能!この場合は毎日AM1時0分
flexible_time_window {
mode = "FLEXIBLE"
maximum_window_in_minutes = 1
}
target {
arn = aws_lambda_function.sample.arn # 実行するLambda関数のARN
role_arn = aws_iam_role.sample_scheduler.arn # スケジューラーのIAMロールのARN
}
}
# SchedulerがLambda関数を起動できるように権限を追加
resource "aws_lambda_permission" "sample" {
statement_id = "sample-scheduler"
action = "lambda:InvokeFunction"
function_name = aws_lambda_function.sample.function_name
principal = "scheduler.amazonaws.com"
source_arn = aws_scheduler_schedule.sample.arn
}