Terraform はその言語である HCLがシンプルで分かりやすいのでとっつきやすい、と言われることがあります。 一方で、組み込み関数であれこれある割に、これがないの!? というのもあります。
そのなくてたびたび困るのが、startswith
と endswith
関数です。
tl;dr;
- startswith と endswith をビルトイン関数に入れるPR が先ほどマージされたので、Terraform のリリースにいつ入るか楽しみ (ETAは不明)
- これで
startswith("hello world", "hello")
やendswith("hello world", "world")
が書けるようになる
Terraform の組み込み関数
Terraform には組み込み関数 がありますが、バージョンが積み重なっても関数が増えることが少ない印象があります。
どんな関数があるかというのは、 Build-in Functions を見るといいでしょう。
startswith や endswith は組み込み関数に存在しない
この中で String Functions = 文字列操作の関数を見ると、StartsWith
や EndsWith
に相当する関数がないことに気づきます。
ないのでどうするかというと、regex
や substr
や trimprefix
/trimsuffix
あたりでやられることが多いと思います。1
# regex での startswith 代わり can(regex("^vpc-", var.vpc-id)) # substr での startswith 代わり substr(var.domain2, 0, length(var.domain1) + 1) == "${var.domain1}." # trimprefix での startswith 代わり trimprefix(var.domain2, var.domain1) != var.domain2
これでもいいという意見もありそうですが、さすがに startswith
で済むものを流し読みしにくい感じで書かれてもうれしくないものです。
# startswith があればこれでいい startswith(var.vpc-id, "vpc-") startswith(var.domain2, var.domain1)
ということで Issue が 2021年には立っていたのですが、そこそこスルーされていました。
別の Issueですが、開発チームとしては従来のやり方でできるなら足したくないという意向があるようです。
startswith
でもそれが適用されるのは、あんまりな気もしますがそういう方針なのでしょう。この方針ならとあきらめてました。
We're being pretty cautious about adding new functions that overlap with existing use-cases because Terraform has grown quite an unwieldy collection of builtins over the years, and so we've been considering various ways to allow for externally-defined functions (e.g. #2771) to avoid continuing to grow that set. https://github.com/hashicorp/terraform/issues/28855#issuecomment-856345294
組み込み関数として入れる意向とPRマージ
突然、startswith
と endswith
は組み込み関数に足すのはありという方向に変わります。
I took your comments back to the team, and we revisited this particular decision. We do not need to wait for a function provider framework for these functions. In this case, startswith and endswith meet a sufficiently wide use case need to be considered for built-in functions. https://github.com/hashicorp/terraform/issues/28209#issuecomment-1123022185 より引用
ということでPRが提案され、2022/July/15 にマージされています。
これにより、次か近いバージョンで startswith
、endswith
が使えるようになりそうです。
ヤッター。
おまけ: カスタム関数という道
Issue で知ったんですが、プラグインでカスタム関数を入れるという提案が 2015年から放置されていたりするんですね。 あったとしても、HCL ではあんまり使いたくない気もしますがどうなんでしょう。
- 例を書いておいてなんですが、やっぱりひどい。↩