フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

memory store for redis の maintenance window を Terraform で設定する

f:id:lirlia:20220113143145p:plain

Terraform の google provider 4.9.0 から memory store for redis の maintenance window が設定できるようになりました。

f:id:lirlia:20220202150934p:plain

複数の redis を構築する場合は、メンテナンスウインドウをすこしづつずらしたいと思うので工夫した Terraform コードを紹介します。

variables.tf

variable "maintenance_window" {
  description = <<-EOT
    作成する MemoryStore for Redis インスタンスのメンテナンスウインドウを指定します

    day: メンテナンスウインドウの対象となる曜日です(DAY_OF_WEEK_UNSPECIFIEDは時刻を指定する場合使用できません)
    start_time_utc: メンテナンスウインドウの実行時間です
    interval_hours: 複数の redis インスタンスが存在する場合、メンテナンスウインドウの開始時間をこの値だけずらします
    ※メンテナンスウインドウに指定された hours と interval_hours x (インスタンス数 - 1) の合計値が 24 未満になるようにしてください
    ※更新が完了するまでに要する時間は 30 分未満とのこと
    ※例: 3台存在し、火曜の13:00にメンテナンスウインドウを設定しインターバルが1時間の場合は以下のメンテナンスウインドウを設定します
     1台目: 火曜 13:00
     2台目: 火曜 14:00
     3台目: 火曜 15:00
  EOT

  type = object({
    day = string,
    start_time_utc = object({
      hours   = number
      minutes = number
      seconds = number
      nanos   = number
    }),
    interval_hours = number
  })

  default = {
    day = "MONDAY"
    start_time_utc = {
      hours   = 16 # JSTで火曜の AM 1時
      minutes = 0
      seconds = 0
      nanos   = 0
    }
    interval_hours = 1
  }

  validation {
    condition = can(
      contains(
        ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY"],
        var.maintenance_window.day
      )
    )
    error_message = "The maintenance_window.day argument is not a valid. must be set MONDAY / TUESDAY / WEDNESDAY / THURSDAY / FRIDAY / SATURDAY / SUNDAY."
  }
}

main.tf

※ 各var には適当な値を入れてください

resource "google_redis_instance" "redis_group" {
  count                   = var.number
  name                    = "${var.name}-${count.index + 1}"
  display_name            = "${var.display_name}-${count.index + 1}"
  tier                    = var.tier
  memory_size_gb          = var.memory
  region                  = var.region
  location_id             = var.location
  alternative_location_id = var.alternative_location
  authorized_network      = var.authorized_network
  redis_version           = var.redis_version
  reserved_ip_range       = var.ip_range

  maintenance_policy {
    weekly_maintenance_window {
      day = var.maintenance_window.day
      start_time {
        hours   = var.maintenance_window.start_time_utc.hours + (var.maintenance_window.interval_hours * count.index)
        minutes = var.maintenance_window.start_time_utc.minutes
        seconds = var.maintenance_window.start_time_utc.seconds
        nanos   = var.maintenance_window.start_time_utc.nanos
      }
    }
  }
}

ポイント

  • インスタンスが複数ある場合は interval_hours を設定することで時間をずらせます
  • 時間を指定する場合 DAY_OF_WEEK_UNSPECIFIED が使用できないので validation をかけて使用できないようにしています。