継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

Aurora Serverless V2 の ACU をスケジュール調整を Terraform で行う

タダです.

前回書いた記事の続編です.前回の記事ではAurora Serverless V2 ACU の変更を EventBridge Scheduler で変更する内容でしたが,手動変更の例でした.その後 Terraform でコード化したためその備忘録としてこの記事にまとめます.

sadayoshi-tada.hatenablog.com

結論

IAM ロール及びポリシーのコードは以下のとおりです.

data "aws_region" "current" {}
data "aws_caller_identity" "current" {}
data "aws_iam_policy_document" "scheduler_assume_role" {
  statement {
    effect = "Allow"
    principals {
      type        = "Service"
      identifiers = ["scheduler.amazonaws.com"]
    }
    actions = ["sts:AssumeRole"]
  }
}
data "aws_iam_policy_document" "rds_modify_cluster" {
  statement {
    effect = "Allow"
    actions = ["rds:ModifyDBCluster"]
    resources = [
      "arn:aws:rds:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:cluster:${var.aurora_cluster_name}"
    ]
  }
}
resource "aws_iam_role" "scheduler_role" {
  name               = "aurora-acu-schedule-role"
  assume_role_policy = data.aws_iam_policy_document.scheduler_assume_role.json
}
resource "aws_iam_role_policy" "rds_modify_role_policy" {
  name        = "aurora-acu-schedule-role-policy"
  policy      = data.aws_iam_policy_document.rds_modify_cluster.json
}

そして EventBridge Scheduler のリソースは以下のように作りました.例のスケジューラーは平日の7時にスケールアップして,平日17時にスケールダウンするよう実行されます.

resource "aws_scheduler_schedule" "scale_up" {
    name = "aurora-acu-scale-up-scheduler"
    group_name = "default"
    state = "ENABLED"
    schedule_expression = "cron(0 7 ? * MON-FRI *)"
    schedule_expression_timezone = "Asia/Tokyo"
    flexible_time_window {
      mode = "OFF"
    }
    target {
      arn = "arn:aws:scheduler:::aws-sdk:rds:modifyDBCluster"
      role_arn = aws_iam_role.scheduler_role.arn
      input = jsonencode({
        DbClusterIdentifier = var.aurora_cluster_name
        ServerlessV2ScalingConfiguration = {
           MinCapacity = 2.0
           MaxCapacity = 4.0
        }
      })
    }
}
resource "aws_scheduler_schedule" "scale_down" {
  name       = "aurora-acu-scale-down-scheduler"
  group_name = "default"
  state = "ENABLED"
  schedule_expression = "cron(0 17 ? * MON-FRI *)"
  schedule_expression_timezone = "Asia/Tokyo"
  flexible_time_window {
    mode = "OFF"
  }
  target {
    arn      = "arn:aws:scheduler:::aws-sdk:rds:modifyDBCluster"
    role_arn = aws_iam_role.scheduler_role.arn
    input = jsonencode({
      DbClusterIdentifier = var.aurora_cluster_name
      ServerlessV2ScalingConfiguration = {
        MinCapacity = 1.0
        MaxCapacity = 2.0
      }
    })
  }
}

まとめ

前回の手動実行した Aurora Serverless V2 の ACU 調整を Terraform のコード化する機会があったのでまとめました.