web-dev-qa-db-ja.com

文字列がテラフォーム補間で部分文字列を含むかどうかを確認するにはどうすればよいですか?

テラフォーム文字列に別の文字列が含まれているかどうかをどのように確認しますか?

たとえば、名前に「tmp」が含まれるterraformワークスペースを特別に扱いたい(たとえば、スナップショットなしでrdsインスタンスを削除できるようにする)ため、次のようにします。

locals
{
  is_tmp = "${"tmp" in terraform.workspace}"
}

私の知る限り、 substr補間関数 はこれを実現しません。

11
JDiMatteo

replace を使用して、部分文字列を間接的にチェックできます。

locals
{
  is_tmp = "${replace(terraform.workspace, "tmp", "") != terraform.workspace}"
}
19
JDiMatteo

Terraform 0.12.xxの場合、どうやらこれを行うには正規表現を使用するとします。

Terraform 0.12.XXのマニュアルから:

[ https://www.terraform.io/docs/configuration/functions/regexall.html] [1]

関連する抜粋:regexallは、特定の長さが特定の文字列と一致するかどうかをテストするためにも使用できます。結果の一致のリストはゼロより大きいです。

マニュアルの例:

> length(regexall("[a-z]+", "1234abcd5678efgh9"))
2

> length(regexall("[a-z]+", "123456789")) > 0
false

Terraform 0.12.xx構文でケースに適用される例は、次のようになります。

locals
{
  is_tmp = length(regexall(".*tmp.*", terraform.workspace)) > 0
}

また、マニュアルでは "regex"を使用せず、代わりにregexallを使用するように指示しています。

指定されたパターンがまったく一致しない場合、正規表現はエラーを発生させます。指定されたパターンが文字列と一致するかどうかをテストするには、regexallを使用して、結果の長さがゼロより大きいことをテストします。

上で述べたように、これは、プランを実行したときに現在出ていない0.12.xxの新しいバージョンでそれを使用しようとすると、実際には例外エラーが発生するためです。これが私がこれを見つけた方法であり、私がここに新しい回答を投稿した理由です。

6

スニペットのように replace(string、search、replace) を使用します。

// string contains ABBA = result is ABBA
output "match" {
  value = "${ replace("xxxABBAyyy", "/(?:.*)(ABBA)(?:.*)/", "$1") }"
}
// string doesn't contain ABBA = result is original string
output "no_match" {
  value = "${ replace("xxxBABAyyy", "/(?:.*)(ABBA)(?:.*)/", "$1")}"
}
// string contains ABBA (ingorecase) = result is AbBA
output "equals_ignorecase" {
  value = "${ replace("xxxAbBAyyy", "/(?:.*)((?i)ABBA)(?:.*)/", "$1")}"
}

terraform applyの出力は次のとおりです。

Outputs:

equals_ignorecase = AbBA
match = ABBA
no_match = xxxBABAyyy
0
Denis Kalinin

@MechaStorm with Terrafor 0.12.7+のように、文字列に特定のサブスクライブが含まれている場合、正規表現を使用してブール値を返すことができます

locals {
  is_tmp = contains(regex("^(?:.*(tmp))?.*$",terraform.workspace),"tmp")
}

Regexクエリは、tmpの前の文字、見つかった場合はtmp、tmpの後の文字のキャプチャグループのリストを返します。次に、リストで「tmp」を検索し、trueまたはfalseを返します。私は自分のテラフォームでこのタイプのログインを使用しています。

0
Scott Heath

Terraform 0.12.7では、 regex になります。これは、一部のコードを簡略化し、一部の人が読めるようにするのに役立ちます(たぶん?)

> regex("[a-z]+", "53453453.345345aaabbbccc23454")
aaabbbccc
0
MechaStorm