Amazon-CloudWatch

Terraform組み込み関数(split/element/replace)

はじめに

こんにちは、ディーネットの牛山です。

Terraformを利用し構築をする際に便利だと思ったTerraform組み込み関数について紹介します。

今回、紹介する組み込み関数は次の通りです。

組み込み関数名 概要
split 指定された文字列を区切り文字に従ってすべての出現箇所で分割してリストを生成します。
element 配列のリストから指定された添字(インデックス)番号を指定し、要素を取り出します。
replace 指定された文字列内で別の指定された部分文字列を検索し、各出現箇所を指定された置換文字列に置き換えます。

文字面だけだと想像しづらいので実際のユースケースとともに紹介します。

ユースケース

ユースケース:CloudWatchアラームにアプリケーションロードバランサーのHealthyHostCount監視(正常と見なされるターゲットの数)を監視したい。

監視する場合、メトリクスディメンションとして次の形式で指定する必要があります。

ディメンション 説明
LoadBalancer ロードバランサーでメトリックデータをフィルター処理します。
app/load-balancer-name/1234567890123456 (ロードバランサーARNの最後の部分) のように指定します。
TargetGroup ターゲットグループ別にメトリックデータをフィルタリングします。
ターゲットグループを次のように指定します。
targetgroup/target-group-name/1234567890123456 (ターゲットグループARNの最後の部分) 。

Terraformにて、ロードバランサーおよびターゲットグループのid属性で参照すると次のような「ARN (Amazon Resource Name)」形式で取得できますが、ディメンションとして渡す形式になっていないため、整形する必要があります。


LoadBalancer: arn:aws:elasticloadbalancing:ap-northeast-1:AWSアカウントID12桁:loadbalancer/app/ロードバランサー名/1234567890123456

TargetGroup: arn:aws:elasticloadbalancing:ap-northeast-1:AWSアカウントID12桁:targetgroup/ターゲットグループ名/1234567890123456


ここで役立つのが今回、紹介する組み込み関数でこちらを使用して整形することによって動的に監視設定することが可能となります。

Terraformコード

ディメンションに渡す部分を抜粋して解説します。

dimensions = {
    TargetGroup = element(split(":", aws_lb_target_group.ターゲットグループ.id), 5)
    LoadBalancer = replace(element(split(":", aws_lb.ロードバランサー.id), 5), "loadbalancer/", "")
}

LoadBalancerはTargetGroupの応用なのでLoadBalancer部分の解説となります。

ステップⅠ split関数

split関数の区切り文字として「:」を指定し配列要素として分割します。

分割されると次のようになります。

添字(インデックス) 要素(値)
0 arn
1 aws
2 elasticloadbalancing
3 ap-northeast-1
4 AWSアカウントID12桁
5 loadbalancer/app/ロードバランサー名/1234567890123456

5番目の添字に今回、ディメンションとして渡したい値が入っていますが、 app 以降の値を渡す必要がありますので置き替えにて対応します。

ステップⅡ element関数

split関数で分割された配列の 添字(インデックス) 番号指定要素(値) を取得します。

5番目の添字(インデックス)に目的の値が入っているのこの添字番号を指定して取得できるのがelement関数の機能になります。

ステップⅢ replace関数

element関数で取得した値をもとに、 loadbalancer/ に合致する文字列を、 ""(空文字列)に置換すると次のようになります。

app/ロードバランサー名/1234567890123456

これで、動的にロードバランサーを監視でき、長いARNの中から渡す引数を探す必要がなくなります。

おわりに

いかがでしたでしょうか。

とても便利です。

また、便利な組み込み関数があれば、紹介します。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA