Lambda関数を定期実行できるようにTerraformでCloudWatch Eventsを構築しました
Terraformを使って、AWS CloudWatch Eventsを設定し、Lambda関数を毎日決まった時間に自動実行できるようにしました。
この設定を以前実装した天気情報を取得するLambdaと繋げることで、毎日指定した時間に天気情報がメールで送られるようになりました。
実行スケジュールはcronで記述し、tfvarsで外から実行時間を柔軟に変更できるようにしています。
CloudWatch Eventsの追加
CloudWatch Eventsを使ってLambda関数を定期実行できるように設定しました。スケジュールはtfvarsファイルから変更できるようにしています。
# variables.tf
variable "schedule_expression" {
description = "Cron expression for the CloudWatch event rule to trigger the Lambda function."
type = string
}
# 毎日スケジュール実行を行うためのCloudWatch Event Rule
resource "aws_cloudwatch_event_rule" "daily_trigger" {
name = "daily_lambda_trigger"
description = "Triggers Lambda function every day at 9:00 JST"
schedule_expression = var.schedule_expression # tfvarsからスケジュールを設定
}
# Lambdaを実行するための権限をCloudWatchに付与する
resource "aws_lambda_permission" "allow_cloudwatch_to_invoke" {
statement_id = "AllowExecutionFromCloudWatch"
action = "lambda:InvokeFunction"
function_name = aws_lambda_function.weather_checker.function_name
principal = "events.amazonaws.com"
source_arn = aws_cloudwatch_event_rule.daily_trigger.arn
}
# CloudWatch EventがトリガーするターゲットとしてLambdaを指定する
resource "aws_cloudwatch_event_target" "trigger_lambda" {
rule = aws_cloudwatch_event_rule.daily_trigger.name
target_id = "weather_checker_lambda_target"
arn = aws_lambda_function.weather_checker.arn
}
aws_cloudwatch_event_rule
CloudWatch EventsでLambda関数を定期実行するためのルールです。ここで指定したschedule_expressionにはcron式を使用し、スケジュールを設定しています。tfvarsから読み込むことで、外部から柔軟に設定を変更できるようにしています。
aws_lambda_permission
CloudWatch EventsがLambda関数をトリガーできるようにするための権限を設定しました。principalにCloudWatch Eventsのサービスevents.amazonaws.comを指定し、Lambda関数を実行できる権限を付与しています。
aws_cloudwatch_event_target
CloudWatch Event Ruleでトリガーされたイベントが、どのLambda関数を呼び出すかを指定しています。ruleには作成したaws_cloudwatch_event_ruleの名前を指定し、arnにLambda関数のARNを指定することで、指定のルールに従ってLambda関数が実行されます。
tfvarsでスケジュールを設定
terraform.tfvarsファイルを使用して、スケジュールを外から変更できるようにしました。毎日9:00 JSTに実行する場合の設定例は以下です。
schedule_expression = "cron(0 0 * * ? *)" # JSTで9:00にトリガー
これにより、schedule_expressionの値を変えるだけで簡単にスケジュールを調整できます。
cronでのスケジュールの設定
"cron(0 0 * * ? *)" というcron式は、UTCの00:00にLambda関数を実行します。これは、JST(日本標準時)の9:00に対応しています。AWS CloudWatch EventsはUTCを基準にしているため、JSTでの実行時間を設定する際には9時間の時差を考慮する必要があります。
例えば、次のようなスケジュールも設定できます:
9:00 JST(00:00 UTC) に実行する場合: cron(0 0 * * ? *)
12:00 JST(03:00 UTC) に実行する場合: cron(0 3 * * ? *)
結果
`terraform apply`コマンドでTerraformをデプロイして、CloudWatch Eventsが指定したcronスケジュールでLambda関数をトリガーし、その結果をSNS経由で通知する仕組みが正常に動作しました。
現時点ではツールとしての利便性はまだまだですが、決まったスケジュールでCloudWatch EventsがLambdaをトリガーする→Lambdaで何らかの処理を行う→処理結果をAmazon SNSで通知、という一連の流れをTerraformを使って構築できたので、今後もこの形を発展させていろいろ開発してみたいと思います。