このページの本文へ

FIXER cloud.config Tech Blog

Terraformの日時指定を簡単にするフォーマットモジュールを自作した

2023年06月08日 09時00分更新

文● 西村凌/FIXER

  • この記事をはてなブックマークに追加
  • 本文印刷

 本記事は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 StoneOut of Controlを聞く西村でした。

西村凌/FIXER
四日市事業所所属のクラウドエンジニア。
趣味でFlutterやRustを勉強しているキーボードオタク

カテゴリートップへ