【Terraform】自作の日時フォーマットモジュールで時間指定をコード化
2023-05-22
azblob://2023/05/19/eyecatch/2023-05-22-terraform-time-formatter--iso8601-000.jpg

azurerm_automation_schedulestart_time プロパティをはじめ、Terraformは日時を指定するときにISO8601(日付と時刻の国際規格)で指定します。 公式はformatdate Functionしか提供しておらず、使いどころが難しいので自作の次のxx曜日yy時zz分 を自動整形してくれるTerraformのモジュールを紹介したいと思います。

日時フォーマットモジュール

以下に実行サンプルを提示します。

module "mo_next_monday" {
  source = "<モジュールへのパス>"

  day_of_week = "Monday"
  time = "09:00:00"
}

====
(参照方法)
module.mo_next_monday.time

上記のサンプルは「次の月曜日 09:00:00」をISO8601 形式で出力します。

variables.tf

variable "day_of_week" {
  type = string
}

variable "time_zone" {
  type    = string
  default = "Asia/Tokyo"
}

variable "time" {
  type    = string
  default = "00:00:00"
}
  • day_of_week: 曜日
  • time_zone: タイムゾーン
  • time: 時間

を代入します。

main.tf

locals {
  time_difference = {
    "Asia/Tokyo" = "+09:00"
  }
  text_to_number_day_of_week = {
    "Sunday"    = 0,
    "Monday"    = 1,
    "Tuesday"   = 2,
    "Wednesday" = 3,
    "Thursday"  = 4,
    "Friday"    = 5,
    "Saturday"  = 6,
  }

  current_timestamp   = timestamp()
  current_day_of_week = local.text_to_number_day_of_week[formatdate("EEEE", local.current_timestamp)]

  diffrence_day = local.text_to_number_day_of_week[var.day_of_week] - local.current_day_of_week
  days          = local.diffrence_day >= 0 ? local.diffrence_day : 6 + local.diffrence_day

  next_date = formatdate("YYYY-MM-DD", timeadd(local.current_timestamp, "${local.days * 24}h"))
}

HCLはswitch文を提供していないため、mapで代用しています。 実行日を基準に目的の曜日を算出し、timestampを整形します。

output.tf

output "time" {
  value = format("%sT${var.time}${local.time_difference[var.time_zone]}", local.next_date)
}

main.tf で算出したtimestampを基準に時間とタイムゾーンを上書きします。 これにより、次のxx曜日yy時zz分 を作り出すことができます。

最後に

今回はIaC実装時の鬼門(?)である日時指定処理の効率化方法をご紹介しました。 「IaCでリソース作成後、GUIで日時設定を行う」という構築手順が見かけますが、今回の方法を使えば完全自動化で効率的に業務が行えるのではないでしょうか?

以上、最近目覚めのコーヒーとセットでNothing's Carved In StoneOut of Controlを聞く西村でした。