見出し画像

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経由で通知する仕組みが正常に動作しました。


スケジュール設定していた午前9時に天気情報がメールで届いた



現時点ではツールとしての利便性はまだまだですが、決まったスケジュールでCloudWatch EventsがLambdaをトリガーする→Lambdaで何らかの処理を行う→処理結果をAmazon SNSで通知、という一連の流れをTerraformを使って構築できたので、今後もこの形を発展させていろいろ開発してみたいと思います。

いいなと思ったら応援しよう!