【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を聞く西村でした。







![Microsoft Power BI [実践] 入門 ―― BI初心者でもすぐできる! リアルタイム分析・可視化の手引きとリファレンス](/assets/img/banner-power-bi.c9bd875.png)
![Microsoft Power Apps ローコード開発[実践]入門――ノンプログラマーにやさしいアプリ開発の手引きとリファレンス](/assets/img/banner-powerplatform-2.213ebee.png)
![Microsoft PowerPlatformローコード開発[活用]入門 ――現場で使える業務アプリのレシピ集](/assets/img/banner-powerplatform-1.a01c0c2.png)


