問題: マルチリージョン構成で、複数のリソースの provider を変更するには、それらを個別に変更しなくてはいけない。
Terraformでは、aliasを使用してマルチリージョンに対するリソースなどの指定が可能。
リソースなどで参照する際には、provider = <PROVIDER NAME>.<ALIAS> として指定する。
resource "aws_instance" "foo" {
provider = aws.west
# ...
}
ここで、この <PROVIDER NAME>.<ALIAS> が曲者。
These references are special expressions. Like references to other named entities (for example, var.image_id), they aren't strings and don't need to be quoted. But they are only valid in specific meta-arguments of resource, data, and module blocks, and can't be used in arbitrary expressions.
これは文字列ではなく、${local.aliasname} などterratermの変数として渡すことができない。
そのため、そのままでは、複数のリソースの provider を変更するには、それらを個別に変更しなくてはいけない。
対応: YAMLで管理し、YAMLのアンカー、エイリアスを使用する
tfファイルをYAMLで管理し、使用前に.tf.json形式に変更して使用する運用とする。
rm *.tf.json
ls *.tf.yml | awk '{TO=$1; sub(/.tf.yml$/,".tf.json",TO); print "yq . "$1" > "TO}' | sh -x
その上で、YAMLのアンカー、エイリアスが使用可能。
例
provider:
ibm:
region: tok
alias: tok
provider:
ibm:
region: osa
alias: osa
上の内容は同じキーでことなる値のdictionaryとなっているので、単一のYAMLファイルとできない。
別ファイルとして、変換後の.tf.jsonファイルを同一ディレクトリーにおいておくことで、terraformが対応してくれる。
aliasの値はユーザーが決めて良いので、ここではregionと同じ値を使用。
locals:
provider-site1: &provider-site1 ibm.tok # YAMLアンカー
resource:
ibm_pi_instance:
ins-node4a:
provider: *provider-site1 # YAMLエイリアス
...
ins-node4b:
provider: *provider-site1 # YAMLエイリアス
...
yq .などによりJSONに変換すると、YAMLエイリアスによる指定箇所はYAMLアンカーで指定した値に変換される。
これにより、YAMLアンカーの行による指定のみで複数リソースに対するprovider指定を変換可能。
残念ながら、JSONにアンカー、エイリアスの様な機能はない様です。
tfファイルにはどうでしょう。