本記事はFIXERが提供する「cloud.config Tech Blog」に掲載された「【Terraform】日時フォーマットモジュールで時間指定をコード化」を再編集したものです。
azurerm_automation_scheduleのstart_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 StoneのOut of Controlを聞く西村でした。
西村凌/FIXER
四日市事業所所属のクラウドエンジニア。
趣味でFlutterやRustを勉強しているキーボードオタク