vague memory

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

Terraform の集合演算

殆ど使う機会は無いですが、関数により違いがあったのでメモ。



題材

list 型の変数の要素に対して演算する例です。

variable "list" {
  default = [56, 27, 84, 13, 42]
}

output "count_value" {
  value = length(var.list)
}

output "sum_value" {
  value = sum(var.list)
}

output "min_value" {
  value = min(var.list...)
}

output "max_value" {
  value = max(var.list...)
}

結果

Outputs:

count_value = 5
max_value = 84
min_value = 13
sum_value = 222

Count

length 関数で取得します。

これは利用頻度がそれなりにある気がします。

length(var.list)

別の使い方として string を渡して文字数を取得することもできます。 ちなみに Terraform では count という関数は無く、別の意味を持ちます。 複数リソースを作成するための構文になります。参考: The count Meta-Argument

Sum

sum 関数で取得します。

sum(var.list)

Min / Max

min / max 関数で取得します。

Nurmeric Functions に分類され、1つ以上の number を渡して使うようになっています。
list を渡す場合は ... を末尾に付与する必要があります。

min(var.list...)
max(var.list...)

Average

avg や average 関数はありません。 使うケースも思い浮かばないです。

どうしても必要となったら自前関数を無理やり作ることになるのではと思います。

  • external 例
data "external" "avg" {
  program = ["python", "./calc_avg.py"]
  query = {
    values = join(",", var.list)
  }
}

output "avg_value" {
  value = tonumber(data.external.avg.result.avg)
}
import sys
import json
import numpy

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

values = input_json.get('values', "").split(",")
avg = numpy.average([int(i) for i in values])

output = {
    'avg': str(avg),
}

print(json.dumps(output, indent=2))
  • 結果
Outputs:

avg_value = 44.4