Terraform の google provider 4.9.0 から memory store for redis の maintenance window が設定できるようになりました。
複数の 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
をかけて使用できないようにしています。