vague memory

うろ覚えを無くしていこうともがき苦しむ人の備忘録

Terraform 日時文字列とUnixtimeの相互変換

Unixtime(epoch) と 日時文字列 との変換をTerraformで行う方法を調べました。



Built-in Functions

Terraform 内での日時は、RFC 3339 形式 (YYYY-MM-DD'T'hh:mm:ssZ) に沿った形で扱うようです。

formatdate function が用途に合ってそうですが、日時文字列とUnixtime の変換機能は有りません。

使用例

locals {
  now = timestamp()
}

output "o11-timestamp" {
  value = local.now
}

output "o12-timestamp-jst" {
  value = formatdate("YYYY/MM/DD hh:mm:ss", timeadd(local.now, "9h"))
}

# ---
Outputs:

o11-timestamp = "2022-08-20T08:06:19Z"
o12-timestamp-jst = "2022/08/20 17:06:19"

日時文字列 -> Unixtime

Time Provider の time_static resource で実現できます。

使用例

YYYY-MM-DD'T'hh:mm:ssZ を渡すと、分割した値(year, month, day, ...)や Unixtime (unix) を属性として持つことができます。

resource "time_static" "mountain_day" {
  rfc3339 = "2022-08-11T00:00:00Z"
}

output "o21-mountain_day" {
  value = time_static.mountain_day
}

resource "time_static" "mountain_day_jst" {
  rfc3339 = "2022-08-11T00:00:00+09:00"
}

output "o22-mountain_day_jst" {
  value = time_static.mountain_day_jst.unix
}

# ---
Outputs:

o21-mountain_day = {
  "day" = 11
  "hour" = 0
  "id" = "2022-08-11T00:00:00Z"
  "minute" = 0
  "month" = 8
  "rfc3339" = "2022-08-11T00:00:00Z"
  "second" = 0
  "triggers" = tomap(null) /* of string */
  "unix" = 1660176000
  "year" = 2022
}
o22-mountain_day_jst = 1660143600

Unixtime -> 日時文字列

time_static resource も formatdate function 同様、入力がRFC3339形式のみなので対応していません。 残念ながら現状では Terraform の標準機能・Providerでは実現できないようです。

仕方がないので External Data Source でお茶を濁します。

import sys
import json
import datetime

input = sys.stdin.read()
input_json = json.loads(input)

epoch = int(input_json.get('epoch', 0))
dt = datetime.datetime.fromtimestamp(epoch, datetime.timezone.utc)

output = {
    'iso': dt.isoformat()
}

print(json.dumps(output, indent=2))

使用例

data "external" "mountain_day" {
  program = ["python", "./epoch.py"]
  query = {
    epoch = time_static.mountain_day.unix
  }
}

output "o31-mountain_day" {
  value = data.external.mountain_day.result
}

data "external" "mountain_day_jst" {
  program = ["python", "./epoch.py"]
  query = {
    epoch = time_static.mountain_day_jst.unix
  }
}

output "o32-mountain_day_jst" {
  value = data.external.mountain_day_jst.result.iso
}

# ---
Outputs:

o31-mountain_day = tomap({
  "iso" = "2022-08-11T00:00:00+00:00"
})
o32-mountain_day_jst = "2022-08-10T15:00:00+00:00"